#!/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 Feature.cs DB model class cat > $dir/Models/$feature_name.cs<< EOF using System; namespace $project_name.Data.Models { public class $feature_name { public Guid Id { get; set; } $( for feature in "${features[@]}"; do echo -e "\t\tpublic $feature { get; set; }" done ) } } EOF # Add the DbSet of the Feature 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 "11 i \\\t\t$dbset\n" $dbcontext_path fi fi #=== Add to Service layer dir="../$project_name/Services" # Create Service cat > $dir/${feature_name}Service.cs<< EOF using System; using System.Threading.Tasks; using AutoMapper; using $project_name.Data; using $project_name.Data.Models; using $project_name.Services.Models; namespace $project_name.Services { public class ${feature_name}Service { private readonly IMapper _autoMapper; private readonly ${project_name}Context _context; public ${feature_name}Service(IMapper autoMapper, ${project_name}Context context) { this._autoMapper = autoMapper; this._context = context; } public async Task CreateAsync(Create${feature_name}ServiceModel create${feature_name}ServiceModel) { $feature_name new$feature_name = this._autoMapper.Map<$feature_name>(create${feature_name}ServiceModel); await this._context.${feature_name}s .AddAsync(new$feature_name); return await this.SaveChangesAsync(); } public async Task<${feature_name}ServiceModel> GetByIdAsync(Guid id) { $feature_name curr$feature_name = await this._context.${feature_name}s .FindAsync(id); return this._autoMapper.Map<${feature_name}ServiceModel>(curr$feature_name); } public async Task EditAsync(Edit${feature_name}ServiceModel edit${feature_name}ServiceModel) { $feature_name curr$feature_name = this._autoMapper.Map<$feature_name>(edit${feature_name}ServiceModel); this._context.Update(curr$feature_name); return await this.SaveChangesAsync(); } public async Task DeleteAsync(Guid id) { $feature_name curr$feature_name = await this._context.${feature_name}s .FindAsync(id); this._context.Remove(curr$feature_name); return await this.SaveChangesAsync(); } private async Task SaveChangesAsync() { return await this._context.SaveChangesAsync() >= 1; } } } EOF # Create Service Models subdir="${dir}/Models" models=("" "Create" "Edit") for model in "${models[@]}" do cat > $subdir/$model${feature_name}ServiceModel.cs<< EOF using System; namespace $project_name.Services.Models { public class $model${feature_name}ServiceModel {$( if [ ! -z $model ]; then echo -e "\n\t\tpublic Guid Id { get; set; }" fi ) $( for feature in "${features[@]}"; do echo -e "\t\tpublic $feature { get; set; }" done ) } } EOF done # Create Service Mappings subdir="${dir}/Configurations" mappings=("Create${feature_name}ServiceModel, $feature_name" "$feature_name, ${feature_name}ServiceModel" "Edit${feature_name}ServiceModel, $feature_name") cat > $subdir/${feature_name}Mappings.cs<< EOF using AutoMapper; using $project_name.Data.Models; using $project_name.Services.Models; namespace $project_name.Services.Configurations { public class ${feature_name}Mappings : Profile { public ${feature_name}Mappings() { $( for map in "${mappings[@]}"; do echo -e "\t\t\tCreateMap<$map>();" done ) } } } EOF