UNPKG

leds-spark-lib

Version:

Biblioteca de geração de código

216 lines (202 loc) 8.05 kB
import path from "path"; import fs from "fs"; import { isLocalEntity, isModule, getRef, CompositeGeneratorNode, expandToStringWithNL, processRelations } from "../../../../models/model.js"; export function generate(model, target_folder) { const modules = model.abstractElements.filter(isModule); const all_entities = modules.map(module => module.elements.filter(isLocalEntity)).flat(); const relation_maps = processRelations(all_entities); fs.writeFileSync(path.join(target_folder, `UserConfiguration.cs`), generateUserConfiguration(model)); fs.writeFileSync(path.join(target_folder, `RoleConfiguration.cs`), generateRoleConfiguration(model)); for (const mod of modules) { const mod_classes = mod.elements.filter(isLocalEntity); for (const cls of mod_classes) { fs.writeFileSync(path.join(target_folder, `${cls.name}Configuration.cs`), generateConfiguration(model, cls, mod, relation_maps)); } } } function generateConfiguration(model, cls, mod, relation_maps) { return expandToStringWithNL ` using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; using ${model.configuration?.name}.Domain.Entities; namespace ${model.configuration?.name}.Infrastructure.EntitiesConfiguration { public class ${cls.name}Configuration : IEntityTypeConfiguration<${cls.name}> { public void Configure(EntityTypeBuilder<${cls.name}> builder) { builder.HasKey(x => x.Id); ${generateRelations(cls, relation_maps)} } } } `; } /** * Retorna todos os atributos e relações de uma Class, incluindo a de seus supertipos */ function getAttrsAndRelations(cls, relation_map) { // Se tem superclasse, puxa os atributos e relações da superclasse const superType = getRef(cls.superType); if (superType && isLocalEntity(superType)) { const parent = superType; const { attributes, relations } = getAttrsAndRelations(parent, relation_map); return { attributes: attributes.concat(cls.attributes), relations: relations.concat(relation_map.get(cls) ?? []) }; } else { return { attributes: cls.attributes, relations: relation_map.get(cls) ?? [] }; } } function generateRelations(cls, relation_maps) { const node = new CompositeGeneratorNode(); const { relations } = getAttrsAndRelations(cls, relation_maps); for (const rel of relations) { node.append(generateRelation(cls, rel)); node.appendNewLine(); } return node.toString(); } function generateRelation(cls, { tgt, card, owner }) { switch (card) { case "OneToOne": if (owner) { return expandToStringWithNL ` builder .HasOne<${tgt.name}>(${cls.name.toLowerCase()} => ${cls.name.toLowerCase()}.${tgt.name}) .WithOne(${tgt.name.toLowerCase()} => ${tgt.name.toLowerCase()}.${cls.name}) .HasForeignKey<${tgt.name}>(${cls.name.toLowerCase()} => ${cls.name.toLowerCase()}.${tgt.name}${cls.name}Id) .IsRequired(false);`; } else { return ""; } case "OneToMany": if (owner) { return ""; } else { return expandToStringWithNL ` builder .HasMany<${tgt.name}>(${cls.name.toLowerCase()} => ${cls.name.toLowerCase()}.${tgt.name}s) .WithOne(${tgt.name.toLowerCase()} => ${tgt.name.toLowerCase()}.${cls.name}) .HasForeignKey(${cls.name.toLowerCase()} => ${cls.name.toLowerCase()}.${tgt.name}${cls.name}Id);`; } case "ManyToOne": if (owner) { return ""; } else { return expandToStringWithNL ` builder .HasMany<${tgt.name}>(${cls.name.toLowerCase()} => ${cls.name.toLowerCase()}.${tgt.name}s) .WithOne(${tgt.name.toLowerCase()} => ${tgt.name.toLowerCase()}.${cls.name}) .HasForeignKey(${cls.name.toLowerCase()} => ${cls.name.toLowerCase()}.${tgt.name}${cls.name}Id);`; } case "ManyToMany": if (owner) { return expandToStringWithNL ` builder .HasMany<${tgt.name}>(${cls.name.toLowerCase()} => ${cls.name.toLowerCase()}.${tgt.name}s);`; } else { return ""; } } } function generateUserConfiguration(model) { return expandToStringWithNL ` using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; using ${model.configuration?.name}.Domain.Security.Account.Entities; namespace ${model.configuration?.name}.Infrastructure.EntitiesConfiguration { public class UserConfiguration : IEntityTypeConfiguration<User> { public void Configure(EntityTypeBuilder<User> builder) { builder.HasKey(x => x.Id); builder.Property(x => x.Name) .HasColumnName("Name") .HasColumnType("NVARCHAR") .HasMaxLength(100) .IsRequired(); builder.Property(x => x.RefreshToken) .HasColumnName("RefreshToken"); builder.OwnsOne(x => x.Email) .Property(x => x.Address) .HasColumnName("Email") .IsRequired(true); builder.OwnsOne(x => x.Email) .OwnsOne(x => x.Verification) .Property(x => x.Code) .HasColumnName("EmailVerificationCode") .IsRequired(true); builder.OwnsOne(x => x.Email) .OwnsOne(x => x.Verification) .Property(x => x.ExpiresAt) .HasColumnName("EmailVerificationExpiresAt") .IsRequired(false); builder.OwnsOne(x => x.Email) .OwnsOne(x => x.Verification) .Property(x => x.VerifiedAt) .HasColumnName("EmailVerificationVerifiedAt") .IsRequired(false); builder.OwnsOne(x => x.Email) .OwnsOne(x => x.Verification) .Ignore(x => x.IsActive); builder.OwnsOne(x => x.Password) .Property(x => x.Hash) .HasColumnName("PasswordHash") .IsRequired(); builder.OwnsOne(x => x.Password) .Property(x => x.ResetCode) .HasColumnName("PasswordResetCode") .IsRequired(); builder .HasMany(x => x.Roles) .WithMany(x => x.Users) .UsingEntity<Dictionary<string, object>>( "UserRole", role => role .HasOne<Role>() .WithMany() .HasForeignKey("RoleId") .OnDelete(DeleteBehavior.Cascade), user => user .HasOne<User>() .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade)); } } } `; } function generateRoleConfiguration(model) { return expandToStringWithNL ` using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; using ${model.configuration?.name}.Domain.Security.Account.Entities; namespace ${model.configuration?.name}.Infrastructure.EntitiesConfiguration { public class RoleConfiguration : IEntityTypeConfiguration<Role> { public void Configure(EntityTypeBuilder<Role> builder) { builder.HasKey(x => x.Id); builder.Property(x => x.Name) .HasColumnName("Name") .HasColumnType("NVARCHAR") .HasMaxLength(120) .IsRequired(true); } } }`; } //# sourceMappingURL=generate.js.map