diff --git a/API/API.csproj b/API/API.csproj
index 05c3fa130..92671bce9 100644
--- a/API/API.csproj
+++ b/API/API.csproj
@@ -49,13 +49,13 @@
-
+
-
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
-
+
diff --git a/API/Controllers/OPDSController.cs b/API/Controllers/OPDSController.cs
index 57a5c13d5..68b9c14a2 100644
--- a/API/Controllers/OPDSController.cs
+++ b/API/Controllers/OPDSController.cs
@@ -34,7 +34,26 @@ public class OpdsController : BaseApiController
private const string Prefix = "/api/opds/";
private readonly FilterDto _filterDto = new FilterDto()
{
- Formats = new List()
+ Formats = new List(),
+ Character = new List(),
+ Colorist = new List(),
+ Editor = new List(),
+ Genres = new List(),
+ Inker = new List(),
+ Languages = new List(),
+ Letterer = new List(),
+ Penciller = new List(),
+ Libraries = new List(),
+ Publisher = new List(),
+ Rating = 0,
+ Tags = new List(),
+ Translators = new List(),
+ Writers = new List(),
+ AgeRating = new List(),
+ CollectionTags = new List(),
+ CoverArtist = new List(),
+ ReadStatus = new ReadStatus(),
+ SortOptions = null
};
private readonly ChapterSortComparer _chapterSortComparer = new ChapterSortComparer();
diff --git a/API/Data/Migrations/20211214000230_SeriesIncludes.Designer.cs b/API/Data/Migrations/20211214000230_SeriesIncludes.Designer.cs
deleted file mode 100644
index 64a21a956..000000000
--- a/API/Data/Migrations/20211214000230_SeriesIncludes.Designer.cs
+++ /dev/null
@@ -1,1228 +0,0 @@
-//
-using System;
-using API.Data;
-using Microsoft.EntityFrameworkCore;
-using Microsoft.EntityFrameworkCore.Infrastructure;
-using Microsoft.EntityFrameworkCore.Migrations;
-using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
-
-#nullable disable
-
-namespace API.Data.Migrations
-{
- [DbContext(typeof(DataContext))]
- [Migration("20211214000230_SeriesIncludes")]
- partial class SeriesIncludes
- {
- protected override void BuildTargetModel(ModelBuilder modelBuilder)
- {
-#pragma warning disable 612, 618
- modelBuilder.HasAnnotation("ProductVersion", "6.0.0");
-
- modelBuilder.Entity("API.Entities.AppRole", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER");
-
- b.Property("ConcurrencyStamp")
- .IsConcurrencyToken()
- .HasColumnType("TEXT");
-
- b.Property("Name")
- .HasMaxLength(256)
- .HasColumnType("TEXT");
-
- b.Property("NormalizedName")
- .HasMaxLength(256)
- .HasColumnType("TEXT");
-
- b.HasKey("Id");
-
- b.HasIndex("NormalizedName")
- .IsUnique()
- .HasDatabaseName("RoleNameIndex");
-
- b.ToTable("AspNetRoles", (string)null);
- });
-
- modelBuilder.Entity("API.Entities.AppUser", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER");
-
- b.Property("AccessFailedCount")
- .HasColumnType("INTEGER");
-
- b.Property("ApiKey")
- .HasColumnType("TEXT");
-
- b.Property("ConcurrencyStamp")
- .IsConcurrencyToken()
- .HasColumnType("TEXT");
-
- b.Property("Created")
- .HasColumnType("TEXT");
-
- b.Property("Email")
- .HasMaxLength(256)
- .HasColumnType("TEXT");
-
- b.Property("EmailConfirmed")
- .HasColumnType("INTEGER");
-
- b.Property("LastActive")
- .HasColumnType("TEXT");
-
- b.Property("LockoutEnabled")
- .HasColumnType("INTEGER");
-
- b.Property("LockoutEnd")
- .HasColumnType("TEXT");
-
- b.Property("NormalizedEmail")
- .HasMaxLength(256)
- .HasColumnType("TEXT");
-
- b.Property("NormalizedUserName")
- .HasMaxLength(256)
- .HasColumnType("TEXT");
-
- b.Property("PasswordHash")
- .HasColumnType("TEXT");
-
- b.Property("PhoneNumber")
- .HasColumnType("TEXT");
-
- b.Property("PhoneNumberConfirmed")
- .HasColumnType("INTEGER");
-
- b.Property("RowVersion")
- .IsConcurrencyToken()
- .HasColumnType("INTEGER");
-
- b.Property("SecurityStamp")
- .HasColumnType("TEXT");
-
- b.Property("TwoFactorEnabled")
- .HasColumnType("INTEGER");
-
- b.Property("UserName")
- .HasMaxLength(256)
- .HasColumnType("TEXT");
-
- b.HasKey("Id");
-
- b.HasIndex("NormalizedEmail")
- .HasDatabaseName("EmailIndex");
-
- b.HasIndex("NormalizedUserName")
- .IsUnique()
- .HasDatabaseName("UserNameIndex");
-
- b.ToTable("AspNetUsers", (string)null);
- });
-
- modelBuilder.Entity("API.Entities.AppUserBookmark", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER");
-
- b.Property("AppUserId")
- .HasColumnType("INTEGER");
-
- b.Property("ChapterId")
- .HasColumnType("INTEGER");
-
- b.Property("Page")
- .HasColumnType("INTEGER");
-
- b.Property("SeriesId")
- .HasColumnType("INTEGER");
-
- b.Property("VolumeId")
- .HasColumnType("INTEGER");
-
- b.HasKey("Id");
-
- b.HasIndex("AppUserId");
-
- b.ToTable("AppUserBookmark");
- });
-
- modelBuilder.Entity("API.Entities.AppUserPreferences", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER");
-
- b.Property("AppUserId")
- .HasColumnType("INTEGER");
-
- b.Property("AutoCloseMenu")
- .HasColumnType("INTEGER");
-
- b.Property("BookReaderDarkMode")
- .HasColumnType("INTEGER");
-
- b.Property("BookReaderFontFamily")
- .HasColumnType("TEXT");
-
- b.Property("BookReaderFontSize")
- .HasColumnType("INTEGER");
-
- b.Property("BookReaderLineSpacing")
- .HasColumnType("INTEGER");
-
- b.Property("BookReaderMargin")
- .HasColumnType("INTEGER");
-
- b.Property("BookReaderReadingDirection")
- .HasColumnType("INTEGER");
-
- b.Property("BookReaderTapToPaginate")
- .HasColumnType("INTEGER");
-
- b.Property("PageSplitOption")
- .HasColumnType("INTEGER");
-
- b.Property("ReaderMode")
- .HasColumnType("INTEGER");
-
- b.Property("ReadingDirection")
- .HasColumnType("INTEGER");
-
- b.Property("ScalingOption")
- .HasColumnType("INTEGER");
-
- b.Property("SiteDarkMode")
- .HasColumnType("INTEGER");
-
- b.HasKey("Id");
-
- b.HasIndex("AppUserId")
- .IsUnique();
-
- b.ToTable("AppUserPreferences");
- });
-
- modelBuilder.Entity("API.Entities.AppUserProgress", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER");
-
- b.Property("AppUserId")
- .HasColumnType("INTEGER");
-
- b.Property("BookScrollId")
- .HasColumnType("TEXT");
-
- b.Property("ChapterId")
- .HasColumnType("INTEGER");
-
- b.Property("Created")
- .HasColumnType("TEXT");
-
- b.Property("LastModified")
- .HasColumnType("TEXT");
-
- b.Property("PagesRead")
- .HasColumnType("INTEGER");
-
- b.Property("SeriesId")
- .HasColumnType("INTEGER");
-
- b.Property("VolumeId")
- .HasColumnType("INTEGER");
-
- b.HasKey("Id");
-
- b.HasIndex("AppUserId");
-
- b.HasIndex("SeriesId");
-
- b.ToTable("AppUserProgresses");
- });
-
- modelBuilder.Entity("API.Entities.AppUserRating", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER");
-
- b.Property("AppUserId")
- .HasColumnType("INTEGER");
-
- b.Property("Rating")
- .HasColumnType("INTEGER");
-
- b.Property("Review")
- .HasColumnType("TEXT");
-
- b.Property("SeriesId")
- .HasColumnType("INTEGER");
-
- b.HasKey("Id");
-
- b.HasIndex("AppUserId");
-
- b.HasIndex("SeriesId");
-
- b.ToTable("AppUserRating");
- });
-
- modelBuilder.Entity("API.Entities.AppUserRole", b =>
- {
- b.Property("UserId")
- .HasColumnType("INTEGER");
-
- b.Property("RoleId")
- .HasColumnType("INTEGER");
-
- b.HasKey("UserId", "RoleId");
-
- b.HasIndex("RoleId");
-
- b.ToTable("AspNetUserRoles", (string)null);
- });
-
- modelBuilder.Entity("API.Entities.Chapter", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER");
-
- b.Property("AgeRating")
- .HasColumnType("INTEGER");
-
- b.Property("CoverImage")
- .HasColumnType("TEXT");
-
- b.Property("CoverImageLocked")
- .HasColumnType("INTEGER");
-
- b.Property("Created")
- .HasColumnType("TEXT");
-
- b.Property("GenreId")
- .HasColumnType("INTEGER");
-
- b.Property("IsSpecial")
- .HasColumnType("INTEGER");
-
- b.Property("LastModified")
- .HasColumnType("TEXT");
-
- b.Property("Number")
- .HasColumnType("TEXT");
-
- b.Property("Pages")
- .HasColumnType("INTEGER");
-
- b.Property("Range")
- .HasColumnType("TEXT");
-
- b.Property("ReleaseDate")
- .HasColumnType("TEXT");
-
- b.Property("Title")
- .HasColumnType("TEXT");
-
- b.Property("TitleName")
- .HasColumnType("TEXT");
-
- b.Property("VolumeId")
- .HasColumnType("INTEGER");
-
- b.HasKey("Id");
-
- b.HasIndex("GenreId");
-
- b.HasIndex("VolumeId");
-
- b.ToTable("Chapter");
- });
-
- modelBuilder.Entity("API.Entities.CollectionTag", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER");
-
- b.Property("CoverImage")
- .HasColumnType("TEXT");
-
- b.Property("CoverImageLocked")
- .HasColumnType("INTEGER");
-
- b.Property("NormalizedTitle")
- .HasColumnType("TEXT");
-
- b.Property("Promoted")
- .HasColumnType("INTEGER");
-
- b.Property("RowVersion")
- .HasColumnType("INTEGER");
-
- b.Property("Summary")
- .HasColumnType("TEXT");
-
- b.Property("Title")
- .HasColumnType("TEXT");
-
- b.HasKey("Id");
-
- b.HasIndex("Id", "Promoted")
- .IsUnique();
-
- b.ToTable("CollectionTag");
- });
-
- modelBuilder.Entity("API.Entities.FolderPath", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER");
-
- b.Property("LastScanned")
- .HasColumnType("TEXT");
-
- b.Property("LibraryId")
- .HasColumnType("INTEGER");
-
- b.Property("Path")
- .HasColumnType("TEXT");
-
- b.HasKey("Id");
-
- b.HasIndex("LibraryId");
-
- b.ToTable("FolderPath");
- });
-
- modelBuilder.Entity("API.Entities.Genre", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER");
-
- b.Property("ExternalTag")
- .HasColumnType("INTEGER");
-
- b.Property("NormalizedTitle")
- .HasColumnType("TEXT");
-
- b.Property("Title")
- .HasColumnType("TEXT");
-
- b.HasKey("Id");
-
- b.HasIndex("NormalizedTitle", "ExternalTag")
- .IsUnique();
-
- b.ToTable("Genre");
- });
-
- modelBuilder.Entity("API.Entities.Library", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER");
-
- b.Property("CoverImage")
- .HasColumnType("TEXT");
-
- b.Property("Created")
- .HasColumnType("TEXT");
-
- b.Property("LastModified")
- .HasColumnType("TEXT");
-
- b.Property("LastScanned")
- .HasColumnType("TEXT");
-
- b.Property("Name")
- .HasColumnType("TEXT");
-
- b.Property("Type")
- .HasColumnType("INTEGER");
-
- b.HasKey("Id");
-
- b.ToTable("Library");
- });
-
- modelBuilder.Entity("API.Entities.MangaFile", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER");
-
- b.Property("ChapterId")
- .HasColumnType("INTEGER");
-
- b.Property("FilePath")
- .HasColumnType("TEXT");
-
- b.Property("Format")
- .HasColumnType("INTEGER");
-
- b.Property("LastModified")
- .HasColumnType("TEXT");
-
- b.Property("Pages")
- .HasColumnType("INTEGER");
-
- b.HasKey("Id");
-
- b.HasIndex("ChapterId");
-
- b.ToTable("MangaFile");
- });
-
- modelBuilder.Entity("API.Entities.Metadata.SeriesMetadata", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER");
-
- b.Property("AgeRating")
- .HasColumnType("INTEGER");
-
- b.Property("ReleaseYear")
- .HasColumnType("INTEGER");
-
- b.Property("RowVersion")
- .IsConcurrencyToken()
- .HasColumnType("INTEGER");
-
- b.Property("SeriesId")
- .HasColumnType("INTEGER");
-
- b.Property("Summary")
- .HasColumnType("TEXT");
-
- b.HasKey("Id");
-
- b.HasIndex("SeriesId")
- .IsUnique();
-
- b.HasIndex("Id", "SeriesId")
- .IsUnique();
-
- b.ToTable("SeriesMetadata");
- });
-
- modelBuilder.Entity("API.Entities.Person", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER");
-
- b.Property("Name")
- .HasColumnType("TEXT");
-
- b.Property("NormalizedName")
- .HasColumnType("TEXT");
-
- b.Property("Role")
- .HasColumnType("INTEGER");
-
- b.HasKey("Id");
-
- b.ToTable("Person");
- });
-
- modelBuilder.Entity("API.Entities.ReadingList", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER");
-
- b.Property("AppUserId")
- .HasColumnType("INTEGER");
-
- b.Property("Created")
- .HasColumnType("TEXT");
-
- b.Property("LastModified")
- .HasColumnType("TEXT");
-
- b.Property("Promoted")
- .HasColumnType("INTEGER");
-
- b.Property("Summary")
- .HasColumnType("TEXT");
-
- b.Property("Title")
- .HasColumnType("TEXT");
-
- b.HasKey("Id");
-
- b.HasIndex("AppUserId");
-
- b.ToTable("ReadingList");
- });
-
- modelBuilder.Entity("API.Entities.ReadingListItem", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER");
-
- b.Property("ChapterId")
- .HasColumnType("INTEGER");
-
- b.Property("Order")
- .HasColumnType("INTEGER");
-
- b.Property("ReadingListId")
- .HasColumnType("INTEGER");
-
- b.Property("SeriesId")
- .HasColumnType("INTEGER");
-
- b.Property("VolumeId")
- .HasColumnType("INTEGER");
-
- b.HasKey("Id");
-
- b.HasIndex("ChapterId");
-
- b.HasIndex("ReadingListId");
-
- b.HasIndex("SeriesId");
-
- b.HasIndex("VolumeId");
-
- b.ToTable("ReadingListItem");
- });
-
- modelBuilder.Entity("API.Entities.Series", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER");
-
- b.Property("CoverImage")
- .HasColumnType("TEXT");
-
- b.Property("CoverImageLocked")
- .HasColumnType("INTEGER");
-
- b.Property("Created")
- .HasColumnType("TEXT");
-
- b.Property("Format")
- .HasColumnType("INTEGER");
-
- b.Property("LastModified")
- .HasColumnType("TEXT");
-
- b.Property("LibraryId")
- .HasColumnType("INTEGER");
-
- b.Property("LocalizedName")
- .HasColumnType("TEXT");
-
- b.Property("Name")
- .HasColumnType("TEXT");
-
- b.Property("NormalizedName")
- .HasColumnType("TEXT");
-
- b.Property("OriginalName")
- .HasColumnType("TEXT");
-
- b.Property("Pages")
- .HasColumnType("INTEGER");
-
- b.Property("SortName")
- .HasColumnType("TEXT");
-
- b.HasKey("Id");
-
- b.HasIndex("LibraryId");
-
- b.HasIndex("Name", "NormalizedName", "LocalizedName", "LibraryId", "Format")
- .IsUnique();
-
- b.ToTable("Series");
- });
-
- modelBuilder.Entity("API.Entities.ServerSetting", b =>
- {
- b.Property("Key")
- .HasColumnType("INTEGER");
-
- b.Property("RowVersion")
- .IsConcurrencyToken()
- .HasColumnType("INTEGER");
-
- b.Property("Value")
- .HasColumnType("TEXT");
-
- b.HasKey("Key");
-
- b.ToTable("ServerSetting");
- });
-
- modelBuilder.Entity("API.Entities.Volume", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER");
-
- b.Property("CoverImage")
- .HasColumnType("TEXT");
-
- b.Property("Created")
- .HasColumnType("TEXT");
-
- b.Property("LastModified")
- .HasColumnType("TEXT");
-
- b.Property("Name")
- .HasColumnType("TEXT");
-
- b.Property("Number")
- .HasColumnType("INTEGER");
-
- b.Property("Pages")
- .HasColumnType("INTEGER");
-
- b.Property("SeriesId")
- .HasColumnType("INTEGER");
-
- b.HasKey("Id");
-
- b.HasIndex("SeriesId");
-
- b.ToTable("Volume");
- });
-
- modelBuilder.Entity("AppUserLibrary", b =>
- {
- b.Property("AppUsersId")
- .HasColumnType("INTEGER");
-
- b.Property("LibrariesId")
- .HasColumnType("INTEGER");
-
- b.HasKey("AppUsersId", "LibrariesId");
-
- b.HasIndex("LibrariesId");
-
- b.ToTable("AppUserLibrary");
- });
-
- modelBuilder.Entity("ChapterPerson", b =>
- {
- b.Property("ChapterMetadatasId")
- .HasColumnType("INTEGER");
-
- b.Property("PeopleId")
- .HasColumnType("INTEGER");
-
- b.HasKey("ChapterMetadatasId", "PeopleId");
-
- b.HasIndex("PeopleId");
-
- b.ToTable("ChapterPerson");
- });
-
- modelBuilder.Entity("CollectionTagSeriesMetadata", b =>
- {
- b.Property("CollectionTagsId")
- .HasColumnType("INTEGER");
-
- b.Property("SeriesMetadatasId")
- .HasColumnType("INTEGER");
-
- b.HasKey("CollectionTagsId", "SeriesMetadatasId");
-
- b.HasIndex("SeriesMetadatasId");
-
- b.ToTable("CollectionTagSeriesMetadata");
- });
-
- modelBuilder.Entity("GenreSeriesMetadata", b =>
- {
- b.Property("GenresId")
- .HasColumnType("INTEGER");
-
- b.Property("SeriesMetadatasId")
- .HasColumnType("INTEGER");
-
- b.HasKey("GenresId", "SeriesMetadatasId");
-
- b.HasIndex("SeriesMetadatasId");
-
- b.ToTable("GenreSeriesMetadata");
- });
-
- modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER");
-
- b.Property("ClaimType")
- .HasColumnType("TEXT");
-
- b.Property("ClaimValue")
- .HasColumnType("TEXT");
-
- b.Property("RoleId")
- .HasColumnType("INTEGER");
-
- b.HasKey("Id");
-
- b.HasIndex("RoleId");
-
- b.ToTable("AspNetRoleClaims", (string)null);
- });
-
- modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER");
-
- b.Property("ClaimType")
- .HasColumnType("TEXT");
-
- b.Property("ClaimValue")
- .HasColumnType("TEXT");
-
- b.Property("UserId")
- .HasColumnType("INTEGER");
-
- b.HasKey("Id");
-
- b.HasIndex("UserId");
-
- b.ToTable("AspNetUserClaims", (string)null);
- });
-
- modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b =>
- {
- b.Property("LoginProvider")
- .HasColumnType("TEXT");
-
- b.Property("ProviderKey")
- .HasColumnType("TEXT");
-
- b.Property("ProviderDisplayName")
- .HasColumnType("TEXT");
-
- b.Property("UserId")
- .HasColumnType("INTEGER");
-
- b.HasKey("LoginProvider", "ProviderKey");
-
- b.HasIndex("UserId");
-
- b.ToTable("AspNetUserLogins", (string)null);
- });
-
- modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b =>
- {
- b.Property("UserId")
- .HasColumnType("INTEGER");
-
- b.Property("LoginProvider")
- .HasColumnType("TEXT");
-
- b.Property("Name")
- .HasColumnType("TEXT");
-
- b.Property("Value")
- .HasColumnType("TEXT");
-
- b.HasKey("UserId", "LoginProvider", "Name");
-
- b.ToTable("AspNetUserTokens", (string)null);
- });
-
- modelBuilder.Entity("PersonSeriesMetadata", b =>
- {
- b.Property("PeopleId")
- .HasColumnType("INTEGER");
-
- b.Property("SeriesMetadatasId")
- .HasColumnType("INTEGER");
-
- b.HasKey("PeopleId", "SeriesMetadatasId");
-
- b.HasIndex("SeriesMetadatasId");
-
- b.ToTable("PersonSeriesMetadata");
- });
-
- modelBuilder.Entity("API.Entities.AppUserBookmark", b =>
- {
- b.HasOne("API.Entities.AppUser", "AppUser")
- .WithMany("Bookmarks")
- .HasForeignKey("AppUserId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("AppUser");
- });
-
- modelBuilder.Entity("API.Entities.AppUserPreferences", b =>
- {
- b.HasOne("API.Entities.AppUser", "AppUser")
- .WithOne("UserPreferences")
- .HasForeignKey("API.Entities.AppUserPreferences", "AppUserId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("AppUser");
- });
-
- modelBuilder.Entity("API.Entities.AppUserProgress", b =>
- {
- b.HasOne("API.Entities.AppUser", "AppUser")
- .WithMany("Progresses")
- .HasForeignKey("AppUserId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.HasOne("API.Entities.Series", null)
- .WithMany("Progress")
- .HasForeignKey("SeriesId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("AppUser");
- });
-
- modelBuilder.Entity("API.Entities.AppUserRating", b =>
- {
- b.HasOne("API.Entities.AppUser", "AppUser")
- .WithMany("Ratings")
- .HasForeignKey("AppUserId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.HasOne("API.Entities.Series", null)
- .WithMany("Ratings")
- .HasForeignKey("SeriesId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("AppUser");
- });
-
- modelBuilder.Entity("API.Entities.AppUserRole", b =>
- {
- b.HasOne("API.Entities.AppRole", "Role")
- .WithMany("UserRoles")
- .HasForeignKey("RoleId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.HasOne("API.Entities.AppUser", "User")
- .WithMany("UserRoles")
- .HasForeignKey("UserId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("Role");
-
- b.Navigation("User");
- });
-
- modelBuilder.Entity("API.Entities.Chapter", b =>
- {
- b.HasOne("API.Entities.Genre", null)
- .WithMany("Chapters")
- .HasForeignKey("GenreId");
-
- b.HasOne("API.Entities.Volume", "Volume")
- .WithMany("Chapters")
- .HasForeignKey("VolumeId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("Volume");
- });
-
- modelBuilder.Entity("API.Entities.FolderPath", b =>
- {
- b.HasOne("API.Entities.Library", "Library")
- .WithMany("Folders")
- .HasForeignKey("LibraryId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("Library");
- });
-
- modelBuilder.Entity("API.Entities.MangaFile", b =>
- {
- b.HasOne("API.Entities.Chapter", "Chapter")
- .WithMany("Files")
- .HasForeignKey("ChapterId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("Chapter");
- });
-
- modelBuilder.Entity("API.Entities.Metadata.SeriesMetadata", b =>
- {
- b.HasOne("API.Entities.Series", "Series")
- .WithOne("Metadata")
- .HasForeignKey("API.Entities.Metadata.SeriesMetadata", "SeriesId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("Series");
- });
-
- modelBuilder.Entity("API.Entities.ReadingList", b =>
- {
- b.HasOne("API.Entities.AppUser", "AppUser")
- .WithMany("ReadingLists")
- .HasForeignKey("AppUserId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("AppUser");
- });
-
- modelBuilder.Entity("API.Entities.ReadingListItem", b =>
- {
- b.HasOne("API.Entities.Chapter", "Chapter")
- .WithMany()
- .HasForeignKey("ChapterId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.HasOne("API.Entities.ReadingList", "ReadingList")
- .WithMany("Items")
- .HasForeignKey("ReadingListId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.HasOne("API.Entities.Series", "Series")
- .WithMany()
- .HasForeignKey("SeriesId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.HasOne("API.Entities.Volume", "Volume")
- .WithMany()
- .HasForeignKey("VolumeId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("Chapter");
-
- b.Navigation("ReadingList");
-
- b.Navigation("Series");
-
- b.Navigation("Volume");
- });
-
- modelBuilder.Entity("API.Entities.Series", b =>
- {
- b.HasOne("API.Entities.Library", "Library")
- .WithMany("Series")
- .HasForeignKey("LibraryId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("Library");
- });
-
- modelBuilder.Entity("API.Entities.Volume", b =>
- {
- b.HasOne("API.Entities.Series", "Series")
- .WithMany("Volumes")
- .HasForeignKey("SeriesId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("Series");
- });
-
- modelBuilder.Entity("AppUserLibrary", b =>
- {
- b.HasOne("API.Entities.AppUser", null)
- .WithMany()
- .HasForeignKey("AppUsersId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.HasOne("API.Entities.Library", null)
- .WithMany()
- .HasForeignKey("LibrariesId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
- });
-
- modelBuilder.Entity("ChapterPerson", b =>
- {
- b.HasOne("API.Entities.Chapter", null)
- .WithMany()
- .HasForeignKey("ChapterMetadatasId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.HasOne("API.Entities.Person", null)
- .WithMany()
- .HasForeignKey("PeopleId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
- });
-
- modelBuilder.Entity("CollectionTagSeriesMetadata", b =>
- {
- b.HasOne("API.Entities.CollectionTag", null)
- .WithMany()
- .HasForeignKey("CollectionTagsId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.HasOne("API.Entities.Metadata.SeriesMetadata", null)
- .WithMany()
- .HasForeignKey("SeriesMetadatasId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
- });
-
- modelBuilder.Entity("GenreSeriesMetadata", b =>
- {
- b.HasOne("API.Entities.Genre", null)
- .WithMany()
- .HasForeignKey("GenresId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.HasOne("API.Entities.Metadata.SeriesMetadata", null)
- .WithMany()
- .HasForeignKey("SeriesMetadatasId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
- });
-
- modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b =>
- {
- b.HasOne("API.Entities.AppRole", null)
- .WithMany()
- .HasForeignKey("RoleId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
- });
-
- modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b =>
- {
- b.HasOne("API.Entities.AppUser", null)
- .WithMany()
- .HasForeignKey("UserId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
- });
-
- modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b =>
- {
- b.HasOne("API.Entities.AppUser", null)
- .WithMany()
- .HasForeignKey("UserId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
- });
-
- modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b =>
- {
- b.HasOne("API.Entities.AppUser", null)
- .WithMany()
- .HasForeignKey("UserId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
- });
-
- modelBuilder.Entity("PersonSeriesMetadata", b =>
- {
- b.HasOne("API.Entities.Person", null)
- .WithMany()
- .HasForeignKey("PeopleId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.HasOne("API.Entities.Metadata.SeriesMetadata", null)
- .WithMany()
- .HasForeignKey("SeriesMetadatasId")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
- });
-
- modelBuilder.Entity("API.Entities.AppRole", b =>
- {
- b.Navigation("UserRoles");
- });
-
- modelBuilder.Entity("API.Entities.AppUser", b =>
- {
- b.Navigation("Bookmarks");
-
- b.Navigation("Progresses");
-
- b.Navigation("Ratings");
-
- b.Navigation("ReadingLists");
-
- b.Navigation("UserPreferences");
-
- b.Navigation("UserRoles");
- });
-
- modelBuilder.Entity("API.Entities.Chapter", b =>
- {
- b.Navigation("Files");
- });
-
- modelBuilder.Entity("API.Entities.Genre", b =>
- {
- b.Navigation("Chapters");
- });
-
- modelBuilder.Entity("API.Entities.Library", b =>
- {
- b.Navigation("Folders");
-
- b.Navigation("Series");
- });
-
- modelBuilder.Entity("API.Entities.ReadingList", b =>
- {
- b.Navigation("Items");
- });
-
- modelBuilder.Entity("API.Entities.Series", b =>
- {
- b.Navigation("Metadata");
-
- b.Navigation("Progress");
-
- b.Navigation("Ratings");
-
- b.Navigation("Volumes");
- });
-
- modelBuilder.Entity("API.Entities.Volume", b =>
- {
- b.Navigation("Chapters");
- });
-#pragma warning restore 612, 618
- }
- }
-}
diff --git a/API/Data/Migrations/20211214000230_SeriesIncludes.cs b/API/Data/Migrations/20211214000230_SeriesIncludes.cs
deleted file mode 100644
index 092d9001d..000000000
--- a/API/Data/Migrations/20211214000230_SeriesIncludes.cs
+++ /dev/null
@@ -1,57 +0,0 @@
-using Microsoft.EntityFrameworkCore.Migrations;
-
-#nullable disable
-
-namespace API.Data.Migrations
-{
- public partial class SeriesIncludes : Migration
- {
- protected override void Up(MigrationBuilder migrationBuilder)
- {
- migrationBuilder.CreateIndex(
- name: "IX_AppUserRating_SeriesId",
- table: "AppUserRating",
- column: "SeriesId");
-
- migrationBuilder.CreateIndex(
- name: "IX_AppUserProgresses_SeriesId",
- table: "AppUserProgresses",
- column: "SeriesId");
-
- migrationBuilder.AddForeignKey(
- name: "FK_AppUserProgresses_Series_SeriesId",
- table: "AppUserProgresses",
- column: "SeriesId",
- principalTable: "Series",
- principalColumn: "Id",
- onDelete: ReferentialAction.Cascade);
-
- migrationBuilder.AddForeignKey(
- name: "FK_AppUserRating_Series_SeriesId",
- table: "AppUserRating",
- column: "SeriesId",
- principalTable: "Series",
- principalColumn: "Id",
- onDelete: ReferentialAction.Cascade);
- }
-
- protected override void Down(MigrationBuilder migrationBuilder)
- {
- migrationBuilder.DropForeignKey(
- name: "FK_AppUserProgresses_Series_SeriesId",
- table: "AppUserProgresses");
-
- migrationBuilder.DropForeignKey(
- name: "FK_AppUserRating_Series_SeriesId",
- table: "AppUserRating");
-
- migrationBuilder.DropIndex(
- name: "IX_AppUserRating_SeriesId",
- table: "AppUserRating");
-
- migrationBuilder.DropIndex(
- name: "IX_AppUserProgresses_SeriesId",
- table: "AppUserProgresses");
- }
- }
-}
diff --git a/API/Data/Migrations/20211216150752_seriesAndChapterTags.Designer.cs b/API/Data/Migrations/20211216150752_seriesAndChapterTags.Designer.cs
deleted file mode 100644
index 845aa8e7b..000000000
--- a/API/Data/Migrations/20211216150752_seriesAndChapterTags.Designer.cs
+++ /dev/null
@@ -1,1311 +0,0 @@
-//
-using System;
-using API.Data;
-using Microsoft.EntityFrameworkCore;
-using Microsoft.EntityFrameworkCore.Infrastructure;
-using Microsoft.EntityFrameworkCore.Migrations;
-using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
-
-#nullable disable
-
-namespace API.Data.Migrations
-{
- [DbContext(typeof(DataContext))]
- [Migration("20211216150752_seriesAndChapterTags")]
- partial class seriesAndChapterTags
- {
- protected override void BuildTargetModel(ModelBuilder modelBuilder)
- {
-#pragma warning disable 612, 618
- modelBuilder.HasAnnotation("ProductVersion", "6.0.1");
-
- modelBuilder.Entity("API.Entities.AppRole", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER");
-
- b.Property("ConcurrencyStamp")
- .IsConcurrencyToken()
- .HasColumnType("TEXT");
-
- b.Property("Name")
- .HasMaxLength(256)
- .HasColumnType("TEXT");
-
- b.Property("NormalizedName")
- .HasMaxLength(256)
- .HasColumnType("TEXT");
-
- b.HasKey("Id");
-
- b.HasIndex("NormalizedName")
- .IsUnique()
- .HasDatabaseName("RoleNameIndex");
-
- b.ToTable("AspNetRoles", (string)null);
- });
-
- modelBuilder.Entity("API.Entities.AppUser", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER");
-
- b.Property("AccessFailedCount")
- .HasColumnType("INTEGER");
-
- b.Property("ApiKey")
- .HasColumnType("TEXT");
-
- b.Property("ConcurrencyStamp")
- .IsConcurrencyToken()
- .HasColumnType("TEXT");
-
- b.Property("Created")
- .HasColumnType("TEXT");
-
- b.Property("Email")
- .HasMaxLength(256)
- .HasColumnType("TEXT");
-
- b.Property("EmailConfirmed")
- .HasColumnType("INTEGER");
-
- b.Property("LastActive")
- .HasColumnType("TEXT");
-
- b.Property("LockoutEnabled")
- .HasColumnType("INTEGER");
-
- b.Property("LockoutEnd")
- .HasColumnType("TEXT");
-
- b.Property("NormalizedEmail")
- .HasMaxLength(256)
- .HasColumnType("TEXT");
-
- b.Property("NormalizedUserName")
- .HasMaxLength(256)
- .HasColumnType("TEXT");
-
- b.Property("PasswordHash")
- .HasColumnType("TEXT");
-
- b.Property("PhoneNumber")
- .HasColumnType("TEXT");
-
- b.Property("PhoneNumberConfirmed")
- .HasColumnType("INTEGER");
-
- b.Property("RowVersion")
- .IsConcurrencyToken()
- .HasColumnType("INTEGER");
-
- b.Property("SecurityStamp")
- .HasColumnType("TEXT");
-
- b.Property("TwoFactorEnabled")
- .HasColumnType("INTEGER");
-
- b.Property("UserName")
- .HasMaxLength(256)
- .HasColumnType("TEXT");
-
- b.HasKey("Id");
-
- b.HasIndex("NormalizedEmail")
- .HasDatabaseName("EmailIndex");
-
- b.HasIndex("NormalizedUserName")
- .IsUnique()
- .HasDatabaseName("UserNameIndex");
-
- b.ToTable("AspNetUsers", (string)null);
- });
-
- modelBuilder.Entity("API.Entities.AppUserBookmark", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER");
-
- b.Property("AppUserId")
- .HasColumnType("INTEGER");
-
- b.Property("ChapterId")
- .HasColumnType("INTEGER");
-
- b.Property("Page")
- .HasColumnType("INTEGER");
-
- b.Property("SeriesId")
- .HasColumnType("INTEGER");
-
- b.Property("VolumeId")
- .HasColumnType("INTEGER");
-
- b.HasKey("Id");
-
- b.HasIndex("AppUserId");
-
- b.ToTable("AppUserBookmark");
- });
-
- modelBuilder.Entity("API.Entities.AppUserPreferences", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER");
-
- b.Property("AppUserId")
- .HasColumnType("INTEGER");
-
- b.Property("AutoCloseMenu")
- .HasColumnType("INTEGER");
-
- b.Property("BookReaderDarkMode")
- .HasColumnType("INTEGER");
-
- b.Property("BookReaderFontFamily")
- .HasColumnType("TEXT");
-
- b.Property("BookReaderFontSize")
- .HasColumnType("INTEGER");
-
- b.Property("BookReaderLineSpacing")
- .HasColumnType("INTEGER");
-
- b.Property("BookReaderMargin")
- .HasColumnType("INTEGER");
-
- b.Property("BookReaderReadingDirection")
- .HasColumnType("INTEGER");
-
- b.Property("BookReaderTapToPaginate")
- .HasColumnType("INTEGER");
-
- b.Property("PageSplitOption")
- .HasColumnType("INTEGER");
-
- b.Property("ReaderMode")
- .HasColumnType("INTEGER");
-
- b.Property("ReadingDirection")
- .HasColumnType("INTEGER");
-
- b.Property("ScalingOption")
- .HasColumnType("INTEGER");
-
- b.Property("SiteDarkMode")
- .HasColumnType("INTEGER");
-
- b.HasKey("Id");
-
- b.HasIndex("AppUserId")
- .IsUnique();
-
- b.ToTable("AppUserPreferences");
- });
-
- modelBuilder.Entity("API.Entities.AppUserProgress", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("INTEGER");
-
- b.Property("AppUserId")
- .HasColumnType("INTEGER");
-
- b.Property("BookScrollId")
- .HasColumnType("TEXT");
-
- b.Property("ChapterId")
- .HasColumnType("INTEGER");
-
- b.Property("Created")
- .HasColumnType("TEXT");
-
- b.Property("LastModified")
- .HasColumnType("TEXT");
-
- b.Property