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