using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; using Tiku.Domain.Catalog; using Tiku.Domain.QuestionBanks; namespace Tiku.Infrastructure.Persistence.Configurations; internal sealed class TaxonomyNodeConfiguration : IEntityTypeConfiguration { public void Configure(EntityTypeBuilder builder) { builder.ConfigureTenantEntity("taxonomy_nodes"); builder.ConfigureTimestamps(); builder.Property(entity => entity.NodeType).HasSnakeCaseEnum(); builder.Property(entity => entity.Code).HasMaxLength(100); builder.Property(entity => entity.Name).HasMaxLength(300); builder.Property(entity => entity.Path).HasColumnType("ltree"); builder.Property(entity => entity.Metadata).IsJson("{}"); builder.HasIndex(entity => new { entity.TenantId, entity.Code }).IsUnique(); builder.HasOne().WithMany() .HasForeignKey(entity => new { TenantId = entity.ParentOwnerTenantId, Id = entity.ParentId }) .HasPrincipalKey(entity => new { entity.TenantId, entity.Id }) .OnDelete(DeleteBehavior.Restrict); builder.ToTable(table => table.HasCheckConstraint( "ck_taxonomy_nodes_parent_pair", "(parent_owner_tenant_id is null) = (parent_id is null)")); } } internal sealed class QuestionTaxonomyAssignmentConfiguration : IEntityTypeConfiguration { public void Configure(EntityTypeBuilder builder) { builder.ConfigureEntity("question_taxonomy_assignments"); builder.HasAlternateKey(entity => new { entity.TenantId, entity.Id }); builder.HasIndex(entity => new { entity.TenantId, entity.QuestionId, entity.TaxonomyOwnerTenantId, entity.TaxonomyNodeId }).IsUnique(); builder.Property(entity => entity.CreatedAt).HasDefaultValueSql("now()"); builder.HasOne().WithMany() .HasForeignKey(entity => new { entity.TenantId, entity.QuestionId }) .HasPrincipalKey(entity => new { entity.TenantId, entity.Id }) .OnDelete(DeleteBehavior.Cascade); builder.HasOne().WithMany() .HasForeignKey(entity => new { TenantId = entity.TaxonomyOwnerTenantId, Id = entity.TaxonomyNodeId }) .HasPrincipalKey(entity => new { entity.TenantId, entity.Id }) .OnDelete(DeleteBehavior.Restrict); } }