using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; using Tiku.Domain.Identity; using Tiku.Domain.Tenancy; namespace Tiku.Infrastructure.Persistence.Configurations; internal sealed class TenantConfiguration : IEntityTypeConfiguration { public void Configure(EntityTypeBuilder builder) { builder.ConfigureEntity("tenants"); builder.ConfigureTimestamps(); builder.Property(entity => entity.Slug).HasColumnType("citext").HasMaxLength(100); builder.Property(entity => entity.Name).HasMaxLength(200); builder.Property(entity => entity.LegalName).HasMaxLength(300); builder.Property(entity => entity.Status).HasSnakeCaseEnum(); builder.Property(entity => entity.Mode).HasSnakeCaseEnum(); builder.Property(entity => entity.BillingStatus).HasSnakeCaseEnum(); builder.Property(entity => entity.LegacyId).HasMaxLength(64); builder.Property(entity => entity.Metadata).IsJson("{}"); builder.HasIndex(entity => entity.Slug).IsUnique(); builder.HasIndex(entity => entity.LegacyId).IsUnique(); builder.HasOne() .WithMany() .HasForeignKey(entity => entity.OwnerUserId) .OnDelete(DeleteBehavior.SetNull); } } internal sealed class TenantMembershipConfiguration : IEntityTypeConfiguration { public void Configure(EntityTypeBuilder builder) { builder.ConfigureTenantEntity("tenant_memberships"); builder.ConfigureTimestamps(); builder.Property(entity => entity.Role).HasSnakeCaseEnum(); builder.Property(entity => entity.Status).HasSnakeCaseEnum(); builder.Property(entity => entity.Permissions).IsJson("{}"); builder.Property(entity => entity.LegacyRole).HasMaxLength(50); builder.HasIndex(entity => new { entity.TenantId, entity.UserId, entity.Role }).IsUnique(); builder.HasOne() .WithMany() .HasForeignKey(entity => entity.UserId) .OnDelete(DeleteBehavior.Cascade); } }