public void DtoBuilder_ComplexEntityDto_Regenerated() { var code = SampleCodeProvider.ComplexEntity; var metadata = EntityParser.FromString(code); metadata.DtoName = "ComplexEntityDTO"; var otherEntityProp = metadata.Properties.Where(p => p.RelatedEntityName == "OtherEntity").Single(); otherEntityProp.RelationMetadata = EntityParser.FromString(SampleCodeProvider.OtherEntity); var existingDtoTree = CSharpSyntaxTree.ParseText(SampleCodeProvider.ComplexEntityDto); var tree = DtoBuilder.BuildDto(metadata, existingDto: existingDtoTree); Assert.IsNotNull(tree); var codeText = tree.ToString(); Assert.IsTrue(codeText.Contains("public string OtherNumber { get; set; }")); Assert.IsTrue(codeText.Contains("OtherNumber = p.Other != null ? p.Other.Number : default (string),")); Assert.IsTrue(codeText.Contains("public IEnumerable<SomethingDTO> List1 { get; set; }")); Assert.IsTrue(codeText.Contains("public IEnumerable<SomethingDTO> Enumerable2 { get; set; }")); Assert.IsTrue(codeText.Contains("public IEnumerable<SomethingDTO> Collection2 { get; set; }")); Assert.IsTrue(codeText.Contains("List1 = p.List1.AsQueryable().Select(this._somethingMapper.SelectorExpression),")); Assert.IsTrue(codeText.Contains("Enumerable2 = p.Enumerable2.AsQueryable().Select(this._somethingMapper.SelectorExpression),")); Assert.IsTrue(codeText.Contains("Collection2 = p.Collection2.AsQueryable().Select(this._somethingMapper.SelectorExpression),")); }
public void DtoBuilder_SimpleEntity_PropertiesAdded() { var code = SampleCodeProvider.EntityOnlySimpleProperties; var metadata = EntityParser.FromString(code); metadata.DtoName = "EntityOnlySimplePropertiesDTO"; var tree = DtoBuilder.BuildDto(metadata, dtoNamespace: "Test.Namespace.Extra.Long"); Assert.IsNotNull(tree); var codeText = tree.ToString(); foreach (var prop in metadata.Properties.ToList()) { Assert.IsTrue(codeText.Contains($"public {prop.Type} {prop.Name} {{ get; set; }}")); if (prop != metadata.Properties.Last()) { Assert.IsTrue(codeText.Contains($"{prop.Name} = p.{prop.Name},")); } else { Assert.IsTrue(codeText.Contains($"{prop.Name} = p.{prop.Name}")); } Assert.IsFalse(codeText.Contains($",{prop.Name} = p.{prop.Name}")); Assert.IsTrue(codeText.Contains($"model.{prop.Name} = dto.{prop.Name};")); } Assert.IsTrue(codeText.Contains("using DtoGenerator.Tests.CodeSamples;")); }
/// <summary> /// Generates all required classes and documents and returns modified solution. /// With that modified solution it is required to call Workspace.ApplyChanges() /// </summary> /// <param name="solution"></param> /// <param name="dtoLocation"></param> /// <param name="metadata"></param> /// <returns>Modified solution containing changes to apply to workspace</returns> public static async Task <Solution> WriteDto(this Solution solution, SolutionLocation dtoLocation, EntityMetadata metadata, bool generateMapper, bool addContractAttrs, bool addDataAnnotations) { var project = solution.Projects .Where(p => p.Name.Contains(dtoLocation.Project)) .OrderBy(p => p.Name) // Due to .NET core project which have more complex project name, cannot use == .FirstOrDefault(); var compilation = await project.GetCompilationAsync(); var existingDtoDocument = compilation.GetDocumentForSymbol(project.Solution, metadata.DtoName); SyntaxTree existingSyntaxTree = null; if (existingDtoDocument != null) { existingSyntaxTree = await existingDtoDocument.GetSyntaxTreeAsync(); } var dtoNamespace = dtoLocation.ToNamespace(project.AssemblyName); var mapperNamespace = "unknown"; var mapperDoc = compilation.GetDocumentForSymbol(project.Solution, "MapperBase"); if (mapperDoc == null && generateMapper) { var mapperFolderStructure = dtoLocation.GetFolders().Concat(new[] { "Infrastructure" }); mapperNamespace = dtoNamespace + ".Infrastructure"; project = project.AddDocument("MapperBase.cs", DtoBuilder.BuildMapper(mapperNamespace), folders: mapperFolderStructure).Project; } else if (generateMapper) { var mapperSyntax = await mapperDoc.GetSyntaxRootAsync(); mapperNamespace = mapperSyntax.DescendantNodesAndSelf(p => !p.IsKind(CSharp.SyntaxKind.NamespaceDeclaration)) .OfType <NamespaceDeclarationSyntax>() .Select(p => p.Name.ToString()) .FirstOrDefault(); } var syntaxTree = DtoBuilder.BuildDto(metadata, dtoNamespace: dtoNamespace, existingDto: existingSyntaxTree, mapperNamespace: mapperNamespace, generateMapper: generateMapper, addContractAttrs: addContractAttrs, addDataAnnotations: addDataAnnotations); if (existingDtoDocument == null) { var formatted = Formatter.Format(syntaxTree.GetRoot(), solution.Workspace); var folderStructure = dtoLocation.GetFolders(); var newDoc = project.AddDocument(metadata.DtoName + ".cs", formatted, folders: folderStructure); return(newDoc.Project.Solution); } else { var root = syntaxTree.GetRoot(); root = Formatter.Format(root, solution.Workspace); var newDoc = existingDtoDocument.WithSyntaxRoot(root); return(newDoc.Project.Solution); } }
public IEnumerable <TopicDTO> GetTopics() { var topics = new List <TopicDTO>(); foreach (var topic in _context.Topics.ToList()) { topics.Add(DtoBuilder.BuildDto(topic)); } return(topics); }
public IEnumerable <SubjectDTO> GetSubjects() { var subjects = new List <SubjectDTO>(); foreach (var subject in _context.Subjects.ToList()) { subjects.Add(DtoBuilder.BuildDto(subject)); } return(subjects); }
public async Task <IActionResult> GetTopic([FromRoute] int id) { var topic = await _context.Topics.SingleOrDefaultAsync(m => m.ID == id); if (topic == null) { return(NotFound()); } return(Ok(DtoBuilder.BuildDto(topic))); }
public async Task <IActionResult> GetSubject([FromRoute] int id) { var subject = await _context.Subjects.SingleOrDefaultAsync(m => m.ID == id); if (subject == null) { return(NotFound()); } return(Ok(DtoBuilder.BuildDto(subject))); }
public void DtoBuilder_EntityWithBase_DataAnnotations_MetadataType() { var code = SampleCodeProvider.SampleTable3; var metadata = EntityParser.FromString(code); metadata.DtoName = "SampleTable3DTO"; var tree = DtoBuilder.BuildDto(metadata, dtoNamespace: "Some.Namespace", addDataAnnotations: true); Assert.IsNotNull(tree); var codeText = tree.ToString(); Assert.IsTrue(codeText.Contains("[MetadataType(typeof(SampleTable3MD))]")); }
public IEnumerable <SemesterDTO> GetSemesters() { var semesters = new List <SemesterDTO>(); foreach (var semester in _context.Semesters .Include(s => s.SubGroup) .ThenInclude(s => s.Group) .ThenInclude(g => g.Specialty) .ThenInclude(s => s.College) .ToList()) { semesters.Add(DtoBuilder.BuildDto(semester)); } return(semesters); }
public void DtoBuilder_SimpleEntityExistingDto_PropertiesAdded() { var code = SampleCodeProvider.EntityOnlySimpleProperties; var metadata = EntityParser.FromString(code); metadata.DtoName = "EntityOnlySimplePropertiesDTO"; var existingDtoTree = CSharpSyntaxTree.ParseText(SampleCodeProvider.EntityOnlySimplePropertiesDto); var tree = DtoBuilder.BuildDto(metadata, existingDto: existingDtoTree); Assert.IsNotNull(tree); var codeText = tree.ToString(); foreach (var prop in metadata.Properties.ToList()) { Assert.IsTrue(codeText.Contains($"public {prop.Type} {prop.Name} {{ get; set; }}")); if (prop != metadata.Properties.Last()) { Assert.IsTrue(codeText.Contains($"{prop.Name} = p.{prop.Name},")); } else { Assert.IsTrue(codeText.Contains($"{prop.Name} = p.{prop.Name}")); } Assert.IsFalse(codeText.Contains($",{prop.Name} = p.{prop.Name}")); Assert.IsTrue(codeText.Contains($"model.{prop.Name} = dto.{prop.Name};")); } var customCodeBeginIdx = codeText.IndexOf("////BCC/"); var customCodeEndIdx = codeText.IndexOf("////ECC/"); var customPropIdx = codeText.IndexOf("public int CustomProperty { get; set; }"); var genPropIdx = codeText.IndexOf("public DateTime? Date { get; set; }"); Assert.AreNotEqual(-1, customPropIdx); Assert.AreNotEqual(-1, genPropIdx); Assert.AreNotEqual(-1, customCodeBeginIdx); Assert.AreNotEqual(-1, customCodeEndIdx); Assert.IsTrue(customPropIdx > customCodeBeginIdx && customPropIdx < customCodeEndIdx); Assert.IsTrue(genPropIdx > customCodeEndIdx || genPropIdx < customCodeBeginIdx); }
public void DtoBuilder_EntityWithBase_DataAnnotations_And_DataContract() { var code = SampleCodeProvider.SampleTable2; var metadata = EntityParser.FromString(code); metadata.DtoName = "SampleTable2DTO"; var tree = DtoBuilder.BuildDto(metadata, dtoNamespace: "Some.Namespace", addContractAttrs: true, addDataAnnotations: true); Assert.IsNotNull(tree); var codeText = tree.ToString(); Assert.IsTrue(codeText.Contains("[Required]")); Assert.IsTrue(codeText.Contains("[StringLength(10)]")); Assert.IsTrue(codeText.Contains("using System.ComponentModel.DataAnnotations;")); Assert.IsTrue(codeText.Contains("[DataContract]")); Assert.IsTrue(codeText.Contains("[DataMember]")); Assert.IsTrue(codeText.Contains("using System.Runtime.Serialization;")); }
public void DtoBuilder_EntityWithBase_DataAnnotations() { var code = SampleCodeProvider.SampleTable1; var metadata = EntityParser.FromString(code); metadata.DtoName = "SampleTable1DTO"; var tree = DtoBuilder.BuildDto(metadata, dtoNamespace: "Some.Namespace", addDataAnnotations: true); Assert.IsNotNull(tree); var codeText = tree.ToString(); Assert.IsTrue(codeText.Contains("[Required]")); Assert.IsTrue(codeText.Contains("[StringLength(10)]")); Assert.IsTrue(codeText.Contains("[StringLength(200),Required]")); Assert.IsTrue(codeText.Contains("[DisplayFormat(DataFormatString = \"{0:dd/MM/yyyy}\", ApplyFormatInEditMode = true)]")); Assert.IsTrue(codeText.Contains("using System.ComponentModel.DataAnnotations;")); Assert.IsFalse(codeText.Contains("SuppressMessage")); }
public void DtoBuilder_ComplexEntityDto_Regenerated() { var code = SampleCodeProvider.ComplexEntity; var metadata = EntityParser.FromString(code); metadata.DtoName = "ComplexEntityDTO"; var otherEntityProp = metadata.Properties.Where(p => p.RelatedEntityName == "OtherEntity").Single(); otherEntityProp.RelationMetadata = EntityParser.FromString(SampleCodeProvider.OtherEntity); var existingDtoTree = CSharpSyntaxTree.ParseText(SampleCodeProvider.ComplexEntityDto); var tree = DtoBuilder.BuildDto(metadata, existingDto: existingDtoTree); Assert.IsNotNull(tree); var codeText = tree.ToString(); Assert.IsTrue(codeText.Contains("public string OtherNumber { get; set; }")); Assert.IsTrue(codeText.Contains("OtherNumber = p.Other != null ? p.Other.Number : default (string),")); Assert.IsTrue(codeText.Contains("public IEnumerable<SomethingDTO> List1 { get; set; }")); Assert.IsTrue(codeText.Contains("public IEnumerable<SomethingDTO> Enumerable2 { get; set; }")); Assert.IsTrue(codeText.Contains("public IEnumerable<SomethingDTO> Collection2 { get; set; }")); Assert.IsTrue(codeText.Contains("List1 = p.List1.AsQueryable().Select(this._somethingMapper.SelectorExpression),")); Assert.IsTrue(codeText.Contains("Enumerable2 = p.Enumerable2.AsQueryable().Select(this._somethingMapper.SelectorExpression),")); Assert.IsTrue(codeText.Contains("Collection2 = p.Collection2.AsQueryable().Select(this._somethingMapper.SelectorExpression)")); Assert.IsFalse(codeText.Contains("////BCC/ BEGIN CUSTOM CODE SECTION ////ECC/ END CUSTOM CODE SECTION")); Assert.IsFalse(codeText.Contains("////ECC/ END CUSTOM CODE SECTION private SomethingMapper")); Assert.AreEqual(codeText.IndexOf("MapToModel"), codeText.LastIndexOf("MapToModel")); Assert.IsTrue(codeText.Contains("// Some custom property leading comment - should not dissapear")); Assert.IsTrue(codeText.Contains("// Some custom property 2 leading comment - should not dissapear")); }
public void DtoBuilder_EntityWithBase_BaseCallsGenerated() { var code = SampleCodeProvider.EntityWithBase; var metadata = EntityParser.FromString(code); metadata.DtoName = "EntityWithBaseDTO"; metadata.BaseClassDtoName = "EntityBaseDTO"; metadata.BaseClassName = "EntityBase"; var tree = DtoBuilder.BuildDto(metadata, dtoNamespace: "Some.Namespace"); Assert.IsNotNull(tree); var codeText = tree.ToString(); Assert.IsTrue(codeText.Contains("private EntityBaseMapper _entityBaseMapper = new EntityBaseMapper();")); Assert.IsTrue(codeText.Contains("})).MergeWith(this._entityBaseMapper.SelectorExpression);")); Assert.IsTrue(codeText.Contains("public class EntityWithBaseDTO : EntityBaseDTO")); Assert.IsFalse(codeText.Contains("EntityWithBaseDTO : EntityBaseDTO{")); Assert.IsFalse(codeText.Contains("EntityWithBaseDTO : EntityBaseDTO {")); Assert.IsTrue(codeText.Contains("this._entityBaseMapper.MapToModel(dto,model);")); }