private async Task CreateModelComponent(string projectFolder, ProjectDataModelDto model) { var modelName = model.Name.Kebaberize(); await CommandHelper.ExecuteShellCommand($"ng generate component {modelName}", projectFolder, _logger); string componentFolder = Path.Combine(projectFolder, "src/app", modelName); if (File.Exists(Path.Combine(componentFolder, $"{modelName}.component.ts"))) { var content = await LoadFile(Path.Combine(AssemblyDirectory, "Template/app/model", "model.component.ts")); content = content.Replace("$ModelName$", modelName); content = content.Replace("$ModelClassName$", model.Name); var sb = new StringBuilder(); foreach (var property in model.Properties) { var propertyName = property.Name.Camelize(); sb.Append($"'{propertyName}', "); } content = content.Replace("$PropertyList$", sb.ToString()); await File.WriteAllTextAsync(Path.Combine(componentFolder, $"{modelName}.component.ts"), content); } if (File.Exists(Path.Combine(componentFolder, $"{modelName}.component.css"))) { var content = await LoadFile(Path.Combine(AssemblyDirectory, "Template/app/model", "model.component.css")); await File.WriteAllTextAsync(Path.Combine(componentFolder, $"{modelName}.component.css"), content); } if (File.Exists(Path.Combine(componentFolder, $"{modelName}.component.html"))) { var content = await LoadFile(Path.Combine(AssemblyDirectory, "Template/app/model", "model.component.html")); var sb = new StringBuilder(); foreach (var property in model.Properties) { var propertyName = property.Name.Camelize(); sb.AppendLine($"<!-- {property.Name} column -->"); sb.AppendLine($"<ng-container matColumnDef=\"{propertyName}\">"); sb.AppendLine($"<th mat-header-cell *matHeaderCellDef mat-sort-header>{property.Label}</th>"); sb.AppendLine($"<td mat-cell *matCellDef=\"let row\">{{{{row.{propertyName}}}}}</td>"); sb.AppendLine("</ng-container>"); } content = content.Replace("$ColumnDefinition$", sb.ToString()); await File.WriteAllTextAsync(Path.Combine(componentFolder, $"{modelName}.component.html"), content); } }
public ModelCommandTests(ITestOutputHelper output) { _output = output; var projects = new List <ProjectDto> { new ProjectDto { Id = 1, Name = "Project 1" } }; var projectModels = new List <ProjectDataModelDto> { new ProjectDataModelDto { Id = 1, ProjectId = 1, Name = "Product" } }; _console = new TestConsole(output); _projectService = new Mock <IProjectService>(); _projectService.Setup(p => p.GetProjectByName(It.IsAny <string>())).ReturnsAsync((string name) => projects.FirstOrDefault(p => p.Name == name)); _projectModelService = new Mock <IProjectDataModelService>(); _projectModelService.Setup(p => p.CreateProjectDataModel(It.IsAny <int>(), It.IsAny <CreateProjectDataModelDto>())).ReturnsAsync((int projectId, CreateProjectDataModelDto dto) => { var newProjectDataModel = new ProjectDataModelDto { Id = 2, ProjectId = projectId, Name = dto.Name, Description = dto.Description, Label = dto.Label }; projectModels.Add(newProjectDataModel); return(newProjectDataModel); }); _projectModelService.Setup(p => p.GetProjectDataModels(It.IsAny <int>(), It.IsAny <bool>())).ReturnsAsync(projectModels); _projectModelService.Setup(p => p.GetProjectDataModelByName(It.IsAny <int>(), It.IsAny <string>())).ReturnsAsync((int projectId, string name) => projectModels.FirstOrDefault(p => p.ProjectId == projectId && p.Name == name)); _helpContextService = new Mock <IHelpContextService>(); }
private void GenerateRepositoryInterface(ProjectDataModelDto model) { var sb = new StringBuilder(); sb.AppendLine($"using {Name}.Entities;"); sb.AppendLine(); sb.AppendLine($"namespace {Name}.Repositories"); sb.AppendLine("{"); sb.AppendLine($" public interface I{model.Name}Repository: IRepository<{model.Name}>"); sb.AppendLine(" {"); sb.AppendLine(" }"); sb.AppendLine("}"); sb.AppendLine(); _projectHelper.AddFileToProject(Name, $"Repositories/I{model.Name}Repository.cs", sb.ToString(), modelId: model.Id); }
private void GenerateModel(ProjectDataModelDto model) { var sb = new StringBuilder(); sb.AppendLine("using System;"); sb.AppendLine("using System.Collections.Generic;"); sb.AppendLine(); sb.AppendLine($"namespace {Name}.Entities"); sb.AppendLine("{"); sb.AppendLine($" public class {model.Name} : BaseEntity"); sb.AppendLine(" {"); foreach (var property in model.Properties) { if (_baseProperties.Contains(property.Name)) { continue; } if (!string.IsNullOrEmpty(property.RelatedProjectDataModelName)) { if (property.RelationalType == PropertyRelationalType.OneToOne) { sb.AppendLine($" public int{(property.IsRequired ? "" : "?")} {property.Name}Id {{ get; set; }}"); sb.AppendLine($" public {property.RelatedProjectDataModelName} {property.Name} {{ get; set; }}"); } else if (property.RelationalType == PropertyRelationalType.OneToMany) { sb.AppendLine($" public ICollection<{property.RelatedProjectDataModelName}> {property.Name} {{ get; set; }}"); } else if (property.RelationalType == PropertyRelationalType.ManyToMany) { // TODO: Implement this later as many-to-many relationship in ef core is not straightforward } } else { var nullable = property.IsRequired || property.DataType == PropertyDataType.String ? "" : "?"; sb.AppendLine($" public {property.DataType}{nullable} {property.Name} {{ get; set; }}"); } } sb.AppendLine(" }"); sb.AppendLine("}"); _projectHelper.AddFileToProject(Name, $"Entities/{model.Name}.cs", sb.ToString(), modelId: model.Id); }
private void GenerateServiceInterface(ProjectDataModelDto model) { var sb = new StringBuilder(); sb.AppendLine($"using System.Collections.Generic;"); sb.AppendLine($"using System.Threading;"); sb.AppendLine($"using System.Threading.Tasks;"); sb.AppendLine($"using {Name}.Entities;"); sb.AppendLine(); sb.AppendLine($"namespace {Name}.Services"); sb.AppendLine("{"); sb.AppendLine($" public interface I{model.Name}Service"); sb.AppendLine(" {"); sb.AppendLine($" Task<{model.Name}> Get{model.Name}ById(int id, CancellationToken cancellationToken = default(CancellationToken));"); sb.AppendLine($" Task<List<{model.Name}>> Get{TextHelper.Pluralize(model.Name)}(CancellationToken cancellationToken = default(CancellationToken));"); sb.AppendLine($" Task<int> Create{model.Name}({model.Name} entity, CancellationToken cancellationToken = default(CancellationToken));"); sb.AppendLine($" Task Update{model.Name}({model.Name} entity, CancellationToken cancellationToken = default(CancellationToken));"); sb.AppendLine($" Task Delete{model.Name}(int id, CancellationToken cancellationToken = default(CancellationToken));"); sb.AppendLine(" }"); sb.AppendLine("}"); sb.AppendLine(); _projectHelper.AddFileToProject(Name, $"Services/Interface/I{model.Name}Service.cs", sb.ToString(), modelId: model.Id); }
private void GenerateServiceClass(ProjectDataModelDto model) { var camelizedName = TextHelper.Camelize(model.Name); var sb = new StringBuilder(); sb.AppendLine($"using System.Collections.Generic;"); sb.AppendLine($"using System.Linq;"); sb.AppendLine($"using System.Threading;"); sb.AppendLine($"using System.Threading.Tasks;"); sb.AppendLine($"using {Name}.Entities;"); sb.AppendLine($"using {Name}.Repositories;"); sb.AppendLine(); sb.AppendLine($"namespace {Name}.Services"); sb.AppendLine("{"); sb.AppendLine($" public class {model.Name}Service : I{model.Name}Service"); sb.AppendLine(" {"); sb.AppendLine($" private readonly I{model.Name}Repository _{camelizedName}Repository;"); sb.AppendLine(); sb.AppendLine($" public {model.Name}Service(I{model.Name}Repository {camelizedName}Repository)"); sb.AppendLine(" {"); sb.AppendLine($" _{camelizedName}Repository = {camelizedName}Repository;"); sb.AppendLine(" }"); sb.AppendLine(); sb.AppendLine($" public async Task<{model.Name}> Get{model.Name}ById(int id, CancellationToken cancellationToken = default(CancellationToken))"); sb.AppendLine(" {"); sb.AppendLine($" cancellationToken.ThrowIfCancellationRequested();"); sb.AppendLine(); sb.AppendLine($" return await _{camelizedName}Repository.GetById(id, cancellationToken);"); sb.AppendLine(" }"); sb.AppendLine(); sb.AppendLine($" public async Task<List<{model.Name}>> Get{TextHelper.Pluralize(model.Name)}(CancellationToken cancellationToken = default(CancellationToken))"); sb.AppendLine(" {"); sb.AppendLine($" cancellationToken.ThrowIfCancellationRequested();"); sb.AppendLine(); sb.AppendLine($" return await _{camelizedName}Repository.GetAll(cancellationToken);"); sb.AppendLine(" }"); sb.AppendLine(); sb.AppendLine($" public async Task<int> Create{model.Name}({model.Name} entity, CancellationToken cancellationToken = default(CancellationToken))"); sb.AppendLine(" {"); sb.AppendLine($" cancellationToken.ThrowIfCancellationRequested();"); sb.AppendLine(); sb.AppendLine($" return await _{camelizedName}Repository.Create(entity, cancellationToken);"); sb.AppendLine(" }"); sb.AppendLine(); sb.AppendLine($" public async Task Update{model.Name}({model.Name} updatedEntity, CancellationToken cancellationToken = default(CancellationToken))"); sb.AppendLine(" {"); sb.AppendLine($" cancellationToken.ThrowIfCancellationRequested();"); sb.AppendLine(); sb.AppendLine($" var entity = await _{camelizedName}Repository.GetById(updatedEntity.Id, cancellationToken);"); foreach (var property in model.Properties) { sb.AppendLine($" entity.{property.Name} = updatedEntity.{property.Name};"); if (property.RelationalType == PropertyRelationalType.OneToOne) { sb.AppendLine($" entity.{property.Name}Id = updatedEntity.{property.Name}Id;"); } } sb.AppendLine($" await _{camelizedName}Repository.Update(entity, cancellationToken);"); sb.AppendLine(" }"); sb.AppendLine(); sb.AppendLine($" public async Task Delete{model.Name}(int id, CancellationToken cancellationToken = default(CancellationToken))"); sb.AppendLine(" {"); sb.AppendLine($" cancellationToken.ThrowIfCancellationRequested();"); sb.AppendLine(); sb.AppendLine($" await _{camelizedName}Repository.Delete(id, cancellationToken);"); sb.AppendLine(" }"); sb.AppendLine(); sb.AppendLine(" }"); sb.AppendLine("}"); sb.AppendLine(); _projectHelper.AddFileToProject(Name, $"Services/{model.Name}Service.cs", sb.ToString(), modelId: model.Id); }
private async Task CreateModelDataSource(string projectFolder, ProjectDataModelDto model) { var modelName = model.Name.Kebaberize(); var componentFolder = Path.Combine(projectFolder, "src/app", modelName); var content = await LoadFile(Path.Combine(AssemblyDirectory, "Template/app/model", "model-datasource.ts")); var sb = new StringBuilder(); foreach (var property in model.Properties) { var propertyName = property.Name.Camelize(); string propertyType; switch (property.DataType) { case PropertyDataType.String: propertyType = "string"; break; case PropertyDataType.Integer: case PropertyDataType.Short: case PropertyDataType.Float: case PropertyDataType.Decimal: case PropertyDataType.Double: propertyType = "number"; break; case PropertyDataType.Boolean: propertyType = "boolean"; break; default: propertyType = "any"; break; } sb.AppendLine($"{propertyName}: {propertyType};"); } content = content.Replace("$ModelDefinition$", sb.ToString()); sb = new StringBuilder(); for (var i = 0; i < 10; i++) { sb.Append("{"); foreach (var property in model.Properties) { var propertyName = property.Name.Camelize(); sb.Append($"{propertyName}: {GetRandomData(property.DataType)}, "); } sb.Append("},"); sb.AppendLine(); } content = content.Replace("$ModelDummyData$", sb.ToString()); sb = new StringBuilder(); sb.AppendLine("switch (this.sort.active) {"); foreach (var property in model.Properties) { var propertyName = property.Name.Camelize(); switch (property.DataType) { case PropertyDataType.Boolean: case PropertyDataType.String: sb.AppendLine($"case '{propertyName}': return compare(a.{propertyName}, b.{propertyName}, isAsc);"); break; case PropertyDataType.Integer: case PropertyDataType.Short: case PropertyDataType.Float: case PropertyDataType.Decimal: case PropertyDataType.Double: sb.AppendLine($"case '{propertyName}': return compare(+a.{propertyName}, +b.{propertyName}, isAsc);"); break; default: break; } } sb.AppendLine("default: return 0;"); sb.AppendLine("}"); content = content.Replace("$ModelSort$", sb.ToString()); content = content.Replace("$ModelName$", model.Name); await File.WriteAllTextAsync(Path.Combine(componentFolder, $"{modelName}-datasource.ts"), content); }
private async Task CreateModelRelatedFile(string projectFolder, ProjectDataModelDto model) { await CreateModelComponent(projectFolder, model); await CreateModelDataSource(projectFolder, model); }