using Lactose.Models;
namespace Lactose.Context;
///
/// Entity Framework Core database context for the Lactose application.
///
public class LactoseDbContext : DbContext {
///
/// Gets or sets the assets DbSet.
///
public DbSet Assets { get; set; }
///
/// Gets or sets the albums DbSet.
///
public DbSet Albums { get; set; }
///
/// Gets or sets the faces DbSet.
///
public DbSet Faces { get; set; }
///
/// Gets or sets the people DbSet.
///
public DbSet People { get; set; }
///
/// Gets or sets the users DbSet.
///
public DbSet Users { get; set; }
///
/// Gets or sets the tags DbSet.
///
public DbSet Tags { get; set; }
///
/// Gets or sets the folders DbSet.
///
public DbSet Folders { get; set; }
///
/// Gets or sets the settings DbSet.
///
public DbSet Settings { get; set; }
///
/// Gets or sets the job records DbSet.
///
public DbSet JobRecords { get; set; }
///
/// Gets or sets the person-maintainer join table.
///
public DbSet PersonMaintainers { get; set; }
///
/// Initialises a new instance of the class.
///
/// The database context options.
public LactoseDbContext(DbContextOptions options) : base(options) {}
///
protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder) {
configurationBuilder.Properties()
.HaveColumnType("timestamp with time zone");
configurationBuilder.Properties()
.HaveColumnType("timestamp with time zone");
}
///
protected override void OnModelCreating(ModelBuilder modelBuilder) {
modelBuilder.HasPostgresExtension("vector");
modelBuilder.HasPostgresExtension("pg_trgm");
//Album Relationships
modelBuilder.Entity().HasOne(e => e.PersonOwner).WithMany(e => e.Albums);
modelBuilder.Entity().HasOne(e => e.CoverAsset);
modelBuilder.Entity().HasMany(e => e.Assets).WithMany(e => e.Albums);
//Asset Relationships
modelBuilder.Entity().HasOne(e => e.Uploader).WithMany(e => e.UploadedAssets).HasForeignKey(e => e.UploadedBy);
modelBuilder.Entity().HasMany(e => e.Albums).WithMany(e => e.Assets);
modelBuilder.Entity().HasMany(e => e.Tags).WithMany(e => e.Assets);
modelBuilder.Entity().HasMany(e => e.Faces).WithOne(e => e.Asset);
modelBuilder.Entity().HasOne(e => e.Folder).WithMany(e => e.Assets);
modelBuilder.Entity().HasIndex(e => new { e.Visibility, e.UploadedBy })
.HasDatabaseName("IX_Assets_VisibleForSearch")
.HasFilter("\"DeletedAt\" IS NULL");
modelBuilder.Entity().HasIndex(a => a.OriginalFilename)
.HasDatabaseName("IX_Assets_OriginalFilename_Trgm")
.HasMethod("gin")
.HasOperators("gin_trgm_ops");
// People
modelBuilder.Entity().HasIndex(p => p.Name)
.HasDatabaseName("IX_People_Name_Trgm")
.HasMethod("gin")
.HasOperators("gin_trgm_ops");
// Albums
modelBuilder.Entity().HasIndex(a => a.Title)
.HasDatabaseName("IX_Albums_Title_Trgm")
.HasMethod("gin")
.HasOperators("gin_trgm_ops");
//Face Relationships
modelBuilder.Entity().HasOne(e => e.Asset).WithMany(e => e.Faces);
modelBuilder.Entity().HasOne(e => e.Person).WithMany(e => e.Faces);
//Person Relationships
modelBuilder.Entity().HasOne(e => e.ProfileAsset).WithMany().HasForeignKey(e => e.ProfileAssetId);
modelBuilder.Entity().HasMany(e => e.Faces).WithOne(e => e.Person);
modelBuilder.Entity().HasMany(e => e.Albums).WithOne(e => e.PersonOwner);
modelBuilder.Entity().HasMany(e => e.Maintainers).WithMany(e => e.MaintainedPersons)
.UsingEntity(
j => j.HasOne(pm => pm.User).WithMany().HasForeignKey(pm => pm.UserId),
j => j.HasOne(pm => pm.Person).WithMany().HasForeignKey(pm => pm.PersonId)
);
//Tag Relationships
modelBuilder.Entity().HasOne(e => e.Parent);
modelBuilder.Entity().HasMany(e => e.Assets).WithMany(e => e.Tags);
//User Relationships
modelBuilder.Entity().HasMany(e => e.UploadedAssets).WithOne(e => e.Uploader).HasForeignKey(e => e.UploadedBy);
//Folder Relationships
modelBuilder.Entity().HasMany(e => e.Assets).WithOne(e => e.Folder);
}
}