#!/bin/bash
if [ -z "$1" ] || [ -z "$2" ]; then
echo "No name supplied!"
exit
fi
project_name="$1"
feature_name="$2"
features=("${@:3}")
if [ -z features ]; then
features=("string Name")
fi
# {{{ =============================>
# Add to Data layer
dir="../$project_name/Data"
# {{{ --------------------------->
# Create the DB model class
cat > $dir/Models/$feature_name.cs<< EOF
using System;
namespace $project_name.Data.Models
{
public class $feature_name : BaseModel
{
$(
for feature in "${features[@]}"; do
echo -e "\t\tpublic $feature { get; set; }"
done
)
}
}
EOF
# }}} ---------------------------<
# {{{ --------------------------->
# Add the DbSet to DbContext
dbset="public DbSet<$feature_name> ${feature_name}s { get; set; }"
dbcontext_path="$dir/${project_name}Context.cs"
if ! grep -q "$dbset" "$dbcontext_path"; then
if grep -Fq "DbSet" $dbcontext_path; then
sed -z -i "s/.*DbSet[^\n]*\n/&\t\t$dbset\n/" $dbcontext_path
else
sed -i "14 i \\\t\t$dbset\n" $dbcontext_path
fi
fi
# }}} ---------------------------<
# }}} =============================<
# {{{ =============================>
# Add to Service layer
dir="../$project_name/Services"
# {{{ --------------------------->
# Create Service and Interface
cat > $dir/Interfaces/I${feature_name}Service.cs<< EOF
using $project_name.Data.Models;
using $project_name.Services.Models.$feature_name;
namespace $project_name.Services.Interfaces
{
public interface I${feature_name}Service : IBaseService<${feature_name}, ${feature_name}ServiceModel>
{ }
}
EOF
cat > $dir/Services/${feature_name}Service.cs<< EOF
using $project_name.Services.Interfaces;
using System;
using AutoMapper;
using $project_name.Data;
using $project_name.Data.Models;
using $project_name.Services.Models.$feature_name;
namespace $project_name.Services.Services
{
public class ${feature_name}Service : BaseService<${feature_name}, ${feature_name}ServiceModel>, I${feature_name}Service
{
public ${feature_name}Service(IMapper autoMapper, ${project_name}Context context)
:base(autoMapper, context)
{ }
}
}
EOF
# }}} ---------------------------<
# {{{ --------------------------->
# Create Service Model
subdir="$dir/Models/$feature_name"
mkdir -p $subdir
cat > $subdir/$model${feature_name}ServiceModel.cs<< EOF
using System;
using $project_name.Services.Models;
namespace $project_name.Services.Models.$feature_name
{
public class $model${feature_name}ServiceModel : BaseServiceModel
{
$(
for feature in "${features[@]}"; do
echo -e "\t\tpublic $feature { get; set; }"
done
)
}
}
EOF
# }}} ---------------------------<
# {{{ --------------------------->
# Create Service Mappings
subdir="${dir}/Configurations"
mappings=("${feature_name}ServiceModel, $feature_name" "${feature_name}, ${feature_name}ServiceModel")
cat > $subdir/Service${feature_name}Mappings.cs<< EOF
using AutoMapper;
using $project_name.Data.Models;
using $project_name.Services.Models.$feature_name;
namespace $project_name.Services.Configurations
{
public class Service${feature_name}Mappings : Profile
{
public Service${feature_name}Mappings()
{
$(
for map in "${mappings[@]}"; do
echo -e "\t\t\tCreateMap<$map>();"
done
)
}
}
}
EOF
# }}} ---------------------------<
# }}} =============================<
# {{{ =============================>
# Add to Web layer
dir="../$project_name/Web"
# {{{ --------------------------->
# Add the dependency injection of the Service class
startup_path="$dir/Startup.cs"
service_name="${feature_name}Service"
if ! grep -q "$service_name" "$startup_path"; then
sed -z -i "s/.*AddTransient[^\n]*\n/&\t\t\tservices.AddTransient();\n/" $startup_path
fi
# }}} ---------------------------<
# {{{ --------------------------->
# Create View Models
subdir="$dir/Models/$feature_name"
mkdir -p $subdir
models=("" "Create" "Edit")
for model in "${models[@]}"
do
cat > $subdir/$model${feature_name}WebModel.cs<< EOF
using System;$(
if [ "$model" != "Create" ]; then
echo -e "\nusing $project_name.Web.Models;"
fi
)
namespace $project_name.Web.Models.$feature_name
{
public class $model${feature_name}WebModel$(
if [ "$model" != "Create" ]; then
echo -e ' : BaseWebModel'
fi
)
{
$(
for feature in "${features[@]}"; do
echo -e "\t\tpublic $feature { get; set; }"
done
)
}
}
EOF
done
# }}} ---------------------------<
# {{{ --------------------------->
# Update View Imports
viewimports_path="$dir/Views/_ViewImports.cshtml"
import_name="$project_name.Web.Models.$feature_name"
if ! grep -q "$import_name" "$viewimports_path"; then
sed -z -i "s/.*@using[^\n]*\n/&@using $import_name\n/" $viewimports_path
fi
# }}} ---------------------------<
# {{{ --------------------------->
# Create Views
subdir="$dir/Views/$feature_name"
mkdir -p $subdir
cat > $subdir/Index.cshtml<< EOF
@model IEnumerable<${feature_name}WebModel>
@{
ViewData["Title"] = "${feature_name}s";
}
Couldn't create ${feature_name}!
} EOF cat > $subdir/Edit.cshtml<< EOF @model Edit${feature_name}WebModel @{ ViewData["Title"] = "Editing $feature_name"; } @if (Model != null) {Couldn't edit ${feature_name}!
} EOF cat > $subdir/Delete.cshtml<< EOF @{ ViewData["Title"] = "Deleting $feature_name"; }Are you sure you want to delete this $feature_name?
EOF # }}} ---------------------------< # {{{ ---------------------------> # Create Controller subdir="$dir/Controllers" cat > $subdir/${feature_name}Controller.cs<< EOF using System; using System.Threading.Tasks; using AutoMapper; using $project_name.Services.Interfaces; using $project_name.Services.Models.$feature_name; using $project_name.Web.Models.$feature_name; using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; using System.Linq; namespace $project_name.Web.Controllers { public class ${feature_name}Controller : Controller { private readonly IMapper _autoMapper; private readonly I${feature_name}Service _service; public ${feature_name}Controller(IMapper autoMapper, I${feature_name}Service service) { this._autoMapper = autoMapper; this._service = service; } [HttpGet] public async Task