namespace Hutopy.Web.Features.Contents.Data; public class ContentDbContext( DbContextOptions options) : DbContext(options) { public const string SchemaName = "Content"; public DbSet Contents => Set(); public DbSet Creators => Set(); public DbSet Slugs => Set(); public DbSet Albums => Set(); public DbSet AlbumPhotos => Set(); protected override void OnModelCreating( ModelBuilder modelBuilder) { modelBuilder.HasDefaultSchema(SchemaName); modelBuilder .Entity() .Property(c => c.CreatedAt) .ValueGeneratedOnAdd() .HasDefaultValueSql("CURRENT_TIMESTAMP"); modelBuilder .Entity() .HasOne(c => c.Creator) .WithMany() .HasForeignKey(c => c.CreatorId) .IsRequired(false); modelBuilder .Entity() .OwnsMany(c => c.Reactions) .ToTable("Reactions"); modelBuilder .Entity() .Property(c => c.ThumbnailUrl); modelBuilder .Entity() .Property(x => x.NormalizedName) .HasComputedColumnSql("LOWER( \"Content\".\"Slugs\".\"Name\")", stored: true); modelBuilder .Entity() .HasIndex(x => x.NormalizedName) .IsUnique(); modelBuilder .Entity() .Property(c => c.IsDeleted) .HasComputedColumnSql("\"DeletedAt\" IS NOT NULL", stored: true); // bool modelBuilder .Entity() .OwnsOne(x => x.Socials) .ToTable(nameof(Socials)); modelBuilder .Entity() .OwnsOne(x => x.Presentation) .ToTable(nameof(Presentation)); modelBuilder .Entity() .HasQueryFilter(c => !c.IsDeleted); // Album configuration modelBuilder .Entity() .Property(c => c.CreatedAt) .ValueGeneratedOnAdd() .HasDefaultValueSql("CURRENT_TIMESTAMP"); modelBuilder .Entity() .Property(c => c.IsDeleted) .HasComputedColumnSql("\"DeletedAt\" IS NOT NULL", stored: true); modelBuilder .Entity() .HasQueryFilter(a => !a.IsDeleted); // AlbumPhoto configuration modelBuilder .Entity() .Property(c => c.CreatedAt) .ValueGeneratedOnAdd() .HasDefaultValueSql("CURRENT_TIMESTAMP"); modelBuilder .Entity() .Property(c => c.IsDeleted) .HasComputedColumnSql("\"DeletedAt\" IS NOT NULL", stored: true); modelBuilder .Entity() .HasOne(ap => ap.Album) .WithMany(a => a.Photos) .HasForeignKey(ap => ap.AlbumId) .IsRequired(); modelBuilder .Entity() .HasQueryFilter(ap => !ap.IsDeleted); } }