using API.Schema.Jobs; using API.Schema.LibraryConnectors; using API.Schema.MangaConnectors; using API.Schema.NotificationConnectors; using Microsoft.EntityFrameworkCore; namespace API.Schema; public class PgsqlContext(DbContextOptions options) : DbContext(options) { public DbSet Jobs { get; set; } public DbSet MangaConnectors { get; set; } public DbSet Manga { get; set; } public DbSet Chapters { get; set; } public DbSet Authors { get; set; } public DbSet Link { get; set; } public DbSet Tags { get; set; } public DbSet AltTitles { get; set; } public DbSet LibraryConnectors { get; set; } public DbSet NotificationConnectors { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity() .HasDiscriminator(l => l.LibraryType) .HasValue(LibraryType.Komga) .HasValue(LibraryType.Kavita); modelBuilder.Entity() .HasDiscriminator(n => n.NotificationConnectorType) .HasValue(NotificationConnectorType.Gotify) .HasValue(NotificationConnectorType.Ntfy) .HasValue(NotificationConnectorType.LunaSea); modelBuilder.Entity() .HasDiscriminator(j => j.JobType) .HasValue(JobType.MoveFileOrFolderJob) .HasValue(JobType.DownloadNewChaptersJob) .HasValue(JobType.DownloadSingleChapterJob) .HasValue(JobType.UpdateMetaDataJob); modelBuilder.Entity() .HasOne(c => c.ParentManga) .WithMany(m => m.Chapters) .HasForeignKey(c => c.ParentMangaId); modelBuilder.Entity() .HasOne(m => m.LatestChapterAvailable) .WithOne(); modelBuilder.Entity() .HasOne(m => m.LatestChapterDownloaded) .WithOne(); modelBuilder.Entity() .HasOne(m => m.MangaConnector) .WithMany(c => c.Mangas) .HasForeignKey(m => m.MangaConnectorName); modelBuilder.Entity() .HasMany(m => m.Authors) .WithMany(a => a.Mangas) .UsingEntity( "MangaAuthor", l => l.HasOne(typeof(Manga)).WithMany().HasForeignKey("MangaId").HasPrincipalKey("MangaId"), r => r.HasOne(typeof(Author)).WithMany().HasForeignKey("AuthorId").HasPrincipalKey("AuthorId"), j => j.HasKey("MangaId", "AuthorId")); modelBuilder.Entity() .HasMany(m => m.Tags) .WithMany(t => t.Mangas) .UsingEntity( "MangaTag", l => l.HasOne(typeof(Manga)).WithMany().HasForeignKey("MangaId").HasPrincipalKey("MangaId"), r => r.HasOne(typeof(MangaTag)).WithMany().HasForeignKey("Tag").HasPrincipalKey("Tag"), j => j.HasKey("MangaId", "Tag")); modelBuilder.Entity() .HasMany(m => m.Links) .WithOne(c => c.Manga); modelBuilder.Entity() .HasMany(m => m.AltTitles) .WithOne(c => c.Manga); } }