Example #1
0
        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);
            }
        }
Example #2
0
        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);
        }
Example #7
0
        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);
        }
Example #8
0
        private async Task CreateModelRelatedFile(string projectFolder, ProjectDataModelDto model)
        {
            await CreateModelComponent(projectFolder, model);

            await CreateModelDataSource(projectFolder, model);
        }