From 313225a1a147cd701f1b7dfd7360f86a11d4f3ff Mon Sep 17 00:00:00 2001 From: Glax <johanna@bernloehr.eu> Date: Sat, 8 Mar 2025 18:09:54 +0100 Subject: [PATCH] Migrations --- .../20250308162728_dev-080325-3.Designer.cs | 735 ++++++++++++++++++ API/Migrations/20250308162728_dev-080325-3.cs | 126 +++ .../20250308170713_dev-080325-4.Designer.cs | 735 ++++++++++++++++++ API/Migrations/20250308170713_dev-080325-4.cs | 62 ++ 4 files changed, 1658 insertions(+) create mode 100644 API/Migrations/20250308162728_dev-080325-3.Designer.cs create mode 100644 API/Migrations/20250308162728_dev-080325-3.cs create mode 100644 API/Migrations/20250308170713_dev-080325-4.Designer.cs create mode 100644 API/Migrations/20250308170713_dev-080325-4.cs diff --git a/API/Migrations/20250308162728_dev-080325-3.Designer.cs b/API/Migrations/20250308162728_dev-080325-3.Designer.cs new file mode 100644 index 0000000..d202086 --- /dev/null +++ b/API/Migrations/20250308162728_dev-080325-3.Designer.cs @@ -0,0 +1,735 @@ +// <auto-generated /> +using System; +using System.Collections.Generic; +using API.Schema; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace API.Migrations +{ + [DbContext(typeof(PgsqlContext))] + [Migration("20250308162728_dev-080325-3")] + partial class dev0803253 + { + /// <inheritdoc /> + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "9.0.2") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "hstore"); + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("API.Schema.Author", b => + { + b.Property<string>("AuthorId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property<string>("AuthorName") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("AuthorId"); + + b.ToTable("Authors"); + }); + + modelBuilder.Entity("API.Schema.Chapter", b => + { + b.Property<string>("ChapterId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property<string>("ArchiveFileName") + .IsRequired() + .HasColumnType("text"); + + b.Property<string>("ChapterNumber") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("character varying(10)"); + + b.Property<bool>("Downloaded") + .HasColumnType("boolean"); + + b.Property<string>("ParentMangaId") + .IsRequired() + .HasColumnType("character varying(64)"); + + b.Property<string>("Title") + .HasColumnType("text"); + + b.Property<string>("Url") + .IsRequired() + .HasColumnType("text"); + + b.Property<int?>("VolumeNumber") + .HasColumnType("integer"); + + b.HasKey("ChapterId"); + + b.HasIndex("ParentMangaId"); + + b.ToTable("Chapters"); + }); + + modelBuilder.Entity("API.Schema.Jobs.Job", b => + { + b.Property<string>("JobId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.PrimitiveCollection<string[]>("DependsOnJobsIds") + .HasMaxLength(64) + .HasColumnType("text[]"); + + b.Property<bool>("Enabled") + .HasColumnType("boolean"); + + b.Property<string>("JobId1") + .HasColumnType("character varying(64)"); + + b.Property<byte>("JobType") + .HasColumnType("smallint"); + + b.Property<DateTime>("LastExecution") + .HasColumnType("timestamp with time zone"); + + b.Property<string>("ParentJobId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property<decimal>("RecurrenceMs") + .HasColumnType("numeric(20,0)"); + + b.Property<byte>("state") + .HasColumnType("smallint"); + + b.HasKey("JobId"); + + b.HasIndex("JobId1"); + + b.HasIndex("ParentJobId"); + + b.ToTable("Jobs"); + + b.HasDiscriminator<byte>("JobType"); + + b.UseTphMappingStrategy(); + }); + + modelBuilder.Entity("API.Schema.LibraryConnectors.LibraryConnector", b => + { + b.Property<string>("LibraryConnectorId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property<string>("Auth") + .IsRequired() + .HasColumnType("text"); + + b.Property<string>("BaseUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property<byte>("LibraryType") + .HasColumnType("smallint"); + + b.HasKey("LibraryConnectorId"); + + b.ToTable("LibraryConnectors"); + + b.HasDiscriminator<byte>("LibraryType"); + + b.UseTphMappingStrategy(); + }); + + modelBuilder.Entity("API.Schema.Link", b => + { + b.Property<string>("LinkId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property<string>("LinkProvider") + .IsRequired() + .HasColumnType("text"); + + b.Property<string>("LinkUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property<string>("MangaId") + .HasColumnType("character varying(64)"); + + b.HasKey("LinkId"); + + b.HasIndex("MangaId"); + + b.ToTable("Link"); + }); + + modelBuilder.Entity("API.Schema.Manga", b => + { + b.Property<string>("MangaId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property<string>("ConnectorId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property<string>("CoverFileNameInCache") + .HasColumnType("text"); + + b.Property<string>("CoverUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property<string>("Description") + .IsRequired() + .HasColumnType("text"); + + b.Property<string>("FolderName") + .IsRequired() + .HasColumnType("text"); + + b.Property<float>("IgnoreChapterBefore") + .HasColumnType("real"); + + b.Property<string>("MangaConnectorId") + .IsRequired() + .HasColumnType("character varying(32)"); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property<string>("OriginalLanguage") + .HasColumnType("text"); + + b.Property<byte>("ReleaseStatus") + .HasColumnType("smallint"); + + b.Property<string>("WebsiteUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property<long>("Year") + .HasColumnType("bigint"); + + b.HasKey("MangaId"); + + b.HasIndex("MangaConnectorId"); + + b.ToTable("Manga"); + }); + + modelBuilder.Entity("API.Schema.MangaAltTitle", b => + { + b.Property<string>("AltTitleId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property<string>("Language") + .IsRequired() + .HasMaxLength(8) + .HasColumnType("character varying(8)"); + + b.Property<string>("MangaId") + .HasColumnType("character varying(64)"); + + b.Property<string>("Title") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("AltTitleId"); + + b.HasIndex("MangaId"); + + b.ToTable("AltTitles"); + }); + + modelBuilder.Entity("API.Schema.MangaConnectors.MangaConnector", b => + { + b.Property<string>("Name") + .HasMaxLength(32) + .HasColumnType("character varying(32)"); + + b.PrimitiveCollection<string[]>("BaseUris") + .IsRequired() + .HasColumnType("text[]"); + + b.Property<bool>("Enabled") + .HasColumnType("boolean"); + + b.Property<string>("IconUrl") + .IsRequired() + .HasColumnType("text"); + + b.PrimitiveCollection<string[]>("SupportedLanguages") + .IsRequired() + .HasColumnType("text[]"); + + b.HasKey("Name"); + + b.ToTable("MangaConnectors"); + + b.HasDiscriminator<string>("Name").HasValue("MangaConnector"); + + b.UseTphMappingStrategy(); + }); + + modelBuilder.Entity("API.Schema.MangaTag", b => + { + b.Property<string>("Tag") + .HasColumnType("text"); + + b.HasKey("Tag"); + + b.ToTable("Tags"); + }); + + modelBuilder.Entity("API.Schema.Notification", b => + { + b.Property<string>("NotificationId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property<DateTime>("Date") + .HasColumnType("timestamp with time zone"); + + b.Property<string>("Message") + .IsRequired() + .HasColumnType("text"); + + b.Property<string>("Title") + .IsRequired() + .HasColumnType("text"); + + b.Property<byte>("Urgency") + .HasColumnType("smallint"); + + b.HasKey("NotificationId"); + + b.ToTable("Notifications"); + }); + + modelBuilder.Entity("API.Schema.NotificationConnectors.NotificationConnector", b => + { + b.Property<string>("Name") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property<string>("Body") + .IsRequired() + .HasColumnType("text"); + + b.Property<Dictionary<string, string>>("Headers") + .IsRequired() + .HasColumnType("hstore"); + + b.Property<string>("HttpMethod") + .IsRequired() + .HasColumnType("text"); + + b.Property<string>("Url") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Name"); + + b.ToTable("NotificationConnectors"); + }); + + modelBuilder.Entity("AuthorManga", b => + { + b.Property<string>("AuthorsAuthorId") + .HasColumnType("character varying(64)"); + + b.Property<string>("MangaId") + .HasColumnType("character varying(64)"); + + b.HasKey("AuthorsAuthorId", "MangaId"); + + b.HasIndex("MangaId"); + + b.ToTable("AuthorManga"); + }); + + modelBuilder.Entity("MangaMangaTag", b => + { + b.Property<string>("MangaId") + .HasColumnType("character varying(64)"); + + b.Property<string>("TagsTag") + .HasColumnType("text"); + + b.HasKey("MangaId", "TagsTag"); + + b.HasIndex("TagsTag"); + + b.ToTable("MangaMangaTag"); + }); + + modelBuilder.Entity("API.Schema.Jobs.DownloadAvailableChaptersJob", b => + { + b.HasBaseType("API.Schema.Jobs.Job"); + + b.Property<string>("MangaId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.HasIndex("MangaId"); + + b.ToTable("Jobs", t => + { + t.Property("MangaId") + .HasColumnName("DownloadAvailableChaptersJob_MangaId"); + }); + + b.HasDiscriminator().HasValue((byte)1); + }); + + modelBuilder.Entity("API.Schema.Jobs.DownloadMangaCoverJob", b => + { + b.HasBaseType("API.Schema.Jobs.Job"); + + b.Property<string>("MangaId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.HasIndex("MangaId"); + + b.HasDiscriminator().HasValue((byte)4); + }); + + modelBuilder.Entity("API.Schema.Jobs.DownloadSingleChapterJob", b => + { + b.HasBaseType("API.Schema.Jobs.Job"); + + b.Property<string>("ChapterId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.HasIndex("ChapterId"); + + b.HasDiscriminator().HasValue((byte)0); + }); + + modelBuilder.Entity("API.Schema.Jobs.MoveFileOrFolderJob", b => + { + b.HasBaseType("API.Schema.Jobs.Job"); + + b.Property<string>("FromLocation") + .IsRequired() + .HasColumnType("text"); + + b.Property<string>("ToLocation") + .IsRequired() + .HasColumnType("text"); + + b.HasDiscriminator().HasValue((byte)3); + }); + + modelBuilder.Entity("API.Schema.Jobs.RetrieveChaptersJob", b => + { + b.HasBaseType("API.Schema.Jobs.Job"); + + b.Property<string>("MangaId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.HasIndex("MangaId"); + + b.ToTable("Jobs", t => + { + t.Property("MangaId") + .HasColumnName("RetrieveChaptersJob_MangaId"); + }); + + b.HasDiscriminator().HasValue((byte)5); + }); + + modelBuilder.Entity("API.Schema.Jobs.UpdateFilesDownloadedJob", b => + { + b.HasBaseType("API.Schema.Jobs.Job"); + + b.Property<string>("MangaId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.HasIndex("MangaId"); + + b.ToTable("Jobs", t => + { + t.Property("MangaId") + .HasColumnName("UpdateFilesDownloadedJob_MangaId"); + }); + + b.HasDiscriminator().HasValue((byte)6); + }); + + modelBuilder.Entity("API.Schema.Jobs.UpdateMetadataJob", b => + { + b.HasBaseType("API.Schema.Jobs.Job"); + + b.Property<string>("MangaId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.HasIndex("MangaId"); + + b.ToTable("Jobs", t => + { + t.Property("MangaId") + .HasColumnName("UpdateMetadataJob_MangaId"); + }); + + b.HasDiscriminator().HasValue((byte)2); + }); + + modelBuilder.Entity("API.Schema.LibraryConnectors.Kavita", b => + { + b.HasBaseType("API.Schema.LibraryConnectors.LibraryConnector"); + + b.HasDiscriminator().HasValue((byte)1); + }); + + modelBuilder.Entity("API.Schema.LibraryConnectors.Komga", b => + { + b.HasBaseType("API.Schema.LibraryConnectors.LibraryConnector"); + + b.HasDiscriminator().HasValue((byte)0); + }); + + modelBuilder.Entity("API.Schema.MangaConnectors.AsuraToon", b => + { + b.HasBaseType("API.Schema.MangaConnectors.MangaConnector"); + + b.HasDiscriminator().HasValue("AsuraToon"); + }); + + modelBuilder.Entity("API.Schema.MangaConnectors.Bato", b => + { + b.HasBaseType("API.Schema.MangaConnectors.MangaConnector"); + + b.HasDiscriminator().HasValue("Bato"); + }); + + modelBuilder.Entity("API.Schema.MangaConnectors.MangaDex", b => + { + b.HasBaseType("API.Schema.MangaConnectors.MangaConnector"); + + b.HasDiscriminator().HasValue("MangaDex"); + }); + + modelBuilder.Entity("API.Schema.MangaConnectors.MangaHere", b => + { + b.HasBaseType("API.Schema.MangaConnectors.MangaConnector"); + + b.HasDiscriminator().HasValue("MangaHere"); + }); + + modelBuilder.Entity("API.Schema.MangaConnectors.MangaKatana", b => + { + b.HasBaseType("API.Schema.MangaConnectors.MangaConnector"); + + b.HasDiscriminator().HasValue("MangaKatana"); + }); + + modelBuilder.Entity("API.Schema.MangaConnectors.Mangaworld", b => + { + b.HasBaseType("API.Schema.MangaConnectors.MangaConnector"); + + b.HasDiscriminator().HasValue("Mangaworld"); + }); + + modelBuilder.Entity("API.Schema.MangaConnectors.ManhuaPlus", b => + { + b.HasBaseType("API.Schema.MangaConnectors.MangaConnector"); + + b.HasDiscriminator().HasValue("ManhuaPlus"); + }); + + modelBuilder.Entity("API.Schema.MangaConnectors.Weebcentral", b => + { + b.HasBaseType("API.Schema.MangaConnectors.MangaConnector"); + + b.HasDiscriminator().HasValue("Weebcentral"); + }); + + modelBuilder.Entity("API.Schema.Chapter", b => + { + b.HasOne("API.Schema.Manga", "ParentManga") + .WithMany() + .HasForeignKey("ParentMangaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ParentManga"); + }); + + modelBuilder.Entity("API.Schema.Jobs.Job", b => + { + b.HasOne("API.Schema.Jobs.Job", null) + .WithMany("DependsOnJobs") + .HasForeignKey("JobId1"); + + b.HasOne("API.Schema.Jobs.Job", "ParentJob") + .WithMany() + .HasForeignKey("ParentJobId"); + + b.Navigation("ParentJob"); + }); + + modelBuilder.Entity("API.Schema.Link", b => + { + b.HasOne("API.Schema.Manga", null) + .WithMany("Links") + .HasForeignKey("MangaId"); + }); + + modelBuilder.Entity("API.Schema.Manga", b => + { + b.HasOne("API.Schema.MangaConnectors.MangaConnector", "MangaConnector") + .WithMany() + .HasForeignKey("MangaConnectorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("MangaConnector"); + }); + + modelBuilder.Entity("API.Schema.MangaAltTitle", b => + { + b.HasOne("API.Schema.Manga", null) + .WithMany("AltTitles") + .HasForeignKey("MangaId"); + }); + + modelBuilder.Entity("AuthorManga", b => + { + b.HasOne("API.Schema.Author", null) + .WithMany() + .HasForeignKey("AuthorsAuthorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("API.Schema.Manga", null) + .WithMany() + .HasForeignKey("MangaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MangaMangaTag", b => + { + b.HasOne("API.Schema.Manga", null) + .WithMany() + .HasForeignKey("MangaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("API.Schema.MangaTag", null) + .WithMany() + .HasForeignKey("TagsTag") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("API.Schema.Jobs.DownloadAvailableChaptersJob", b => + { + b.HasOne("API.Schema.Manga", "Manga") + .WithMany() + .HasForeignKey("MangaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Manga"); + }); + + modelBuilder.Entity("API.Schema.Jobs.DownloadMangaCoverJob", b => + { + b.HasOne("API.Schema.Manga", "Manga") + .WithMany() + .HasForeignKey("MangaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Manga"); + }); + + modelBuilder.Entity("API.Schema.Jobs.DownloadSingleChapterJob", b => + { + b.HasOne("API.Schema.Chapter", "Chapter") + .WithMany() + .HasForeignKey("ChapterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Chapter"); + }); + + modelBuilder.Entity("API.Schema.Jobs.RetrieveChaptersJob", b => + { + b.HasOne("API.Schema.Manga", "Manga") + .WithMany() + .HasForeignKey("MangaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Manga"); + }); + + modelBuilder.Entity("API.Schema.Jobs.UpdateFilesDownloadedJob", b => + { + b.HasOne("API.Schema.Manga", "Manga") + .WithMany() + .HasForeignKey("MangaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Manga"); + }); + + modelBuilder.Entity("API.Schema.Jobs.UpdateMetadataJob", b => + { + b.HasOne("API.Schema.Manga", "Manga") + .WithMany() + .HasForeignKey("MangaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Manga"); + }); + + modelBuilder.Entity("API.Schema.Jobs.Job", b => + { + b.Navigation("DependsOnJobs"); + }); + + modelBuilder.Entity("API.Schema.Manga", b => + { + b.Navigation("AltTitles"); + + b.Navigation("Links"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/API/Migrations/20250308162728_dev-080325-3.cs b/API/Migrations/20250308162728_dev-080325-3.cs new file mode 100644 index 0000000..0484df2 --- /dev/null +++ b/API/Migrations/20250308162728_dev-080325-3.cs @@ -0,0 +1,126 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace API.Migrations +{ + /// <inheritdoc /> + public partial class dev0803253 : Migration + { + /// <inheritdoc /> + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Jobs_Manga_DownloadMangaCoverJob_MangaId", + table: "Jobs"); + + migrationBuilder.RenameColumn( + name: "DownloadMangaCoverJob_MangaId", + table: "Jobs", + newName: "UpdateFilesDownloadedJob_MangaId"); + + migrationBuilder.RenameIndex( + name: "IX_Jobs_DownloadMangaCoverJob_MangaId", + table: "Jobs", + newName: "IX_Jobs_UpdateFilesDownloadedJob_MangaId"); + + migrationBuilder.AddColumn<string>( + name: "DownloadAvailableChaptersJob_MangaId", + table: "Jobs", + type: "character varying(64)", + maxLength: 64, + nullable: true); + + migrationBuilder.AddColumn<string>( + name: "RetrieveChaptersJob_MangaId", + table: "Jobs", + type: "character varying(64)", + maxLength: 64, + nullable: true); + + migrationBuilder.CreateIndex( + name: "IX_Jobs_DownloadAvailableChaptersJob_MangaId", + table: "Jobs", + column: "DownloadAvailableChaptersJob_MangaId"); + + migrationBuilder.CreateIndex( + name: "IX_Jobs_RetrieveChaptersJob_MangaId", + table: "Jobs", + column: "RetrieveChaptersJob_MangaId"); + + migrationBuilder.AddForeignKey( + name: "FK_Jobs_Manga_DownloadAvailableChaptersJob_MangaId", + table: "Jobs", + column: "DownloadAvailableChaptersJob_MangaId", + principalTable: "Manga", + principalColumn: "MangaId", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_Jobs_Manga_RetrieveChaptersJob_MangaId", + table: "Jobs", + column: "RetrieveChaptersJob_MangaId", + principalTable: "Manga", + principalColumn: "MangaId", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_Jobs_Manga_UpdateFilesDownloadedJob_MangaId", + table: "Jobs", + column: "UpdateFilesDownloadedJob_MangaId", + principalTable: "Manga", + principalColumn: "MangaId", + onDelete: ReferentialAction.Cascade); + } + + /// <inheritdoc /> + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Jobs_Manga_DownloadAvailableChaptersJob_MangaId", + table: "Jobs"); + + migrationBuilder.DropForeignKey( + name: "FK_Jobs_Manga_RetrieveChaptersJob_MangaId", + table: "Jobs"); + + migrationBuilder.DropForeignKey( + name: "FK_Jobs_Manga_UpdateFilesDownloadedJob_MangaId", + table: "Jobs"); + + migrationBuilder.DropIndex( + name: "IX_Jobs_DownloadAvailableChaptersJob_MangaId", + table: "Jobs"); + + migrationBuilder.DropIndex( + name: "IX_Jobs_RetrieveChaptersJob_MangaId", + table: "Jobs"); + + migrationBuilder.DropColumn( + name: "DownloadAvailableChaptersJob_MangaId", + table: "Jobs"); + + migrationBuilder.DropColumn( + name: "RetrieveChaptersJob_MangaId", + table: "Jobs"); + + migrationBuilder.RenameColumn( + name: "UpdateFilesDownloadedJob_MangaId", + table: "Jobs", + newName: "DownloadMangaCoverJob_MangaId"); + + migrationBuilder.RenameIndex( + name: "IX_Jobs_UpdateFilesDownloadedJob_MangaId", + table: "Jobs", + newName: "IX_Jobs_DownloadMangaCoverJob_MangaId"); + + migrationBuilder.AddForeignKey( + name: "FK_Jobs_Manga_DownloadMangaCoverJob_MangaId", + table: "Jobs", + column: "DownloadMangaCoverJob_MangaId", + principalTable: "Manga", + principalColumn: "MangaId", + onDelete: ReferentialAction.Cascade); + } + } +} diff --git a/API/Migrations/20250308170713_dev-080325-4.Designer.cs b/API/Migrations/20250308170713_dev-080325-4.Designer.cs new file mode 100644 index 0000000..1c6fc1e --- /dev/null +++ b/API/Migrations/20250308170713_dev-080325-4.Designer.cs @@ -0,0 +1,735 @@ +// <auto-generated /> +using System; +using System.Collections.Generic; +using API.Schema; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace API.Migrations +{ + [DbContext(typeof(PgsqlContext))] + [Migration("20250308170713_dev-080325-4")] + partial class dev0803254 + { + /// <inheritdoc /> + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "9.0.2") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "hstore"); + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("API.Schema.Author", b => + { + b.Property<string>("AuthorId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property<string>("AuthorName") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("AuthorId"); + + b.ToTable("Authors"); + }); + + modelBuilder.Entity("API.Schema.Chapter", b => + { + b.Property<string>("ChapterId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property<string>("ArchiveFileName") + .IsRequired() + .HasColumnType("text"); + + b.Property<string>("ChapterNumber") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("character varying(10)"); + + b.Property<bool>("Downloaded") + .HasColumnType("boolean"); + + b.Property<string>("ParentMangaId") + .IsRequired() + .HasColumnType("character varying(64)"); + + b.Property<string>("Title") + .HasColumnType("text"); + + b.Property<string>("Url") + .IsRequired() + .HasColumnType("text"); + + b.Property<int?>("VolumeNumber") + .HasColumnType("integer"); + + b.HasKey("ChapterId"); + + b.HasIndex("ParentMangaId"); + + b.ToTable("Chapters"); + }); + + modelBuilder.Entity("API.Schema.Jobs.Job", b => + { + b.Property<string>("JobId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.PrimitiveCollection<string[]>("DependsOnJobsIds") + .HasMaxLength(64) + .HasColumnType("text[]"); + + b.Property<bool>("Enabled") + .HasColumnType("boolean"); + + b.Property<string>("JobId1") + .HasColumnType("character varying(64)"); + + b.Property<byte>("JobType") + .HasColumnType("smallint"); + + b.Property<DateTime>("LastExecution") + .HasColumnType("timestamp with time zone"); + + b.Property<string>("ParentJobId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property<decimal>("RecurrenceMs") + .HasColumnType("numeric(20,0)"); + + b.Property<byte>("state") + .HasColumnType("smallint"); + + b.HasKey("JobId"); + + b.HasIndex("JobId1"); + + b.HasIndex("ParentJobId"); + + b.ToTable("Jobs"); + + b.HasDiscriminator<byte>("JobType"); + + b.UseTphMappingStrategy(); + }); + + modelBuilder.Entity("API.Schema.LibraryConnectors.LibraryConnector", b => + { + b.Property<string>("LibraryConnectorId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property<string>("Auth") + .IsRequired() + .HasColumnType("text"); + + b.Property<string>("BaseUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property<byte>("LibraryType") + .HasColumnType("smallint"); + + b.HasKey("LibraryConnectorId"); + + b.ToTable("LibraryConnectors"); + + b.HasDiscriminator<byte>("LibraryType"); + + b.UseTphMappingStrategy(); + }); + + modelBuilder.Entity("API.Schema.Link", b => + { + b.Property<string>("LinkId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property<string>("LinkProvider") + .IsRequired() + .HasColumnType("text"); + + b.Property<string>("LinkUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property<string>("MangaId") + .HasColumnType("character varying(64)"); + + b.HasKey("LinkId"); + + b.HasIndex("MangaId"); + + b.ToTable("Link"); + }); + + modelBuilder.Entity("API.Schema.Manga", b => + { + b.Property<string>("MangaId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property<string>("ConnectorId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property<string>("CoverFileNameInCache") + .HasColumnType("text"); + + b.Property<string>("CoverUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property<string>("Description") + .IsRequired() + .HasColumnType("text"); + + b.Property<string>("FolderName") + .IsRequired() + .HasColumnType("text"); + + b.Property<float>("IgnoreChapterBefore") + .HasColumnType("real"); + + b.Property<string>("MangaConnectorId") + .IsRequired() + .HasColumnType("character varying(32)"); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property<string>("OriginalLanguage") + .HasColumnType("text"); + + b.Property<byte>("ReleaseStatus") + .HasColumnType("smallint"); + + b.Property<string>("WebsiteUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property<long>("Year") + .HasColumnType("bigint"); + + b.HasKey("MangaId"); + + b.HasIndex("MangaConnectorId"); + + b.ToTable("Manga"); + }); + + modelBuilder.Entity("API.Schema.MangaAltTitle", b => + { + b.Property<string>("AltTitleId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property<string>("Language") + .IsRequired() + .HasMaxLength(8) + .HasColumnType("character varying(8)"); + + b.Property<string>("MangaId") + .HasColumnType("character varying(64)"); + + b.Property<string>("Title") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("AltTitleId"); + + b.HasIndex("MangaId"); + + b.ToTable("AltTitles"); + }); + + modelBuilder.Entity("API.Schema.MangaConnectors.MangaConnector", b => + { + b.Property<string>("Name") + .HasMaxLength(32) + .HasColumnType("character varying(32)"); + + b.PrimitiveCollection<string[]>("BaseUris") + .IsRequired() + .HasColumnType("text[]"); + + b.Property<bool>("Enabled") + .HasColumnType("boolean"); + + b.Property<string>("IconUrl") + .IsRequired() + .HasColumnType("text"); + + b.PrimitiveCollection<string[]>("SupportedLanguages") + .IsRequired() + .HasColumnType("text[]"); + + b.HasKey("Name"); + + b.ToTable("MangaConnectors"); + + b.HasDiscriminator<string>("Name").HasValue("MangaConnector"); + + b.UseTphMappingStrategy(); + }); + + modelBuilder.Entity("API.Schema.MangaTag", b => + { + b.Property<string>("Tag") + .HasColumnType("text"); + + b.HasKey("Tag"); + + b.ToTable("Tags"); + }); + + modelBuilder.Entity("API.Schema.Notification", b => + { + b.Property<string>("NotificationId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property<DateTime>("Date") + .HasColumnType("timestamp with time zone"); + + b.Property<string>("Message") + .IsRequired() + .HasColumnType("text"); + + b.Property<string>("Title") + .IsRequired() + .HasColumnType("text"); + + b.Property<byte>("Urgency") + .HasColumnType("smallint"); + + b.HasKey("NotificationId"); + + b.ToTable("Notifications"); + }); + + modelBuilder.Entity("API.Schema.NotificationConnectors.NotificationConnector", b => + { + b.Property<string>("Name") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property<string>("Body") + .IsRequired() + .HasColumnType("text"); + + b.Property<Dictionary<string, string>>("Headers") + .IsRequired() + .HasColumnType("hstore"); + + b.Property<string>("HttpMethod") + .IsRequired() + .HasColumnType("text"); + + b.Property<string>("Url") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Name"); + + b.ToTable("NotificationConnectors"); + }); + + modelBuilder.Entity("AuthorManga", b => + { + b.Property<string>("AuthorsAuthorId") + .HasColumnType("character varying(64)"); + + b.Property<string>("MangaId") + .HasColumnType("character varying(64)"); + + b.HasKey("AuthorsAuthorId", "MangaId"); + + b.HasIndex("MangaId"); + + b.ToTable("AuthorManga"); + }); + + modelBuilder.Entity("MangaMangaTag", b => + { + b.Property<string>("MangaId") + .HasColumnType("character varying(64)"); + + b.Property<string>("MangaTagsTag") + .HasColumnType("text"); + + b.HasKey("MangaId", "MangaTagsTag"); + + b.HasIndex("MangaTagsTag"); + + b.ToTable("MangaMangaTag"); + }); + + modelBuilder.Entity("API.Schema.Jobs.DownloadAvailableChaptersJob", b => + { + b.HasBaseType("API.Schema.Jobs.Job"); + + b.Property<string>("MangaId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.HasIndex("MangaId"); + + b.ToTable("Jobs", t => + { + t.Property("MangaId") + .HasColumnName("DownloadAvailableChaptersJob_MangaId"); + }); + + b.HasDiscriminator().HasValue((byte)1); + }); + + modelBuilder.Entity("API.Schema.Jobs.DownloadMangaCoverJob", b => + { + b.HasBaseType("API.Schema.Jobs.Job"); + + b.Property<string>("MangaId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.HasIndex("MangaId"); + + b.HasDiscriminator().HasValue((byte)4); + }); + + modelBuilder.Entity("API.Schema.Jobs.DownloadSingleChapterJob", b => + { + b.HasBaseType("API.Schema.Jobs.Job"); + + b.Property<string>("ChapterId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.HasIndex("ChapterId"); + + b.HasDiscriminator().HasValue((byte)0); + }); + + modelBuilder.Entity("API.Schema.Jobs.MoveFileOrFolderJob", b => + { + b.HasBaseType("API.Schema.Jobs.Job"); + + b.Property<string>("FromLocation") + .IsRequired() + .HasColumnType("text"); + + b.Property<string>("ToLocation") + .IsRequired() + .HasColumnType("text"); + + b.HasDiscriminator().HasValue((byte)3); + }); + + modelBuilder.Entity("API.Schema.Jobs.RetrieveChaptersJob", b => + { + b.HasBaseType("API.Schema.Jobs.Job"); + + b.Property<string>("MangaId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.HasIndex("MangaId"); + + b.ToTable("Jobs", t => + { + t.Property("MangaId") + .HasColumnName("RetrieveChaptersJob_MangaId"); + }); + + b.HasDiscriminator().HasValue((byte)5); + }); + + modelBuilder.Entity("API.Schema.Jobs.UpdateFilesDownloadedJob", b => + { + b.HasBaseType("API.Schema.Jobs.Job"); + + b.Property<string>("MangaId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.HasIndex("MangaId"); + + b.ToTable("Jobs", t => + { + t.Property("MangaId") + .HasColumnName("UpdateFilesDownloadedJob_MangaId"); + }); + + b.HasDiscriminator().HasValue((byte)6); + }); + + modelBuilder.Entity("API.Schema.Jobs.UpdateMetadataJob", b => + { + b.HasBaseType("API.Schema.Jobs.Job"); + + b.Property<string>("MangaId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.HasIndex("MangaId"); + + b.ToTable("Jobs", t => + { + t.Property("MangaId") + .HasColumnName("UpdateMetadataJob_MangaId"); + }); + + b.HasDiscriminator().HasValue((byte)2); + }); + + modelBuilder.Entity("API.Schema.LibraryConnectors.Kavita", b => + { + b.HasBaseType("API.Schema.LibraryConnectors.LibraryConnector"); + + b.HasDiscriminator().HasValue((byte)1); + }); + + modelBuilder.Entity("API.Schema.LibraryConnectors.Komga", b => + { + b.HasBaseType("API.Schema.LibraryConnectors.LibraryConnector"); + + b.HasDiscriminator().HasValue((byte)0); + }); + + modelBuilder.Entity("API.Schema.MangaConnectors.AsuraToon", b => + { + b.HasBaseType("API.Schema.MangaConnectors.MangaConnector"); + + b.HasDiscriminator().HasValue("AsuraToon"); + }); + + modelBuilder.Entity("API.Schema.MangaConnectors.Bato", b => + { + b.HasBaseType("API.Schema.MangaConnectors.MangaConnector"); + + b.HasDiscriminator().HasValue("Bato"); + }); + + modelBuilder.Entity("API.Schema.MangaConnectors.MangaDex", b => + { + b.HasBaseType("API.Schema.MangaConnectors.MangaConnector"); + + b.HasDiscriminator().HasValue("MangaDex"); + }); + + modelBuilder.Entity("API.Schema.MangaConnectors.MangaHere", b => + { + b.HasBaseType("API.Schema.MangaConnectors.MangaConnector"); + + b.HasDiscriminator().HasValue("MangaHere"); + }); + + modelBuilder.Entity("API.Schema.MangaConnectors.MangaKatana", b => + { + b.HasBaseType("API.Schema.MangaConnectors.MangaConnector"); + + b.HasDiscriminator().HasValue("MangaKatana"); + }); + + modelBuilder.Entity("API.Schema.MangaConnectors.Mangaworld", b => + { + b.HasBaseType("API.Schema.MangaConnectors.MangaConnector"); + + b.HasDiscriminator().HasValue("Mangaworld"); + }); + + modelBuilder.Entity("API.Schema.MangaConnectors.ManhuaPlus", b => + { + b.HasBaseType("API.Schema.MangaConnectors.MangaConnector"); + + b.HasDiscriminator().HasValue("ManhuaPlus"); + }); + + modelBuilder.Entity("API.Schema.MangaConnectors.Weebcentral", b => + { + b.HasBaseType("API.Schema.MangaConnectors.MangaConnector"); + + b.HasDiscriminator().HasValue("Weebcentral"); + }); + + modelBuilder.Entity("API.Schema.Chapter", b => + { + b.HasOne("API.Schema.Manga", "ParentManga") + .WithMany() + .HasForeignKey("ParentMangaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ParentManga"); + }); + + modelBuilder.Entity("API.Schema.Jobs.Job", b => + { + b.HasOne("API.Schema.Jobs.Job", null) + .WithMany("DependsOnJobs") + .HasForeignKey("JobId1"); + + b.HasOne("API.Schema.Jobs.Job", "ParentJob") + .WithMany() + .HasForeignKey("ParentJobId"); + + b.Navigation("ParentJob"); + }); + + modelBuilder.Entity("API.Schema.Link", b => + { + b.HasOne("API.Schema.Manga", null) + .WithMany("Links") + .HasForeignKey("MangaId"); + }); + + modelBuilder.Entity("API.Schema.Manga", b => + { + b.HasOne("API.Schema.MangaConnectors.MangaConnector", "MangaConnector") + .WithMany() + .HasForeignKey("MangaConnectorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("MangaConnector"); + }); + + modelBuilder.Entity("API.Schema.MangaAltTitle", b => + { + b.HasOne("API.Schema.Manga", null) + .WithMany("AltTitles") + .HasForeignKey("MangaId"); + }); + + modelBuilder.Entity("AuthorManga", b => + { + b.HasOne("API.Schema.Author", null) + .WithMany() + .HasForeignKey("AuthorsAuthorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("API.Schema.Manga", null) + .WithMany() + .HasForeignKey("MangaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MangaMangaTag", b => + { + b.HasOne("API.Schema.Manga", null) + .WithMany() + .HasForeignKey("MangaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("API.Schema.MangaTag", null) + .WithMany() + .HasForeignKey("MangaTagsTag") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("API.Schema.Jobs.DownloadAvailableChaptersJob", b => + { + b.HasOne("API.Schema.Manga", "Manga") + .WithMany() + .HasForeignKey("MangaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Manga"); + }); + + modelBuilder.Entity("API.Schema.Jobs.DownloadMangaCoverJob", b => + { + b.HasOne("API.Schema.Manga", "Manga") + .WithMany() + .HasForeignKey("MangaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Manga"); + }); + + modelBuilder.Entity("API.Schema.Jobs.DownloadSingleChapterJob", b => + { + b.HasOne("API.Schema.Chapter", "Chapter") + .WithMany() + .HasForeignKey("ChapterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Chapter"); + }); + + modelBuilder.Entity("API.Schema.Jobs.RetrieveChaptersJob", b => + { + b.HasOne("API.Schema.Manga", "Manga") + .WithMany() + .HasForeignKey("MangaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Manga"); + }); + + modelBuilder.Entity("API.Schema.Jobs.UpdateFilesDownloadedJob", b => + { + b.HasOne("API.Schema.Manga", "Manga") + .WithMany() + .HasForeignKey("MangaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Manga"); + }); + + modelBuilder.Entity("API.Schema.Jobs.UpdateMetadataJob", b => + { + b.HasOne("API.Schema.Manga", "Manga") + .WithMany() + .HasForeignKey("MangaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Manga"); + }); + + modelBuilder.Entity("API.Schema.Jobs.Job", b => + { + b.Navigation("DependsOnJobs"); + }); + + modelBuilder.Entity("API.Schema.Manga", b => + { + b.Navigation("AltTitles"); + + b.Navigation("Links"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/API/Migrations/20250308170713_dev-080325-4.cs b/API/Migrations/20250308170713_dev-080325-4.cs new file mode 100644 index 0000000..8f418f7 --- /dev/null +++ b/API/Migrations/20250308170713_dev-080325-4.cs @@ -0,0 +1,62 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace API.Migrations +{ + /// <inheritdoc /> + public partial class dev0803254 : Migration + { + /// <inheritdoc /> + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_MangaMangaTag_Tags_TagsTag", + table: "MangaMangaTag"); + + migrationBuilder.RenameColumn( + name: "TagsTag", + table: "MangaMangaTag", + newName: "MangaTagsTag"); + + migrationBuilder.RenameIndex( + name: "IX_MangaMangaTag_TagsTag", + table: "MangaMangaTag", + newName: "IX_MangaMangaTag_MangaTagsTag"); + + migrationBuilder.AddForeignKey( + name: "FK_MangaMangaTag_Tags_MangaTagsTag", + table: "MangaMangaTag", + column: "MangaTagsTag", + principalTable: "Tags", + principalColumn: "Tag", + onDelete: ReferentialAction.Cascade); + } + + /// <inheritdoc /> + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_MangaMangaTag_Tags_MangaTagsTag", + table: "MangaMangaTag"); + + migrationBuilder.RenameColumn( + name: "MangaTagsTag", + table: "MangaMangaTag", + newName: "TagsTag"); + + migrationBuilder.RenameIndex( + name: "IX_MangaMangaTag_MangaTagsTag", + table: "MangaMangaTag", + newName: "IX_MangaMangaTag_TagsTag"); + + migrationBuilder.AddForeignKey( + name: "FK_MangaMangaTag_Tags_TagsTag", + table: "MangaMangaTag", + column: "TagsTag", + principalTable: "Tags", + principalColumn: "Tag", + onDelete: ReferentialAction.Cascade); + } + } +}