diff --git a/API/APIEndpointRecords/DownloadAvailableJobsRecord.cs b/API/APIEndpointRecords/DownloadAvailableJobsRecord.cs new file mode 100644 index 0000000..a272df3 --- /dev/null +++ b/API/APIEndpointRecords/DownloadAvailableJobsRecord.cs @@ -0,0 +1,5 @@ +using System.ComponentModel.DataAnnotations; + +namespace API.APIEndpointRecords; + +public record DownloadAvailableJobsRecord([Required]ulong recurrenceTimeMs, [Required]string localLibraryId); \ No newline at end of file diff --git a/API/APIEndpointRecords/NewLibraryRecord.cs b/API/APIEndpointRecords/NewLibraryRecord.cs new file mode 100644 index 0000000..88769d9 --- /dev/null +++ b/API/APIEndpointRecords/NewLibraryRecord.cs @@ -0,0 +1,3 @@ +namespace API.APIEndpointRecords; + +public record NewLibraryRecord(string path, string name); \ No newline at end of file diff --git a/API/Controllers/JobController.cs b/API/Controllers/JobController.cs index 9383f7c..ea3c651 100644 --- a/API/Controllers/JobController.cs +++ b/API/Controllers/JobController.cs @@ -100,20 +100,37 @@ public class JobController(PgsqlContext context) : Controller /// Create a new DownloadAvailableChaptersJob /// /// ID of Manga - /// How often should we check for new chapters + /// Job-Configuration /// Job-IDs + /// Could not find Library with ID /// Could not find Manga with ID /// Error during Database Operation [HttpPut("DownloadAvailableChaptersJob/{MangaId}")] [ProducesResponseType(Status201Created, "application/json")] + [ProducesResponseType(Status400BadRequest)] [ProducesResponseType(Status404NotFound)] [ProducesResponseType(Status500InternalServerError, "text/plain")] - public IActionResult CreateNewDownloadChapterJob(string MangaId, [FromBody]ulong recurrenceTime) + public IActionResult CreateDownloadAvailableChaptersJob(string MangaId, [FromBody]DownloadAvailableJobsRecord record) { - if (context.Manga.Find(MangaId) is null) + if (context.Mangas.Find(MangaId) is not { } m) return NotFound(); - Job dep = new RetrieveChaptersJob(recurrenceTime, MangaId); - Job job = new DownloadAvailableChaptersJob(recurrenceTime, MangaId, null, [dep.JobId]); + else + { + try + { + LocalLibrary? l = context.LocalLibraries.Find(record.localLibraryId); + if (l is null) + return BadRequest(); + m.Library = l; + context.SaveChanges(); + } + catch (Exception e) + { + return StatusCode(500, e.Message); + } + } + Job dep = new RetrieveChaptersJob(record.recurrenceTimeMs, MangaId); + Job job = new DownloadAvailableChaptersJob(record.recurrenceTimeMs, MangaId, null, [dep.JobId]); return AddJobs([dep, job]); } @@ -149,7 +166,7 @@ public class JobController(PgsqlContext context) : Controller [ProducesResponseType(Status500InternalServerError, "text/plain")] public IActionResult CreateUpdateFilesDownloadedJob(string MangaId) { - if(context.Manga.Find(MangaId) is null) + if(context.Mangas.Find(MangaId) is null) return NotFound(); Job job = new UpdateFilesDownloadedJob(0, MangaId); return AddJobs([job]); @@ -165,7 +182,7 @@ public class JobController(PgsqlContext context) : Controller [ProducesResponseType(Status500InternalServerError, "text/plain")] public IActionResult CreateUpdateAllFilesDownloadedJob() { - List ids = context.Manga.Select(m => m.MangaId).ToList(); + List ids = context.Mangas.Select(m => m.MangaId).ToList(); List jobs = ids.Select(id => new UpdateFilesDownloadedJob(0, id)).ToList(); try { @@ -192,7 +209,7 @@ public class JobController(PgsqlContext context) : Controller [ProducesResponseType(Status500InternalServerError, "text/plain")] public IActionResult CreateUpdateMetadataJob(string MangaId) { - if(context.Manga.Find(MangaId) is null) + if(context.Mangas.Find(MangaId) is null) return NotFound(); Job job = new UpdateMetadataJob(0, MangaId); return AddJobs([job]); @@ -208,7 +225,7 @@ public class JobController(PgsqlContext context) : Controller [ProducesResponseType(Status500InternalServerError, "text/plain")] public IActionResult CreateUpdateAllMetadataJob() { - List ids = context.Manga.Select(m => m.MangaId).ToList(); + List ids = context.Mangas.Select(m => m.MangaId).ToList(); List jobs = ids.Select(id => new UpdateMetadataJob(0, id)).ToList(); try { diff --git a/API/Controllers/LocalLibrariesController.cs b/API/Controllers/LocalLibrariesController.cs new file mode 100644 index 0000000..192f6db --- /dev/null +++ b/API/Controllers/LocalLibrariesController.cs @@ -0,0 +1,127 @@ +using API.APIEndpointRecords; +using API.Schema; +using Asp.Versioning; +using Microsoft.AspNetCore.Mvc; +using static Microsoft.AspNetCore.Http.StatusCodes; + +namespace API.Controllers; + +[ApiVersion(2)] +[ApiController] +[Route("v{v:apiVersion}/[controller]")] +public class LocalLibrariesController(PgsqlContext context) : Controller +{ + [HttpGet] + [ProducesResponseType(Status200OK, "application/json")] + public IActionResult GetLocalLibraries() + { + return Ok(context.LocalLibraries); + } + + [HttpGet("{LibraryId}")] + [ProducesResponseType(Status200OK, "application/json")] + [ProducesResponseType(Status404NotFound)] + public IActionResult GetLocalLibrary(string LibraryId) + { + LocalLibrary? library = context.LocalLibraries.Find(LibraryId); + if (library is null) + return NotFound(); + return Ok(library); + } + + [HttpPatch("{LibraryId}/ChangeBasePath")] + [ProducesResponseType(Status200OK)] + [ProducesResponseType(Status404NotFound)] + [ProducesResponseType(Status400BadRequest)] + [ProducesResponseType(Status500InternalServerError, "text/plain")] + public IActionResult ChangeLibraryBasePath(string LibraryId, [FromBody] string newBasePath) + { + try + { + LocalLibrary? library = context.LocalLibraries.Find(LibraryId); + if (library is null) + return NotFound(); + + if (false) //TODO implement path check + return BadRequest(); + + library.BasePath = newBasePath; + context.SaveChanges(); + + return Ok(); + } + catch (Exception e) + { + return StatusCode(500, e.Message); + } + } + + [HttpPatch("{LibraryId}/ChangeName")] + [ProducesResponseType(Status200OK)] + [ProducesResponseType(Status404NotFound)] + [ProducesResponseType(Status400BadRequest)] + [ProducesResponseType(Status500InternalServerError, "text/plain")] + public IActionResult ChangeLibraryName(string LibraryId, [FromBody] string newName) + { + try + { + LocalLibrary? library = context.LocalLibraries.Find(LibraryId); + if (library is null) + return NotFound(); + + if(newName.Length < 1) + return BadRequest(); + + library.LibraryName = newName; + context.SaveChanges(); + + return Ok(); + } + catch (Exception e) + { + return StatusCode(500, e.Message); + } + } + + [HttpPut] + [ProducesResponseType(Status200OK, "application/json")] + [ProducesResponseType(Status500InternalServerError, "text/plain")] + public IActionResult CreateNewLibrary([FromBody] NewLibraryRecord library) + { + try + { + LocalLibrary newLibrary = new (library.path, library.name); + context.LocalLibraries.Add(newLibrary); + context.SaveChanges(); + + return Ok(newLibrary); + } + catch (Exception e) + { + return StatusCode(500, e.Message); + } + } + + [HttpDelete("{LibraryId}")] + [ProducesResponseType(Status200OK)] + [ProducesResponseType(Status404NotFound)] + [ProducesResponseType(Status500InternalServerError, "text/plain")] + public IActionResult DeleteLocalLibrary(string LibraryId) + { + + try + { + LocalLibrary? library = context.LocalLibraries.Find(LibraryId); + if (library is null) + return NotFound(); + context.Remove(library); + context.SaveChanges(); + + return Ok(); + } + catch (Exception e) + { + return StatusCode(500, e.Message); + } + } +} \ No newline at end of file diff --git a/API/Controllers/MangaController.cs b/API/Controllers/MangaController.cs index 100c02e..b3ac3c9 100644 --- a/API/Controllers/MangaController.cs +++ b/API/Controllers/MangaController.cs @@ -23,7 +23,7 @@ public class MangaController(PgsqlContext context) : Controller [ProducesResponseType(Status200OK, "application/json")] public IActionResult GetAllManga() { - Manga[] ret = context.Manga.ToArray(); + Manga[] ret = context.Mangas.ToArray(); return Ok(ret); } @@ -36,7 +36,7 @@ public class MangaController(PgsqlContext context) : Controller [ProducesResponseType(Status200OK, "application/json")] public IActionResult GetManga([FromBody]string[] ids) { - Manga[] ret = context.Manga.Where(m => ids.Contains(m.MangaId)).ToArray(); + Manga[] ret = context.Mangas.Where(m => ids.Contains(m.MangaId)).ToArray(); return Ok(ret); } @@ -51,7 +51,7 @@ public class MangaController(PgsqlContext context) : Controller [ProducesResponseType(Status404NotFound)] public IActionResult GetManga(string MangaId) { - Manga? ret = context.Manga.Find(MangaId); + Manga? ret = context.Mangas.Find(MangaId); if (ret is null) return NotFound(); return Ok(ret); @@ -72,7 +72,7 @@ public class MangaController(PgsqlContext context) : Controller { try { - Manga? ret = context.Manga.Find(MangaId); + Manga? ret = context.Mangas.Find(MangaId); if (ret is null) return NotFound(); @@ -103,7 +103,7 @@ public class MangaController(PgsqlContext context) : Controller [ProducesResponseType(Status404NotFound)] public IActionResult GetCover(string MangaId, [FromQuery]int? width, [FromQuery]int? height) { - Manga? m = context.Manga.Find(MangaId); + Manga? m = context.Mangas.Find(MangaId); if (m is null) return NotFound(); if (!System.IO.File.Exists(m.CoverFileNameInCache)) @@ -148,7 +148,7 @@ public class MangaController(PgsqlContext context) : Controller [ProducesResponseType(Status404NotFound)] public IActionResult GetChapters(string MangaId) { - Manga? m = context.Manga.Find(MangaId); + Manga? m = context.Mangas.Find(MangaId); if (m is null) return NotFound(); @@ -169,7 +169,7 @@ public class MangaController(PgsqlContext context) : Controller [ProducesResponseType(Status404NotFound)] public IActionResult GetChaptersDownloaded(string MangaId) { - Manga? m = context.Manga.Find(MangaId); + Manga? m = context.Mangas.Find(MangaId); if (m is null) return NotFound(); @@ -193,7 +193,7 @@ public class MangaController(PgsqlContext context) : Controller [ProducesResponseType(Status404NotFound)] public IActionResult GetChaptersNotDownloaded(string MangaId) { - Manga? m = context.Manga.Find(MangaId); + Manga? m = context.Mangas.Find(MangaId); if (m is null) return NotFound(); @@ -219,7 +219,7 @@ public class MangaController(PgsqlContext context) : Controller [ProducesResponseType(Status500InternalServerError, "text/plain")] public IActionResult GetLatestChapter(string MangaId) { - Manga? m = context.Manga.Find(MangaId); + Manga? m = context.Mangas.Find(MangaId); if (m is null) return NotFound(); @@ -249,7 +249,7 @@ public class MangaController(PgsqlContext context) : Controller [ProducesResponseType(Status500InternalServerError, "text/plain")] public IActionResult GetLatestChapterDownloaded(string MangaId) { - Manga? m = context.Manga.Find(MangaId); + Manga? m = context.Mangas.Find(MangaId); if (m is null) return NotFound(); @@ -277,7 +277,7 @@ public class MangaController(PgsqlContext context) : Controller [ProducesResponseType(Status500InternalServerError, "text/plain")] public IActionResult IgnoreChaptersBefore(string MangaId, [FromBody]float chapterThreshold) { - Manga? m = context.Manga.Find(MangaId); + Manga? m = context.Mangas.Find(MangaId); if (m is null) return NotFound(); @@ -305,7 +305,7 @@ public class MangaController(PgsqlContext context) : Controller [ProducesResponseType(Status500InternalServerError, "text/plain")] public IActionResult MoveFolder(string MangaId, [FromBody]string folder) { - Manga? manga = context.Manga.Find(MangaId); + Manga? manga = context.Mangas.Find(MangaId); if (manga is null) return NotFound(); MoveFileOrFolderJob dep = manga.UpdateFolderName(TrangaSettings.downloadLocation, folder); diff --git a/API/Controllers/QueryController.cs b/API/Controllers/QueryController.cs index 3a4fb05..2254e33 100644 --- a/API/Controllers/QueryController.cs +++ b/API/Controllers/QueryController.cs @@ -36,7 +36,7 @@ public class QueryController(PgsqlContext context) : Controller [ProducesResponseType(Status200OK, "application/json")] public IActionResult GetMangaWithAuthorIds(string AuthorId) { - return Ok(context.Manga.Where(m => m.AuthorIds.Contains(AuthorId))); + return Ok(context.Mangas.Where(m => m.AuthorIds.Contains(AuthorId))); } /// @@ -50,7 +50,7 @@ public class QueryController(PgsqlContext context) : Controller [ProducesResponseType(Status404NotFound)] public IActionResult GetLink(string LinkId) { - Link? ret = context.Link.Find(LinkId); + Link? ret = context.Links.Find(LinkId); if (ret is null) return NotFound(); return Ok(ret); @@ -82,7 +82,7 @@ public class QueryController(PgsqlContext context) : Controller [ProducesResponseType(Status200OK, "application/json")] public IActionResult GetMangasWithTag(string Tag) { - return Ok(context.Manga.Where(m => m.Tags.Contains(Tag))); + return Ok(context.Mangas.Where(m => m.Tags.Contains(Tag))); } /// diff --git a/API/Controllers/SearchController.cs b/API/Controllers/SearchController.cs index 08d6c1a..95639bd 100644 --- a/API/Controllers/SearchController.cs +++ b/API/Controllers/SearchController.cs @@ -131,7 +131,7 @@ public class SearchController(PgsqlContext context) : Controller if (manga is null) return null; - Manga? existing = context.Manga.Find(manga.MangaId); + Manga? existing = context.Mangas.Find(manga.MangaId); if (tags is not null) { @@ -163,13 +163,13 @@ public class SearchController(PgsqlContext context) : Controller { IEnumerable mergedLinks = links.Select(ml => { - Link? inDb = context.Link.Find(ml.LinkId); + Link? inDb = context.Links.Find(ml.LinkId); return inDb ?? ml; }); manga.Links = mergedLinks.ToList(); IEnumerable newLinks = manga.Links - .Where(ml => !context.Link.Select(l => l.LinkId).Contains(ml.LinkId)); - context.Link.AddRange(newLinks); + .Where(ml => !context.Links.Select(l => l.LinkId).Contains(ml.LinkId)); + context.Links.AddRange(newLinks); } if (altTitles is not null) @@ -187,9 +187,9 @@ public class SearchController(PgsqlContext context) : Controller existing?.UpdateWithInfo(manga); if(existing is not null) - context.Manga.Update(existing); + context.Mangas.Update(existing); else - context.Manga.Add(manga); + context.Mangas.Add(manga); context.Jobs.Add(new DownloadMangaCoverJob(manga.MangaId)); context.Jobs.Add(new RetrieveChaptersJob(0, manga.MangaId)); diff --git a/API/Migrations/20250303141044_dev-030325-1.Designer.cs b/API/Migrations/20250303141044_dev-030325-1.Designer.cs deleted file mode 100644 index 967b398..0000000 --- a/API/Migrations/20250303141044_dev-030325-1.Designer.cs +++ /dev/null @@ -1,672 +0,0 @@ -// -using System; -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("20250303141044_dev-030325-1")] - partial class dev0303251 - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "9.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("API.Schema.Author", b => - { - b.Property("AuthorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("AuthorName") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("AuthorId"); - - b.ToTable("Authors"); - }); - - modelBuilder.Entity("API.Schema.Chapter", b => - { - b.Property("ChapterId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("ArchiveFileName") - .IsRequired() - .HasColumnType("text"); - - b.Property("ChapterNumber") - .IsRequired() - .HasMaxLength(10) - .HasColumnType("character varying(10)"); - - b.Property("Downloaded") - .HasColumnType("boolean"); - - b.Property("ParentMangaId") - .IsRequired() - .HasColumnType("character varying(64)"); - - b.Property("Title") - .HasColumnType("text"); - - b.Property("Url") - .IsRequired() - .HasColumnType("text"); - - b.Property("VolumeNumber") - .HasColumnType("integer"); - - b.HasKey("ChapterId"); - - b.HasIndex("ParentMangaId"); - - b.ToTable("Chapters"); - }); - - modelBuilder.Entity("API.Schema.Jobs.Job", b => - { - b.Property("JobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.PrimitiveCollection("DependsOnJobsIds") - .HasMaxLength(64) - .HasColumnType("text[]"); - - b.Property("JobId1") - .HasColumnType("character varying(64)"); - - b.Property("JobType") - .HasColumnType("smallint"); - - b.Property("LastExecution") - .HasColumnType("timestamp with time zone"); - - b.Property("ParentJobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("RecurrenceMs") - .HasColumnType("numeric(20,0)"); - - b.Property("state") - .HasColumnType("integer"); - - b.HasKey("JobId"); - - b.HasIndex("JobId1"); - - b.HasIndex("ParentJobId"); - - b.ToTable("Jobs"); - - b.HasDiscriminator("JobType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.LibraryConnectors.LibraryConnector", b => - { - b.Property("LibraryConnectorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Auth") - .IsRequired() - .HasColumnType("text"); - - b.Property("BaseUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("LibraryType") - .HasColumnType("smallint"); - - b.HasKey("LibraryConnectorId"); - - b.ToTable("LibraryConnectors"); - - b.HasDiscriminator("LibraryType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.Link", b => - { - b.Property("LinkId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("LinkProvider") - .IsRequired() - .HasColumnType("text"); - - b.Property("LinkUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("LinkId"); - - b.HasIndex("MangaId"); - - b.ToTable("Link"); - }); - - modelBuilder.Entity("API.Schema.Manga", b => - { - b.Property("MangaId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("ConnectorId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("CoverFileNameInCache") - .HasColumnType("text"); - - b.Property("CoverUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("Description") - .IsRequired() - .HasColumnType("text"); - - b.Property("FolderName") - .IsRequired() - .HasColumnType("text"); - - b.Property("IgnoreChapterBefore") - .HasColumnType("real"); - - b.Property("MangaConnectorId") - .IsRequired() - .HasColumnType("character varying(32)"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("OriginalLanguage") - .HasColumnType("text"); - - b.Property("ReleaseStatus") - .HasColumnType("smallint"); - - b.Property("WebsiteUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("Year") - .HasColumnType("bigint"); - - b.HasKey("MangaId"); - - b.HasIndex("MangaConnectorId"); - - b.ToTable("Manga"); - }); - - modelBuilder.Entity("API.Schema.MangaAltTitle", b => - { - b.Property("AltTitleId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Language") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("character varying(8)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("AltTitleId"); - - b.HasIndex("MangaId"); - - b.ToTable("AltTitles"); - }); - - modelBuilder.Entity("API.Schema.MangaConnectors.MangaConnector", b => - { - b.Property("Name") - .HasMaxLength(32) - .HasColumnType("character varying(32)"); - - b.PrimitiveCollection("BaseUris") - .IsRequired() - .HasColumnType("text[]"); - - b.PrimitiveCollection("SupportedLanguages") - .IsRequired() - .HasColumnType("text[]"); - - b.HasKey("Name"); - - b.ToTable("MangaConnectors"); - - b.HasDiscriminator("Name").HasValue("MangaConnector"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.MangaTag", b => - { - b.Property("Tag") - .HasColumnType("text"); - - b.HasKey("Tag"); - - b.ToTable("Tags"); - }); - - modelBuilder.Entity("API.Schema.Notification", b => - { - b.Property("NotificationId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Date") - .HasColumnType("timestamp with time zone"); - - b.Property("Message") - .IsRequired() - .HasColumnType("text"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text"); - - b.Property("Urgency") - .HasColumnType("smallint"); - - b.HasKey("NotificationId"); - - b.ToTable("Notifications"); - }); - - modelBuilder.Entity("API.Schema.NotificationConnectors.NotificationConnector", b => - { - b.Property("NotificationConnectorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("NotificationConnectorType") - .HasColumnType("smallint"); - - b.HasKey("NotificationConnectorId"); - - b.ToTable("NotificationConnectors"); - - b.HasDiscriminator("NotificationConnectorType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("AuthorManga", b => - { - b.Property("AuthorsAuthorId") - .HasColumnType("character varying(64)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("AuthorsAuthorId", "MangaId"); - - b.HasIndex("MangaId"); - - b.ToTable("AuthorManga"); - }); - - modelBuilder.Entity("MangaMangaTag", b => - { - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("TagsTag") - .HasColumnType("text"); - - b.HasKey("MangaId", "TagsTag"); - - b.HasIndex("TagsTag"); - - b.ToTable("MangaMangaTag"); - }); - - modelBuilder.Entity("API.Schema.Jobs.DownloadNewChaptersJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("MangaId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.HasIndex("MangaId"); - - b.HasDiscriminator().HasValue((byte)1); - }); - - modelBuilder.Entity("API.Schema.Jobs.DownloadSingleChapterJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("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("FromLocation") - .IsRequired() - .HasColumnType("text"); - - b.Property("ToLocation") - .IsRequired() - .HasColumnType("text"); - - b.HasDiscriminator().HasValue((byte)3); - }); - - modelBuilder.Entity("API.Schema.Jobs.UpdateMetadataJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("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.NotificationConnectors.Gotify", b => - { - b.HasBaseType("API.Schema.NotificationConnectors.NotificationConnector"); - - b.Property("AppToken") - .IsRequired() - .HasColumnType("text"); - - b.Property("Endpoint") - .IsRequired() - .HasColumnType("text"); - - b.HasDiscriminator().HasValue((byte)0); - }); - - modelBuilder.Entity("API.Schema.NotificationConnectors.Lunasea", b => - { - b.HasBaseType("API.Schema.NotificationConnectors.NotificationConnector"); - - b.Property("Id") - .IsRequired() - .HasColumnType("text"); - - b.HasDiscriminator().HasValue((byte)1); - }); - - modelBuilder.Entity("API.Schema.NotificationConnectors.Ntfy", b => - { - b.HasBaseType("API.Schema.NotificationConnectors.NotificationConnector"); - - b.Property("Auth") - .IsRequired() - .HasColumnType("text"); - - b.Property("Endpoint") - .IsRequired() - .HasColumnType("text"); - - b.Property("Topic") - .IsRequired() - .HasColumnType("text"); - - b.ToTable("NotificationConnectors", t => - { - t.Property("Endpoint") - .HasColumnName("Ntfy_Endpoint"); - }); - - b.HasDiscriminator().HasValue((byte)2); - }); - - 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.DownloadNewChaptersJob", 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.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/20250303145324_dev-030325-2.Designer.cs b/API/Migrations/20250303145324_dev-030325-2.Designer.cs deleted file mode 100644 index a28e0b6..0000000 --- a/API/Migrations/20250303145324_dev-030325-2.Designer.cs +++ /dev/null @@ -1,672 +0,0 @@ -// -using System; -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("20250303145324_dev-030325-2")] - partial class dev0303252 - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "9.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("API.Schema.Author", b => - { - b.Property("AuthorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("AuthorName") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("AuthorId"); - - b.ToTable("Authors"); - }); - - modelBuilder.Entity("API.Schema.Chapter", b => - { - b.Property("ChapterId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("ArchiveFileName") - .IsRequired() - .HasColumnType("text"); - - b.Property("ChapterNumber") - .IsRequired() - .HasMaxLength(10) - .HasColumnType("character varying(10)"); - - b.Property("Downloaded") - .HasColumnType("boolean"); - - b.Property("ParentMangaId") - .IsRequired() - .HasColumnType("character varying(64)"); - - b.Property("Title") - .HasColumnType("text"); - - b.Property("Url") - .IsRequired() - .HasColumnType("text"); - - b.Property("VolumeNumber") - .HasColumnType("integer"); - - b.HasKey("ChapterId"); - - b.HasIndex("ParentMangaId"); - - b.ToTable("Chapters"); - }); - - modelBuilder.Entity("API.Schema.Jobs.Job", b => - { - b.Property("JobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.PrimitiveCollection("DependsOnJobsIds") - .HasMaxLength(64) - .HasColumnType("text[]"); - - b.Property("JobId1") - .HasColumnType("character varying(64)"); - - b.Property("JobType") - .HasColumnType("smallint"); - - b.Property("LastExecution") - .HasColumnType("timestamp with time zone"); - - b.Property("ParentJobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("RecurrenceMs") - .HasColumnType("numeric(20,0)"); - - b.Property("state") - .HasColumnType("smallint"); - - b.HasKey("JobId"); - - b.HasIndex("JobId1"); - - b.HasIndex("ParentJobId"); - - b.ToTable("Jobs"); - - b.HasDiscriminator("JobType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.LibraryConnectors.LibraryConnector", b => - { - b.Property("LibraryConnectorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Auth") - .IsRequired() - .HasColumnType("text"); - - b.Property("BaseUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("LibraryType") - .HasColumnType("smallint"); - - b.HasKey("LibraryConnectorId"); - - b.ToTable("LibraryConnectors"); - - b.HasDiscriminator("LibraryType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.Link", b => - { - b.Property("LinkId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("LinkProvider") - .IsRequired() - .HasColumnType("text"); - - b.Property("LinkUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("LinkId"); - - b.HasIndex("MangaId"); - - b.ToTable("Link"); - }); - - modelBuilder.Entity("API.Schema.Manga", b => - { - b.Property("MangaId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("ConnectorId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("CoverFileNameInCache") - .HasColumnType("text"); - - b.Property("CoverUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("Description") - .IsRequired() - .HasColumnType("text"); - - b.Property("FolderName") - .IsRequired() - .HasColumnType("text"); - - b.Property("IgnoreChapterBefore") - .HasColumnType("real"); - - b.Property("MangaConnectorId") - .IsRequired() - .HasColumnType("character varying(32)"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("OriginalLanguage") - .HasColumnType("text"); - - b.Property("ReleaseStatus") - .HasColumnType("smallint"); - - b.Property("WebsiteUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("Year") - .HasColumnType("bigint"); - - b.HasKey("MangaId"); - - b.HasIndex("MangaConnectorId"); - - b.ToTable("Manga"); - }); - - modelBuilder.Entity("API.Schema.MangaAltTitle", b => - { - b.Property("AltTitleId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Language") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("character varying(8)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("AltTitleId"); - - b.HasIndex("MangaId"); - - b.ToTable("AltTitles"); - }); - - modelBuilder.Entity("API.Schema.MangaConnectors.MangaConnector", b => - { - b.Property("Name") - .HasMaxLength(32) - .HasColumnType("character varying(32)"); - - b.PrimitiveCollection("BaseUris") - .IsRequired() - .HasColumnType("text[]"); - - b.PrimitiveCollection("SupportedLanguages") - .IsRequired() - .HasColumnType("text[]"); - - b.HasKey("Name"); - - b.ToTable("MangaConnectors"); - - b.HasDiscriminator("Name").HasValue("MangaConnector"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.MangaTag", b => - { - b.Property("Tag") - .HasColumnType("text"); - - b.HasKey("Tag"); - - b.ToTable("Tags"); - }); - - modelBuilder.Entity("API.Schema.Notification", b => - { - b.Property("NotificationId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Date") - .HasColumnType("timestamp with time zone"); - - b.Property("Message") - .IsRequired() - .HasColumnType("text"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text"); - - b.Property("Urgency") - .HasColumnType("smallint"); - - b.HasKey("NotificationId"); - - b.ToTable("Notifications"); - }); - - modelBuilder.Entity("API.Schema.NotificationConnectors.NotificationConnector", b => - { - b.Property("NotificationConnectorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("NotificationConnectorType") - .HasColumnType("smallint"); - - b.HasKey("NotificationConnectorId"); - - b.ToTable("NotificationConnectors"); - - b.HasDiscriminator("NotificationConnectorType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("AuthorManga", b => - { - b.Property("AuthorsAuthorId") - .HasColumnType("character varying(64)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("AuthorsAuthorId", "MangaId"); - - b.HasIndex("MangaId"); - - b.ToTable("AuthorManga"); - }); - - modelBuilder.Entity("MangaMangaTag", b => - { - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("TagsTag") - .HasColumnType("text"); - - b.HasKey("MangaId", "TagsTag"); - - b.HasIndex("TagsTag"); - - b.ToTable("MangaMangaTag"); - }); - - modelBuilder.Entity("API.Schema.Jobs.DownloadNewChaptersJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("MangaId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.HasIndex("MangaId"); - - b.HasDiscriminator().HasValue((byte)1); - }); - - modelBuilder.Entity("API.Schema.Jobs.DownloadSingleChapterJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("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("FromLocation") - .IsRequired() - .HasColumnType("text"); - - b.Property("ToLocation") - .IsRequired() - .HasColumnType("text"); - - b.HasDiscriminator().HasValue((byte)3); - }); - - modelBuilder.Entity("API.Schema.Jobs.UpdateMetadataJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("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.NotificationConnectors.Gotify", b => - { - b.HasBaseType("API.Schema.NotificationConnectors.NotificationConnector"); - - b.Property("AppToken") - .IsRequired() - .HasColumnType("text"); - - b.Property("Endpoint") - .IsRequired() - .HasColumnType("text"); - - b.HasDiscriminator().HasValue((byte)0); - }); - - modelBuilder.Entity("API.Schema.NotificationConnectors.Lunasea", b => - { - b.HasBaseType("API.Schema.NotificationConnectors.NotificationConnector"); - - b.Property("Id") - .IsRequired() - .HasColumnType("text"); - - b.HasDiscriminator().HasValue((byte)1); - }); - - modelBuilder.Entity("API.Schema.NotificationConnectors.Ntfy", b => - { - b.HasBaseType("API.Schema.NotificationConnectors.NotificationConnector"); - - b.Property("Auth") - .IsRequired() - .HasColumnType("text"); - - b.Property("Endpoint") - .IsRequired() - .HasColumnType("text"); - - b.Property("Topic") - .IsRequired() - .HasColumnType("text"); - - b.ToTable("NotificationConnectors", t => - { - t.Property("Endpoint") - .HasColumnName("Ntfy_Endpoint"); - }); - - b.HasDiscriminator().HasValue((byte)2); - }); - - 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.DownloadNewChaptersJob", 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.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/20250303145324_dev-030325-2.cs b/API/Migrations/20250303145324_dev-030325-2.cs deleted file mode 100644 index eb06ab4..0000000 --- a/API/Migrations/20250303145324_dev-030325-2.cs +++ /dev/null @@ -1,34 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace API.Migrations -{ - /// - public partial class dev0303252 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "state", - table: "Jobs", - type: "smallint", - nullable: false, - oldClrType: typeof(int), - oldType: "integer"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "state", - table: "Jobs", - type: "integer", - nullable: false, - oldClrType: typeof(byte), - oldType: "smallint"); - } - } -} diff --git a/API/Migrations/20250303152212_dev-030325-3.Designer.cs b/API/Migrations/20250303152212_dev-030325-3.Designer.cs deleted file mode 100644 index 3c5b880..0000000 --- a/API/Migrations/20250303152212_dev-030325-3.Designer.cs +++ /dev/null @@ -1,672 +0,0 @@ -// -using System; -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("20250303152212_dev-030325-3")] - partial class dev0303253 - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "9.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("API.Schema.Author", b => - { - b.Property("AuthorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("AuthorName") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("AuthorId"); - - b.ToTable("Authors"); - }); - - modelBuilder.Entity("API.Schema.Chapter", b => - { - b.Property("ChapterId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("ArchiveFileName") - .IsRequired() - .HasColumnType("text"); - - b.Property("ChapterNumber") - .IsRequired() - .HasMaxLength(10) - .HasColumnType("character varying(10)"); - - b.Property("Downloaded") - .HasColumnType("boolean"); - - b.Property("ParentMangaId") - .IsRequired() - .HasColumnType("character varying(64)"); - - b.Property("Title") - .HasColumnType("text"); - - b.Property("Url") - .IsRequired() - .HasColumnType("text"); - - b.Property("VolumeNumber") - .HasColumnType("integer"); - - b.HasKey("ChapterId"); - - b.HasIndex("ParentMangaId"); - - b.ToTable("Chapters"); - }); - - modelBuilder.Entity("API.Schema.Jobs.Job", b => - { - b.Property("JobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.PrimitiveCollection("DependsOnJobsIds") - .HasMaxLength(64) - .HasColumnType("text[]"); - - b.Property("JobId1") - .HasColumnType("character varying(64)"); - - b.Property("JobType") - .HasColumnType("smallint"); - - b.Property("LastExecution") - .HasColumnType("timestamp with time zone"); - - b.Property("ParentJobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("RecurrenceMs") - .HasColumnType("numeric(20,0)"); - - b.Property("state") - .HasColumnType("smallint"); - - b.HasKey("JobId"); - - b.HasIndex("JobId1"); - - b.HasIndex("ParentJobId"); - - b.ToTable("Jobs"); - - b.HasDiscriminator("JobType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.LibraryConnectors.LibraryConnector", b => - { - b.Property("LibraryConnectorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Auth") - .IsRequired() - .HasColumnType("text"); - - b.Property("BaseUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("LibraryType") - .HasColumnType("smallint"); - - b.HasKey("LibraryConnectorId"); - - b.ToTable("LibraryConnectors"); - - b.HasDiscriminator("LibraryType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.Link", b => - { - b.Property("LinkId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("LinkProvider") - .IsRequired() - .HasColumnType("text"); - - b.Property("LinkUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("LinkId"); - - b.HasIndex("MangaId"); - - b.ToTable("Link"); - }); - - modelBuilder.Entity("API.Schema.Manga", b => - { - b.Property("MangaId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("ConnectorId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("CoverFileNameInCache") - .HasColumnType("text"); - - b.Property("CoverUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("Description") - .IsRequired() - .HasColumnType("text"); - - b.Property("FolderName") - .IsRequired() - .HasColumnType("text"); - - b.Property("IgnoreChapterBefore") - .HasColumnType("real"); - - b.Property("MangaConnectorId") - .IsRequired() - .HasColumnType("character varying(32)"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("OriginalLanguage") - .HasColumnType("text"); - - b.Property("ReleaseStatus") - .HasColumnType("smallint"); - - b.Property("WebsiteUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("Year") - .HasColumnType("bigint"); - - b.HasKey("MangaId"); - - b.HasIndex("MangaConnectorId"); - - b.ToTable("Manga"); - }); - - modelBuilder.Entity("API.Schema.MangaAltTitle", b => - { - b.Property("AltTitleId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Language") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("character varying(8)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("AltTitleId"); - - b.HasIndex("MangaId"); - - b.ToTable("AltTitles"); - }); - - modelBuilder.Entity("API.Schema.MangaConnectors.MangaConnector", b => - { - b.Property("Name") - .HasMaxLength(32) - .HasColumnType("character varying(32)"); - - b.PrimitiveCollection("BaseUris") - .IsRequired() - .HasColumnType("text[]"); - - b.PrimitiveCollection("SupportedLanguages") - .IsRequired() - .HasColumnType("text[]"); - - b.HasKey("Name"); - - b.ToTable("MangaConnectors"); - - b.HasDiscriminator("Name").HasValue("MangaConnector"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.MangaTag", b => - { - b.Property("Tag") - .HasColumnType("text"); - - b.HasKey("Tag"); - - b.ToTable("Tags"); - }); - - modelBuilder.Entity("API.Schema.Notification", b => - { - b.Property("NotificationId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Date") - .HasColumnType("timestamp with time zone"); - - b.Property("Message") - .IsRequired() - .HasColumnType("text"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text"); - - b.Property("Urgency") - .HasColumnType("smallint"); - - b.HasKey("NotificationId"); - - b.ToTable("Notifications"); - }); - - modelBuilder.Entity("API.Schema.NotificationConnectors.NotificationConnector", b => - { - b.Property("NotificationConnectorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("NotificationConnectorType") - .HasColumnType("smallint"); - - b.HasKey("NotificationConnectorId"); - - b.ToTable("NotificationConnectors"); - - b.HasDiscriminator("NotificationConnectorType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("AuthorManga", b => - { - b.Property("AuthorsAuthorId") - .HasColumnType("character varying(64)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("AuthorsAuthorId", "MangaId"); - - b.HasIndex("MangaId"); - - b.ToTable("AuthorManga"); - }); - - modelBuilder.Entity("MangaMangaTag", b => - { - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("TagsTag") - .HasColumnType("text"); - - b.HasKey("MangaId", "TagsTag"); - - b.HasIndex("TagsTag"); - - b.ToTable("MangaMangaTag"); - }); - - modelBuilder.Entity("API.Schema.Jobs.DownloadNewChaptersJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("MangaId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.HasIndex("MangaId"); - - b.HasDiscriminator().HasValue((byte)1); - }); - - modelBuilder.Entity("API.Schema.Jobs.DownloadSingleChapterJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("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("FromLocation") - .IsRequired() - .HasColumnType("text"); - - b.Property("ToLocation") - .IsRequired() - .HasColumnType("text"); - - b.HasDiscriminator().HasValue((byte)3); - }); - - modelBuilder.Entity("API.Schema.Jobs.UpdateMetadataJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("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.NotificationConnectors.Gotify", b => - { - b.HasBaseType("API.Schema.NotificationConnectors.NotificationConnector"); - - b.Property("AppToken") - .IsRequired() - .HasColumnType("text"); - - b.Property("Endpoint") - .IsRequired() - .HasColumnType("text"); - - b.HasDiscriminator().HasValue((byte)0); - }); - - modelBuilder.Entity("API.Schema.NotificationConnectors.Lunasea", b => - { - b.HasBaseType("API.Schema.NotificationConnectors.NotificationConnector"); - - b.Property("Id") - .IsRequired() - .HasColumnType("text"); - - b.HasDiscriminator().HasValue((byte)1); - }); - - modelBuilder.Entity("API.Schema.NotificationConnectors.Ntfy", b => - { - b.HasBaseType("API.Schema.NotificationConnectors.NotificationConnector"); - - b.Property("Auth") - .IsRequired() - .HasColumnType("text"); - - b.Property("Endpoint") - .IsRequired() - .HasColumnType("text"); - - b.Property("Topic") - .IsRequired() - .HasColumnType("text"); - - b.ToTable("NotificationConnectors", t => - { - t.Property("Endpoint") - .HasColumnName("Ntfy_Endpoint"); - }); - - b.HasDiscriminator().HasValue((byte)2); - }); - - 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.DownloadNewChaptersJob", 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.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/20250303152212_dev-030325-3.cs b/API/Migrations/20250303152212_dev-030325-3.cs deleted file mode 100644 index 1490e66..0000000 --- a/API/Migrations/20250303152212_dev-030325-3.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace API.Migrations -{ - /// - public partial class dev0303253 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - - } - } -} diff --git a/API/Migrations/20250307104111_dev-070325-1.Designer.cs b/API/Migrations/20250307104111_dev-070325-1.Designer.cs deleted file mode 100644 index fac3d4b..0000000 --- a/API/Migrations/20250307104111_dev-070325-1.Designer.cs +++ /dev/null @@ -1,678 +0,0 @@ -// -using System; -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("20250307104111_dev-070325-1")] - partial class dev0703251 - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "9.0.2") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("API.Schema.Author", b => - { - b.Property("AuthorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("AuthorName") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("AuthorId"); - - b.ToTable("Authors"); - }); - - modelBuilder.Entity("API.Schema.Chapter", b => - { - b.Property("ChapterId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("ArchiveFileName") - .IsRequired() - .HasColumnType("text"); - - b.Property("ChapterNumber") - .IsRequired() - .HasMaxLength(10) - .HasColumnType("character varying(10)"); - - b.Property("Downloaded") - .HasColumnType("boolean"); - - b.Property("ParentMangaId") - .IsRequired() - .HasColumnType("character varying(64)"); - - b.Property("Title") - .HasColumnType("text"); - - b.Property("Url") - .IsRequired() - .HasColumnType("text"); - - b.Property("VolumeNumber") - .HasColumnType("integer"); - - b.HasKey("ChapterId"); - - b.HasIndex("ParentMangaId"); - - b.ToTable("Chapters"); - }); - - modelBuilder.Entity("API.Schema.Jobs.Job", b => - { - b.Property("JobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.PrimitiveCollection("DependsOnJobsIds") - .HasMaxLength(64) - .HasColumnType("text[]"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("JobId1") - .HasColumnType("character varying(64)"); - - b.Property("JobType") - .HasColumnType("smallint"); - - b.Property("LastExecution") - .HasColumnType("timestamp with time zone"); - - b.Property("ParentJobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("RecurrenceMs") - .HasColumnType("numeric(20,0)"); - - b.Property("state") - .HasColumnType("smallint"); - - b.HasKey("JobId"); - - b.HasIndex("JobId1"); - - b.HasIndex("ParentJobId"); - - b.ToTable("Jobs"); - - b.HasDiscriminator("JobType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.LibraryConnectors.LibraryConnector", b => - { - b.Property("LibraryConnectorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Auth") - .IsRequired() - .HasColumnType("text"); - - b.Property("BaseUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("LibraryType") - .HasColumnType("smallint"); - - b.HasKey("LibraryConnectorId"); - - b.ToTable("LibraryConnectors"); - - b.HasDiscriminator("LibraryType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.Link", b => - { - b.Property("LinkId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("LinkProvider") - .IsRequired() - .HasColumnType("text"); - - b.Property("LinkUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("LinkId"); - - b.HasIndex("MangaId"); - - b.ToTable("Link"); - }); - - modelBuilder.Entity("API.Schema.Manga", b => - { - b.Property("MangaId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("ConnectorId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("CoverFileNameInCache") - .HasColumnType("text"); - - b.Property("CoverUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("Description") - .IsRequired() - .HasColumnType("text"); - - b.Property("FolderName") - .IsRequired() - .HasColumnType("text"); - - b.Property("IgnoreChapterBefore") - .HasColumnType("real"); - - b.Property("MangaConnectorId") - .IsRequired() - .HasColumnType("character varying(32)"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("OriginalLanguage") - .HasColumnType("text"); - - b.Property("ReleaseStatus") - .HasColumnType("smallint"); - - b.Property("WebsiteUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("Year") - .HasColumnType("bigint"); - - b.HasKey("MangaId"); - - b.HasIndex("MangaConnectorId"); - - b.ToTable("Manga"); - }); - - modelBuilder.Entity("API.Schema.MangaAltTitle", b => - { - b.Property("AltTitleId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Language") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("character varying(8)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("AltTitleId"); - - b.HasIndex("MangaId"); - - b.ToTable("AltTitles"); - }); - - modelBuilder.Entity("API.Schema.MangaConnectors.MangaConnector", b => - { - b.Property("Name") - .HasMaxLength(32) - .HasColumnType("character varying(32)"); - - b.PrimitiveCollection("BaseUris") - .IsRequired() - .HasColumnType("text[]"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.PrimitiveCollection("SupportedLanguages") - .IsRequired() - .HasColumnType("text[]"); - - b.HasKey("Name"); - - b.ToTable("MangaConnectors"); - - b.HasDiscriminator("Name").HasValue("MangaConnector"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.MangaTag", b => - { - b.Property("Tag") - .HasColumnType("text"); - - b.HasKey("Tag"); - - b.ToTable("Tags"); - }); - - modelBuilder.Entity("API.Schema.Notification", b => - { - b.Property("NotificationId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Date") - .HasColumnType("timestamp with time zone"); - - b.Property("Message") - .IsRequired() - .HasColumnType("text"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text"); - - b.Property("Urgency") - .HasColumnType("smallint"); - - b.HasKey("NotificationId"); - - b.ToTable("Notifications"); - }); - - modelBuilder.Entity("API.Schema.NotificationConnectors.NotificationConnector", b => - { - b.Property("NotificationConnectorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("NotificationConnectorType") - .HasColumnType("smallint"); - - b.HasKey("NotificationConnectorId"); - - b.ToTable("NotificationConnectors"); - - b.HasDiscriminator("NotificationConnectorType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("AuthorManga", b => - { - b.Property("AuthorsAuthorId") - .HasColumnType("character varying(64)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("AuthorsAuthorId", "MangaId"); - - b.HasIndex("MangaId"); - - b.ToTable("AuthorManga"); - }); - - modelBuilder.Entity("MangaMangaTag", b => - { - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("TagsTag") - .HasColumnType("text"); - - b.HasKey("MangaId", "TagsTag"); - - b.HasIndex("TagsTag"); - - b.ToTable("MangaMangaTag"); - }); - - modelBuilder.Entity("API.Schema.Jobs.DownloadNewChaptersJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("MangaId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.HasIndex("MangaId"); - - b.HasDiscriminator().HasValue((byte)1); - }); - - modelBuilder.Entity("API.Schema.Jobs.DownloadSingleChapterJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("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("FromLocation") - .IsRequired() - .HasColumnType("text"); - - b.Property("ToLocation") - .IsRequired() - .HasColumnType("text"); - - b.HasDiscriminator().HasValue((byte)3); - }); - - modelBuilder.Entity("API.Schema.Jobs.UpdateMetadataJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("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.NotificationConnectors.Gotify", b => - { - b.HasBaseType("API.Schema.NotificationConnectors.NotificationConnector"); - - b.Property("AppToken") - .IsRequired() - .HasColumnType("text"); - - b.Property("Endpoint") - .IsRequired() - .HasColumnType("text"); - - b.HasDiscriminator().HasValue((byte)0); - }); - - modelBuilder.Entity("API.Schema.NotificationConnectors.Lunasea", b => - { - b.HasBaseType("API.Schema.NotificationConnectors.NotificationConnector"); - - b.Property("Id") - .IsRequired() - .HasColumnType("text"); - - b.HasDiscriminator().HasValue((byte)1); - }); - - modelBuilder.Entity("API.Schema.NotificationConnectors.Ntfy", b => - { - b.HasBaseType("API.Schema.NotificationConnectors.NotificationConnector"); - - b.Property("Auth") - .IsRequired() - .HasColumnType("text"); - - b.Property("Endpoint") - .IsRequired() - .HasColumnType("text"); - - b.Property("Topic") - .IsRequired() - .HasColumnType("text"); - - b.ToTable("NotificationConnectors", t => - { - t.Property("Endpoint") - .HasColumnName("Ntfy_Endpoint"); - }); - - b.HasDiscriminator().HasValue((byte)2); - }); - - 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.DownloadNewChaptersJob", 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.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/20250307104111_dev-070325-1.cs b/API/Migrations/20250307104111_dev-070325-1.cs deleted file mode 100644 index e7a785b..0000000 --- a/API/Migrations/20250307104111_dev-070325-1.cs +++ /dev/null @@ -1,40 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace API.Migrations -{ - /// - public partial class dev0703251 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "Enabled", - table: "MangaConnectors", - type: "boolean", - nullable: false, - defaultValue: false); - - migrationBuilder.AddColumn( - name: "Enabled", - table: "Jobs", - type: "boolean", - nullable: false, - defaultValue: false); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "Enabled", - table: "MangaConnectors"); - - migrationBuilder.DropColumn( - name: "Enabled", - table: "Jobs"); - } - } -} diff --git a/API/Migrations/20250307125727_dev-070325-2.Designer.cs b/API/Migrations/20250307125727_dev-070325-2.Designer.cs deleted file mode 100644 index 1694bb0..0000000 --- a/API/Migrations/20250307125727_dev-070325-2.Designer.cs +++ /dev/null @@ -1,709 +0,0 @@ -// -using System; -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("20250307125727_dev-070325-2")] - partial class dev0703252 - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "9.0.2") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("API.Schema.Author", b => - { - b.Property("AuthorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("AuthorName") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("AuthorId"); - - b.ToTable("Authors"); - }); - - modelBuilder.Entity("API.Schema.Chapter", b => - { - b.Property("ChapterId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("ArchiveFileName") - .IsRequired() - .HasColumnType("text"); - - b.Property("ChapterNumber") - .IsRequired() - .HasMaxLength(10) - .HasColumnType("character varying(10)"); - - b.Property("Downloaded") - .HasColumnType("boolean"); - - b.Property("ParentMangaId") - .IsRequired() - .HasColumnType("character varying(64)"); - - b.Property("Title") - .HasColumnType("text"); - - b.Property("Url") - .IsRequired() - .HasColumnType("text"); - - b.Property("VolumeNumber") - .HasColumnType("integer"); - - b.HasKey("ChapterId"); - - b.HasIndex("ParentMangaId"); - - b.ToTable("Chapters"); - }); - - modelBuilder.Entity("API.Schema.Jobs.Job", b => - { - b.Property("JobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.PrimitiveCollection("DependsOnJobsIds") - .HasMaxLength(64) - .HasColumnType("text[]"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("JobId1") - .HasColumnType("character varying(64)"); - - b.Property("JobType") - .HasColumnType("smallint"); - - b.Property("LastExecution") - .HasColumnType("timestamp with time zone"); - - b.Property("ParentJobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("RecurrenceMs") - .HasColumnType("numeric(20,0)"); - - b.Property("state") - .HasColumnType("smallint"); - - b.HasKey("JobId"); - - b.HasIndex("JobId1"); - - b.HasIndex("ParentJobId"); - - b.ToTable("Jobs"); - - b.HasDiscriminator("JobType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.LibraryConnectors.LibraryConnector", b => - { - b.Property("LibraryConnectorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Auth") - .IsRequired() - .HasColumnType("text"); - - b.Property("BaseUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("LibraryType") - .HasColumnType("smallint"); - - b.HasKey("LibraryConnectorId"); - - b.ToTable("LibraryConnectors"); - - b.HasDiscriminator("LibraryType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.Link", b => - { - b.Property("LinkId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("LinkProvider") - .IsRequired() - .HasColumnType("text"); - - b.Property("LinkUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("LinkId"); - - b.HasIndex("MangaId"); - - b.ToTable("Link"); - }); - - modelBuilder.Entity("API.Schema.Manga", b => - { - b.Property("MangaId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("ConnectorId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("CoverFileNameInCache") - .HasColumnType("text"); - - b.Property("CoverUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("Description") - .IsRequired() - .HasColumnType("text"); - - b.Property("FolderName") - .IsRequired() - .HasColumnType("text"); - - b.Property("IgnoreChapterBefore") - .HasColumnType("real"); - - b.Property("MangaConnectorId") - .IsRequired() - .HasColumnType("character varying(32)"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("OriginalLanguage") - .HasColumnType("text"); - - b.Property("ReleaseStatus") - .HasColumnType("smallint"); - - b.Property("WebsiteUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("Year") - .HasColumnType("bigint"); - - b.HasKey("MangaId"); - - b.HasIndex("MangaConnectorId"); - - b.ToTable("Manga"); - }); - - modelBuilder.Entity("API.Schema.MangaAltTitle", b => - { - b.Property("AltTitleId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Language") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("character varying(8)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("AltTitleId"); - - b.HasIndex("MangaId"); - - b.ToTable("AltTitles"); - }); - - modelBuilder.Entity("API.Schema.MangaConnectors.MangaConnector", b => - { - b.Property("Name") - .HasMaxLength(32) - .HasColumnType("character varying(32)"); - - b.PrimitiveCollection("BaseUris") - .IsRequired() - .HasColumnType("text[]"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.PrimitiveCollection("SupportedLanguages") - .IsRequired() - .HasColumnType("text[]"); - - b.HasKey("Name"); - - b.ToTable("MangaConnectors"); - - b.HasDiscriminator("Name").HasValue("MangaConnector"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.MangaTag", b => - { - b.Property("Tag") - .HasColumnType("text"); - - b.HasKey("Tag"); - - b.ToTable("Tags"); - }); - - modelBuilder.Entity("API.Schema.Notification", b => - { - b.Property("NotificationId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Date") - .HasColumnType("timestamp with time zone"); - - b.Property("Message") - .IsRequired() - .HasColumnType("text"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text"); - - b.Property("Urgency") - .HasColumnType("smallint"); - - b.HasKey("NotificationId"); - - b.ToTable("Notifications"); - }); - - modelBuilder.Entity("API.Schema.NotificationConnectors.NotificationConnector", b => - { - b.Property("NotificationConnectorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("NotificationConnectorType") - .HasColumnType("smallint"); - - b.HasKey("NotificationConnectorId"); - - b.ToTable("NotificationConnectors"); - - b.HasDiscriminator("NotificationConnectorType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("AuthorManga", b => - { - b.Property("AuthorsAuthorId") - .HasColumnType("character varying(64)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("AuthorsAuthorId", "MangaId"); - - b.HasIndex("MangaId"); - - b.ToTable("AuthorManga"); - }); - - modelBuilder.Entity("MangaMangaTag", b => - { - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("TagsTag") - .HasColumnType("text"); - - b.HasKey("MangaId", "TagsTag"); - - b.HasIndex("TagsTag"); - - b.ToTable("MangaMangaTag"); - }); - - modelBuilder.Entity("API.Schema.Jobs.DownloadMangaCoverJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("MangaId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.HasIndex("MangaId"); - - b.ToTable("Jobs", t => - { - t.Property("MangaId") - .HasColumnName("DownloadMangaCoverJob_MangaId"); - }); - - b.HasDiscriminator().HasValue((byte)4); - }); - - modelBuilder.Entity("API.Schema.Jobs.DownloadNewChaptersJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("MangaId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.HasIndex("MangaId"); - - b.HasDiscriminator().HasValue((byte)1); - }); - - modelBuilder.Entity("API.Schema.Jobs.DownloadSingleChapterJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("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("FromLocation") - .IsRequired() - .HasColumnType("text"); - - b.Property("ToLocation") - .IsRequired() - .HasColumnType("text"); - - b.HasDiscriminator().HasValue((byte)3); - }); - - modelBuilder.Entity("API.Schema.Jobs.UpdateMetadataJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("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.NotificationConnectors.Gotify", b => - { - b.HasBaseType("API.Schema.NotificationConnectors.NotificationConnector"); - - b.Property("AppToken") - .IsRequired() - .HasColumnType("text"); - - b.Property("Endpoint") - .IsRequired() - .HasColumnType("text"); - - b.HasDiscriminator().HasValue((byte)0); - }); - - modelBuilder.Entity("API.Schema.NotificationConnectors.Lunasea", b => - { - b.HasBaseType("API.Schema.NotificationConnectors.NotificationConnector"); - - b.Property("Id") - .IsRequired() - .HasColumnType("text"); - - b.HasDiscriminator().HasValue((byte)1); - }); - - modelBuilder.Entity("API.Schema.NotificationConnectors.Ntfy", b => - { - b.HasBaseType("API.Schema.NotificationConnectors.NotificationConnector"); - - b.Property("Auth") - .IsRequired() - .HasColumnType("text"); - - b.Property("Endpoint") - .IsRequired() - .HasColumnType("text"); - - b.Property("Topic") - .IsRequired() - .HasColumnType("text"); - - b.ToTable("NotificationConnectors", t => - { - t.Property("Endpoint") - .HasColumnName("Ntfy_Endpoint"); - }); - - b.HasDiscriminator().HasValue((byte)2); - }); - - 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.DownloadMangaCoverJob", b => - { - b.HasOne("API.Schema.Manga", "Manga") - .WithMany() - .HasForeignKey("MangaId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Manga"); - }); - - modelBuilder.Entity("API.Schema.Jobs.DownloadNewChaptersJob", 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.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/20250307125727_dev-070325-2.cs b/API/Migrations/20250307125727_dev-070325-2.cs deleted file mode 100644 index bf3b03c..0000000 --- a/API/Migrations/20250307125727_dev-070325-2.cs +++ /dev/null @@ -1,50 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace API.Migrations -{ - /// - public partial class dev0703252 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "DownloadMangaCoverJob_MangaId", - table: "Jobs", - type: "character varying(64)", - maxLength: 64, - nullable: true); - - migrationBuilder.CreateIndex( - name: "IX_Jobs_DownloadMangaCoverJob_MangaId", - table: "Jobs", - column: "DownloadMangaCoverJob_MangaId"); - - migrationBuilder.AddForeignKey( - name: "FK_Jobs_Manga_DownloadMangaCoverJob_MangaId", - table: "Jobs", - column: "DownloadMangaCoverJob_MangaId", - principalTable: "Manga", - principalColumn: "MangaId", - onDelete: ReferentialAction.Cascade); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "FK_Jobs_Manga_DownloadMangaCoverJob_MangaId", - table: "Jobs"); - - migrationBuilder.DropIndex( - name: "IX_Jobs_DownloadMangaCoverJob_MangaId", - table: "Jobs"); - - migrationBuilder.DropColumn( - name: "DownloadMangaCoverJob_MangaId", - table: "Jobs"); - } - } -} diff --git a/API/Migrations/20250307143019_dev-070325-3.Designer.cs b/API/Migrations/20250307143019_dev-070325-3.Designer.cs deleted file mode 100644 index 3098d08..0000000 --- a/API/Migrations/20250307143019_dev-070325-3.Designer.cs +++ /dev/null @@ -1,669 +0,0 @@ -// -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("20250307143019_dev-070325-3")] - partial class dev0703253 - { - /// - 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("AuthorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("AuthorName") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("AuthorId"); - - b.ToTable("Authors"); - }); - - modelBuilder.Entity("API.Schema.Chapter", b => - { - b.Property("ChapterId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("ArchiveFileName") - .IsRequired() - .HasColumnType("text"); - - b.Property("ChapterNumber") - .IsRequired() - .HasMaxLength(10) - .HasColumnType("character varying(10)"); - - b.Property("Downloaded") - .HasColumnType("boolean"); - - b.Property("ParentMangaId") - .IsRequired() - .HasColumnType("character varying(64)"); - - b.Property("Title") - .HasColumnType("text"); - - b.Property("Url") - .IsRequired() - .HasColumnType("text"); - - b.Property("VolumeNumber") - .HasColumnType("integer"); - - b.HasKey("ChapterId"); - - b.HasIndex("ParentMangaId"); - - b.ToTable("Chapters"); - }); - - modelBuilder.Entity("API.Schema.Jobs.Job", b => - { - b.Property("JobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.PrimitiveCollection("DependsOnJobsIds") - .HasMaxLength(64) - .HasColumnType("text[]"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("JobId1") - .HasColumnType("character varying(64)"); - - b.Property("JobType") - .HasColumnType("smallint"); - - b.Property("LastExecution") - .HasColumnType("timestamp with time zone"); - - b.Property("ParentJobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("RecurrenceMs") - .HasColumnType("numeric(20,0)"); - - b.Property("state") - .HasColumnType("smallint"); - - b.HasKey("JobId"); - - b.HasIndex("JobId1"); - - b.HasIndex("ParentJobId"); - - b.ToTable("Jobs"); - - b.HasDiscriminator("JobType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.LibraryConnectors.LibraryConnector", b => - { - b.Property("LibraryConnectorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Auth") - .IsRequired() - .HasColumnType("text"); - - b.Property("BaseUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("LibraryType") - .HasColumnType("smallint"); - - b.HasKey("LibraryConnectorId"); - - b.ToTable("LibraryConnectors"); - - b.HasDiscriminator("LibraryType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.Link", b => - { - b.Property("LinkId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("LinkProvider") - .IsRequired() - .HasColumnType("text"); - - b.Property("LinkUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("LinkId"); - - b.HasIndex("MangaId"); - - b.ToTable("Link"); - }); - - modelBuilder.Entity("API.Schema.Manga", b => - { - b.Property("MangaId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("ConnectorId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("CoverFileNameInCache") - .HasColumnType("text"); - - b.Property("CoverUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("Description") - .IsRequired() - .HasColumnType("text"); - - b.Property("FolderName") - .IsRequired() - .HasColumnType("text"); - - b.Property("IgnoreChapterBefore") - .HasColumnType("real"); - - b.Property("MangaConnectorId") - .IsRequired() - .HasColumnType("character varying(32)"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("OriginalLanguage") - .HasColumnType("text"); - - b.Property("ReleaseStatus") - .HasColumnType("smallint"); - - b.Property("WebsiteUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("Year") - .HasColumnType("bigint"); - - b.HasKey("MangaId"); - - b.HasIndex("MangaConnectorId"); - - b.ToTable("Manga"); - }); - - modelBuilder.Entity("API.Schema.MangaAltTitle", b => - { - b.Property("AltTitleId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Language") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("character varying(8)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("AltTitleId"); - - b.HasIndex("MangaId"); - - b.ToTable("AltTitles"); - }); - - modelBuilder.Entity("API.Schema.MangaConnectors.MangaConnector", b => - { - b.Property("Name") - .HasMaxLength(32) - .HasColumnType("character varying(32)"); - - b.PrimitiveCollection("BaseUris") - .IsRequired() - .HasColumnType("text[]"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.PrimitiveCollection("SupportedLanguages") - .IsRequired() - .HasColumnType("text[]"); - - b.HasKey("Name"); - - b.ToTable("MangaConnectors"); - - b.HasDiscriminator("Name").HasValue("MangaConnector"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.MangaTag", b => - { - b.Property("Tag") - .HasColumnType("text"); - - b.HasKey("Tag"); - - b.ToTable("Tags"); - }); - - modelBuilder.Entity("API.Schema.Notification", b => - { - b.Property("NotificationId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Date") - .HasColumnType("timestamp with time zone"); - - b.Property("Message") - .IsRequired() - .HasColumnType("text"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text"); - - b.Property("Urgency") - .HasColumnType("smallint"); - - b.HasKey("NotificationId"); - - b.ToTable("Notifications"); - }); - - modelBuilder.Entity("API.Schema.NotificationConnectors.NotificationConnector", b => - { - b.Property("NotificationConnectorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Body") - .IsRequired() - .HasColumnType("text"); - - b.Property>("Headers") - .IsRequired() - .HasColumnType("hstore"); - - b.Property("HttpMethod") - .IsRequired() - .HasColumnType("text"); - - b.Property("Url") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("NotificationConnectorId"); - - b.ToTable("NotificationConnectors"); - }); - - modelBuilder.Entity("AuthorManga", b => - { - b.Property("AuthorsAuthorId") - .HasColumnType("character varying(64)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("AuthorsAuthorId", "MangaId"); - - b.HasIndex("MangaId"); - - b.ToTable("AuthorManga"); - }); - - modelBuilder.Entity("MangaMangaTag", b => - { - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("TagsTag") - .HasColumnType("text"); - - b.HasKey("MangaId", "TagsTag"); - - b.HasIndex("TagsTag"); - - b.ToTable("MangaMangaTag"); - }); - - modelBuilder.Entity("API.Schema.Jobs.DownloadMangaCoverJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("MangaId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.HasIndex("MangaId"); - - b.ToTable("Jobs", t => - { - t.Property("MangaId") - .HasColumnName("DownloadMangaCoverJob_MangaId"); - }); - - b.HasDiscriminator().HasValue((byte)4); - }); - - modelBuilder.Entity("API.Schema.Jobs.DownloadNewChaptersJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("MangaId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.HasIndex("MangaId"); - - b.HasDiscriminator().HasValue((byte)1); - }); - - modelBuilder.Entity("API.Schema.Jobs.DownloadSingleChapterJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("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("FromLocation") - .IsRequired() - .HasColumnType("text"); - - b.Property("ToLocation") - .IsRequired() - .HasColumnType("text"); - - b.HasDiscriminator().HasValue((byte)3); - }); - - modelBuilder.Entity("API.Schema.Jobs.UpdateMetadataJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("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.DownloadMangaCoverJob", b => - { - b.HasOne("API.Schema.Manga", "Manga") - .WithMany() - .HasForeignKey("MangaId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Manga"); - }); - - modelBuilder.Entity("API.Schema.Jobs.DownloadNewChaptersJob", 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.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/20250307143019_dev-070325-3.cs b/API/Migrations/20250307143019_dev-070325-3.cs deleted file mode 100644 index 0093ddd..0000000 --- a/API/Migrations/20250307143019_dev-070325-3.cs +++ /dev/null @@ -1,139 +0,0 @@ -using System.Collections.Generic; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace API.Migrations -{ - /// - public partial class dev0703253 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "AppToken", - table: "NotificationConnectors"); - - migrationBuilder.DropColumn( - name: "Auth", - table: "NotificationConnectors"); - - migrationBuilder.DropColumn( - name: "Endpoint", - table: "NotificationConnectors"); - - migrationBuilder.DropColumn( - name: "Id", - table: "NotificationConnectors"); - - migrationBuilder.DropColumn( - name: "NotificationConnectorType", - table: "NotificationConnectors"); - - migrationBuilder.DropColumn( - name: "Ntfy_Endpoint", - table: "NotificationConnectors"); - - migrationBuilder.DropColumn( - name: "Topic", - table: "NotificationConnectors"); - - migrationBuilder.AlterDatabase() - .Annotation("Npgsql:PostgresExtension:hstore", ",,"); - - migrationBuilder.AddColumn( - name: "Body", - table: "NotificationConnectors", - type: "text", - nullable: false, - defaultValue: ""); - - migrationBuilder.AddColumn>( - name: "Headers", - table: "NotificationConnectors", - type: "hstore", - nullable: false); - - migrationBuilder.AddColumn( - name: "HttpMethod", - table: "NotificationConnectors", - type: "text", - nullable: false, - defaultValue: ""); - - migrationBuilder.AddColumn( - name: "Url", - table: "NotificationConnectors", - type: "text", - nullable: false, - defaultValue: ""); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "Body", - table: "NotificationConnectors"); - - migrationBuilder.DropColumn( - name: "Headers", - table: "NotificationConnectors"); - - migrationBuilder.DropColumn( - name: "HttpMethod", - table: "NotificationConnectors"); - - migrationBuilder.DropColumn( - name: "Url", - table: "NotificationConnectors"); - - migrationBuilder.AlterDatabase() - .OldAnnotation("Npgsql:PostgresExtension:hstore", ",,"); - - migrationBuilder.AddColumn( - name: "AppToken", - table: "NotificationConnectors", - type: "text", - nullable: true); - - migrationBuilder.AddColumn( - name: "Auth", - table: "NotificationConnectors", - type: "text", - nullable: true); - - migrationBuilder.AddColumn( - name: "Endpoint", - table: "NotificationConnectors", - type: "text", - nullable: true); - - migrationBuilder.AddColumn( - name: "Id", - table: "NotificationConnectors", - type: "text", - nullable: true); - - migrationBuilder.AddColumn( - name: "NotificationConnectorType", - table: "NotificationConnectors", - type: "smallint", - nullable: false, - defaultValue: (byte)0); - - migrationBuilder.AddColumn( - name: "Ntfy_Endpoint", - table: "NotificationConnectors", - type: "text", - nullable: true); - - migrationBuilder.AddColumn( - name: "Topic", - table: "NotificationConnectors", - type: "text", - nullable: true); - } - } -} diff --git a/API/Migrations/20250307143254_dev-070325-4.Designer.cs b/API/Migrations/20250307143254_dev-070325-4.Designer.cs deleted file mode 100644 index db107e3..0000000 --- a/API/Migrations/20250307143254_dev-070325-4.Designer.cs +++ /dev/null @@ -1,673 +0,0 @@ -// -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("20250307143254_dev-070325-4")] - partial class dev0703254 - { - /// - 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("AuthorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("AuthorName") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("AuthorId"); - - b.ToTable("Authors"); - }); - - modelBuilder.Entity("API.Schema.Chapter", b => - { - b.Property("ChapterId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("ArchiveFileName") - .IsRequired() - .HasColumnType("text"); - - b.Property("ChapterNumber") - .IsRequired() - .HasMaxLength(10) - .HasColumnType("character varying(10)"); - - b.Property("Downloaded") - .HasColumnType("boolean"); - - b.Property("ParentMangaId") - .IsRequired() - .HasColumnType("character varying(64)"); - - b.Property("Title") - .HasColumnType("text"); - - b.Property("Url") - .IsRequired() - .HasColumnType("text"); - - b.Property("VolumeNumber") - .HasColumnType("integer"); - - b.HasKey("ChapterId"); - - b.HasIndex("ParentMangaId"); - - b.ToTable("Chapters"); - }); - - modelBuilder.Entity("API.Schema.Jobs.Job", b => - { - b.Property("JobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.PrimitiveCollection("DependsOnJobsIds") - .HasMaxLength(64) - .HasColumnType("text[]"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("JobId1") - .HasColumnType("character varying(64)"); - - b.Property("JobType") - .HasColumnType("smallint"); - - b.Property("LastExecution") - .HasColumnType("timestamp with time zone"); - - b.Property("ParentJobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("RecurrenceMs") - .HasColumnType("numeric(20,0)"); - - b.Property("state") - .HasColumnType("smallint"); - - b.HasKey("JobId"); - - b.HasIndex("JobId1"); - - b.HasIndex("ParentJobId"); - - b.ToTable("Jobs"); - - b.HasDiscriminator("JobType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.LibraryConnectors.LibraryConnector", b => - { - b.Property("LibraryConnectorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Auth") - .IsRequired() - .HasColumnType("text"); - - b.Property("BaseUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("LibraryType") - .HasColumnType("smallint"); - - b.HasKey("LibraryConnectorId"); - - b.ToTable("LibraryConnectors"); - - b.HasDiscriminator("LibraryType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.Link", b => - { - b.Property("LinkId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("LinkProvider") - .IsRequired() - .HasColumnType("text"); - - b.Property("LinkUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("LinkId"); - - b.HasIndex("MangaId"); - - b.ToTable("Link"); - }); - - modelBuilder.Entity("API.Schema.Manga", b => - { - b.Property("MangaId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("ConnectorId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("CoverFileNameInCache") - .HasColumnType("text"); - - b.Property("CoverUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("Description") - .IsRequired() - .HasColumnType("text"); - - b.Property("FolderName") - .IsRequired() - .HasColumnType("text"); - - b.Property("IgnoreChapterBefore") - .HasColumnType("real"); - - b.Property("MangaConnectorId") - .IsRequired() - .HasColumnType("character varying(32)"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("OriginalLanguage") - .HasColumnType("text"); - - b.Property("ReleaseStatus") - .HasColumnType("smallint"); - - b.Property("WebsiteUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("Year") - .HasColumnType("bigint"); - - b.HasKey("MangaId"); - - b.HasIndex("MangaConnectorId"); - - b.ToTable("Manga"); - }); - - modelBuilder.Entity("API.Schema.MangaAltTitle", b => - { - b.Property("AltTitleId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Language") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("character varying(8)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("AltTitleId"); - - b.HasIndex("MangaId"); - - b.ToTable("AltTitles"); - }); - - modelBuilder.Entity("API.Schema.MangaConnectors.MangaConnector", b => - { - b.Property("Name") - .HasMaxLength(32) - .HasColumnType("character varying(32)"); - - b.PrimitiveCollection("BaseUris") - .IsRequired() - .HasColumnType("text[]"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.PrimitiveCollection("SupportedLanguages") - .IsRequired() - .HasColumnType("text[]"); - - b.HasKey("Name"); - - b.ToTable("MangaConnectors"); - - b.HasDiscriminator("Name").HasValue("MangaConnector"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.MangaTag", b => - { - b.Property("Tag") - .HasColumnType("text"); - - b.HasKey("Tag"); - - b.ToTable("Tags"); - }); - - modelBuilder.Entity("API.Schema.Notification", b => - { - b.Property("NotificationId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Date") - .HasColumnType("timestamp with time zone"); - - b.Property("Message") - .IsRequired() - .HasColumnType("text"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text"); - - b.Property("Urgency") - .HasColumnType("smallint"); - - b.HasKey("NotificationId"); - - b.ToTable("Notifications"); - }); - - modelBuilder.Entity("API.Schema.NotificationConnectors.NotificationConnector", b => - { - b.Property("NotificationConnectorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Body") - .IsRequired() - .HasColumnType("text"); - - b.Property>("Headers") - .IsRequired() - .HasColumnType("hstore"); - - b.Property("HttpMethod") - .IsRequired() - .HasColumnType("text"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("Url") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("NotificationConnectorId"); - - b.ToTable("NotificationConnectors"); - }); - - modelBuilder.Entity("AuthorManga", b => - { - b.Property("AuthorsAuthorId") - .HasColumnType("character varying(64)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("AuthorsAuthorId", "MangaId"); - - b.HasIndex("MangaId"); - - b.ToTable("AuthorManga"); - }); - - modelBuilder.Entity("MangaMangaTag", b => - { - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("TagsTag") - .HasColumnType("text"); - - b.HasKey("MangaId", "TagsTag"); - - b.HasIndex("TagsTag"); - - b.ToTable("MangaMangaTag"); - }); - - modelBuilder.Entity("API.Schema.Jobs.DownloadMangaCoverJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("MangaId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.HasIndex("MangaId"); - - b.ToTable("Jobs", t => - { - t.Property("MangaId") - .HasColumnName("DownloadMangaCoverJob_MangaId"); - }); - - b.HasDiscriminator().HasValue((byte)4); - }); - - modelBuilder.Entity("API.Schema.Jobs.DownloadNewChaptersJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("MangaId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.HasIndex("MangaId"); - - b.HasDiscriminator().HasValue((byte)1); - }); - - modelBuilder.Entity("API.Schema.Jobs.DownloadSingleChapterJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("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("FromLocation") - .IsRequired() - .HasColumnType("text"); - - b.Property("ToLocation") - .IsRequired() - .HasColumnType("text"); - - b.HasDiscriminator().HasValue((byte)3); - }); - - modelBuilder.Entity("API.Schema.Jobs.UpdateMetadataJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("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.DownloadMangaCoverJob", b => - { - b.HasOne("API.Schema.Manga", "Manga") - .WithMany() - .HasForeignKey("MangaId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Manga"); - }); - - modelBuilder.Entity("API.Schema.Jobs.DownloadNewChaptersJob", 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.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/20250307143254_dev-070325-4.cs b/API/Migrations/20250307143254_dev-070325-4.cs deleted file mode 100644 index 259e602..0000000 --- a/API/Migrations/20250307143254_dev-070325-4.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace API.Migrations -{ - /// - public partial class dev0703254 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "Name", - table: "NotificationConnectors", - type: "text", - nullable: false, - defaultValue: ""); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "Name", - table: "NotificationConnectors"); - } - } -} diff --git a/API/Migrations/20250307143442_dev-070325-5.Designer.cs b/API/Migrations/20250307143442_dev-070325-5.Designer.cs deleted file mode 100644 index 87408bc..0000000 --- a/API/Migrations/20250307143442_dev-070325-5.Designer.cs +++ /dev/null @@ -1,669 +0,0 @@ -// -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("20250307143442_dev-070325-5")] - partial class dev0703255 - { - /// - 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("AuthorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("AuthorName") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("AuthorId"); - - b.ToTable("Authors"); - }); - - modelBuilder.Entity("API.Schema.Chapter", b => - { - b.Property("ChapterId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("ArchiveFileName") - .IsRequired() - .HasColumnType("text"); - - b.Property("ChapterNumber") - .IsRequired() - .HasMaxLength(10) - .HasColumnType("character varying(10)"); - - b.Property("Downloaded") - .HasColumnType("boolean"); - - b.Property("ParentMangaId") - .IsRequired() - .HasColumnType("character varying(64)"); - - b.Property("Title") - .HasColumnType("text"); - - b.Property("Url") - .IsRequired() - .HasColumnType("text"); - - b.Property("VolumeNumber") - .HasColumnType("integer"); - - b.HasKey("ChapterId"); - - b.HasIndex("ParentMangaId"); - - b.ToTable("Chapters"); - }); - - modelBuilder.Entity("API.Schema.Jobs.Job", b => - { - b.Property("JobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.PrimitiveCollection("DependsOnJobsIds") - .HasMaxLength(64) - .HasColumnType("text[]"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("JobId1") - .HasColumnType("character varying(64)"); - - b.Property("JobType") - .HasColumnType("smallint"); - - b.Property("LastExecution") - .HasColumnType("timestamp with time zone"); - - b.Property("ParentJobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("RecurrenceMs") - .HasColumnType("numeric(20,0)"); - - b.Property("state") - .HasColumnType("smallint"); - - b.HasKey("JobId"); - - b.HasIndex("JobId1"); - - b.HasIndex("ParentJobId"); - - b.ToTable("Jobs"); - - b.HasDiscriminator("JobType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.LibraryConnectors.LibraryConnector", b => - { - b.Property("LibraryConnectorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Auth") - .IsRequired() - .HasColumnType("text"); - - b.Property("BaseUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("LibraryType") - .HasColumnType("smallint"); - - b.HasKey("LibraryConnectorId"); - - b.ToTable("LibraryConnectors"); - - b.HasDiscriminator("LibraryType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.Link", b => - { - b.Property("LinkId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("LinkProvider") - .IsRequired() - .HasColumnType("text"); - - b.Property("LinkUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("LinkId"); - - b.HasIndex("MangaId"); - - b.ToTable("Link"); - }); - - modelBuilder.Entity("API.Schema.Manga", b => - { - b.Property("MangaId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("ConnectorId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("CoverFileNameInCache") - .HasColumnType("text"); - - b.Property("CoverUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("Description") - .IsRequired() - .HasColumnType("text"); - - b.Property("FolderName") - .IsRequired() - .HasColumnType("text"); - - b.Property("IgnoreChapterBefore") - .HasColumnType("real"); - - b.Property("MangaConnectorId") - .IsRequired() - .HasColumnType("character varying(32)"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("OriginalLanguage") - .HasColumnType("text"); - - b.Property("ReleaseStatus") - .HasColumnType("smallint"); - - b.Property("WebsiteUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("Year") - .HasColumnType("bigint"); - - b.HasKey("MangaId"); - - b.HasIndex("MangaConnectorId"); - - b.ToTable("Manga"); - }); - - modelBuilder.Entity("API.Schema.MangaAltTitle", b => - { - b.Property("AltTitleId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Language") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("character varying(8)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("AltTitleId"); - - b.HasIndex("MangaId"); - - b.ToTable("AltTitles"); - }); - - modelBuilder.Entity("API.Schema.MangaConnectors.MangaConnector", b => - { - b.Property("Name") - .HasMaxLength(32) - .HasColumnType("character varying(32)"); - - b.PrimitiveCollection("BaseUris") - .IsRequired() - .HasColumnType("text[]"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.PrimitiveCollection("SupportedLanguages") - .IsRequired() - .HasColumnType("text[]"); - - b.HasKey("Name"); - - b.ToTable("MangaConnectors"); - - b.HasDiscriminator("Name").HasValue("MangaConnector"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.MangaTag", b => - { - b.Property("Tag") - .HasColumnType("text"); - - b.HasKey("Tag"); - - b.ToTable("Tags"); - }); - - modelBuilder.Entity("API.Schema.Notification", b => - { - b.Property("NotificationId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Date") - .HasColumnType("timestamp with time zone"); - - b.Property("Message") - .IsRequired() - .HasColumnType("text"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text"); - - b.Property("Urgency") - .HasColumnType("smallint"); - - b.HasKey("NotificationId"); - - b.ToTable("Notifications"); - }); - - modelBuilder.Entity("API.Schema.NotificationConnectors.NotificationConnector", b => - { - b.Property("Name") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Body") - .IsRequired() - .HasColumnType("text"); - - b.Property>("Headers") - .IsRequired() - .HasColumnType("hstore"); - - b.Property("HttpMethod") - .IsRequired() - .HasColumnType("text"); - - b.Property("Url") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Name"); - - b.ToTable("NotificationConnectors"); - }); - - modelBuilder.Entity("AuthorManga", b => - { - b.Property("AuthorsAuthorId") - .HasColumnType("character varying(64)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("AuthorsAuthorId", "MangaId"); - - b.HasIndex("MangaId"); - - b.ToTable("AuthorManga"); - }); - - modelBuilder.Entity("MangaMangaTag", b => - { - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("TagsTag") - .HasColumnType("text"); - - b.HasKey("MangaId", "TagsTag"); - - b.HasIndex("TagsTag"); - - b.ToTable("MangaMangaTag"); - }); - - modelBuilder.Entity("API.Schema.Jobs.DownloadMangaCoverJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("MangaId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.HasIndex("MangaId"); - - b.ToTable("Jobs", t => - { - t.Property("MangaId") - .HasColumnName("DownloadMangaCoverJob_MangaId"); - }); - - b.HasDiscriminator().HasValue((byte)4); - }); - - modelBuilder.Entity("API.Schema.Jobs.DownloadNewChaptersJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("MangaId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.HasIndex("MangaId"); - - b.HasDiscriminator().HasValue((byte)1); - }); - - modelBuilder.Entity("API.Schema.Jobs.DownloadSingleChapterJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("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("FromLocation") - .IsRequired() - .HasColumnType("text"); - - b.Property("ToLocation") - .IsRequired() - .HasColumnType("text"); - - b.HasDiscriminator().HasValue((byte)3); - }); - - modelBuilder.Entity("API.Schema.Jobs.UpdateMetadataJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("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.DownloadMangaCoverJob", b => - { - b.HasOne("API.Schema.Manga", "Manga") - .WithMany() - .HasForeignKey("MangaId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Manga"); - }); - - modelBuilder.Entity("API.Schema.Jobs.DownloadNewChaptersJob", 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.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/20250307143442_dev-070325-5.cs b/API/Migrations/20250307143442_dev-070325-5.cs deleted file mode 100644 index 21fba0d..0000000 --- a/API/Migrations/20250307143442_dev-070325-5.cs +++ /dev/null @@ -1,66 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace API.Migrations -{ - /// - public partial class dev0703255 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropPrimaryKey( - name: "PK_NotificationConnectors", - table: "NotificationConnectors"); - - migrationBuilder.DropColumn( - name: "NotificationConnectorId", - table: "NotificationConnectors"); - - migrationBuilder.AlterColumn( - name: "Name", - table: "NotificationConnectors", - type: "character varying(64)", - maxLength: 64, - nullable: false, - oldClrType: typeof(string), - oldType: "text"); - - migrationBuilder.AddPrimaryKey( - name: "PK_NotificationConnectors", - table: "NotificationConnectors", - column: "Name"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropPrimaryKey( - name: "PK_NotificationConnectors", - table: "NotificationConnectors"); - - migrationBuilder.AlterColumn( - name: "Name", - table: "NotificationConnectors", - type: "text", - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(64)", - oldMaxLength: 64); - - migrationBuilder.AddColumn( - name: "NotificationConnectorId", - table: "NotificationConnectors", - type: "character varying(64)", - maxLength: 64, - nullable: false, - defaultValue: ""); - - migrationBuilder.AddPrimaryKey( - name: "PK_NotificationConnectors", - table: "NotificationConnectors", - column: "NotificationConnectorId"); - } - } -} diff --git a/API/Migrations/20250307175004_dev-070325-6.Designer.cs b/API/Migrations/20250307175004_dev-070325-6.Designer.cs deleted file mode 100644 index fccfcfe..0000000 --- a/API/Migrations/20250307175004_dev-070325-6.Designer.cs +++ /dev/null @@ -1,673 +0,0 @@ -// -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("20250307175004_dev-070325-6")] - partial class dev0703256 - { - /// - 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("AuthorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("AuthorName") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("AuthorId"); - - b.ToTable("Authors"); - }); - - modelBuilder.Entity("API.Schema.Chapter", b => - { - b.Property("ChapterId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("ArchiveFileName") - .IsRequired() - .HasColumnType("text"); - - b.Property("ChapterNumber") - .IsRequired() - .HasMaxLength(10) - .HasColumnType("character varying(10)"); - - b.Property("Downloaded") - .HasColumnType("boolean"); - - b.Property("ParentMangaId") - .IsRequired() - .HasColumnType("character varying(64)"); - - b.Property("Title") - .HasColumnType("text"); - - b.Property("Url") - .IsRequired() - .HasColumnType("text"); - - b.Property("VolumeNumber") - .HasColumnType("integer"); - - b.HasKey("ChapterId"); - - b.HasIndex("ParentMangaId"); - - b.ToTable("Chapters"); - }); - - modelBuilder.Entity("API.Schema.Jobs.Job", b => - { - b.Property("JobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.PrimitiveCollection("DependsOnJobsIds") - .HasMaxLength(64) - .HasColumnType("text[]"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("JobId1") - .HasColumnType("character varying(64)"); - - b.Property("JobType") - .HasColumnType("smallint"); - - b.Property("LastExecution") - .HasColumnType("timestamp with time zone"); - - b.Property("ParentJobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("RecurrenceMs") - .HasColumnType("numeric(20,0)"); - - b.Property("state") - .HasColumnType("smallint"); - - b.HasKey("JobId"); - - b.HasIndex("JobId1"); - - b.HasIndex("ParentJobId"); - - b.ToTable("Jobs"); - - b.HasDiscriminator("JobType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.LibraryConnectors.LibraryConnector", b => - { - b.Property("LibraryConnectorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Auth") - .IsRequired() - .HasColumnType("text"); - - b.Property("BaseUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("LibraryType") - .HasColumnType("smallint"); - - b.HasKey("LibraryConnectorId"); - - b.ToTable("LibraryConnectors"); - - b.HasDiscriminator("LibraryType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.Link", b => - { - b.Property("LinkId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("LinkProvider") - .IsRequired() - .HasColumnType("text"); - - b.Property("LinkUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("LinkId"); - - b.HasIndex("MangaId"); - - b.ToTable("Link"); - }); - - modelBuilder.Entity("API.Schema.Manga", b => - { - b.Property("MangaId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("ConnectorId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("CoverFileNameInCache") - .HasColumnType("text"); - - b.Property("CoverUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("Description") - .IsRequired() - .HasColumnType("text"); - - b.Property("FolderName") - .IsRequired() - .HasColumnType("text"); - - b.Property("IgnoreChapterBefore") - .HasColumnType("real"); - - b.Property("MangaConnectorId") - .IsRequired() - .HasColumnType("character varying(32)"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("OriginalLanguage") - .HasColumnType("text"); - - b.Property("ReleaseStatus") - .HasColumnType("smallint"); - - b.Property("WebsiteUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("Year") - .HasColumnType("bigint"); - - b.HasKey("MangaId"); - - b.HasIndex("MangaConnectorId"); - - b.ToTable("Manga"); - }); - - modelBuilder.Entity("API.Schema.MangaAltTitle", b => - { - b.Property("AltTitleId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Language") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("character varying(8)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("AltTitleId"); - - b.HasIndex("MangaId"); - - b.ToTable("AltTitles"); - }); - - modelBuilder.Entity("API.Schema.MangaConnectors.MangaConnector", b => - { - b.Property("Name") - .HasMaxLength(32) - .HasColumnType("character varying(32)"); - - b.PrimitiveCollection("BaseUris") - .IsRequired() - .HasColumnType("text[]"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("IconUrl") - .IsRequired() - .HasColumnType("text"); - - b.PrimitiveCollection("SupportedLanguages") - .IsRequired() - .HasColumnType("text[]"); - - b.HasKey("Name"); - - b.ToTable("MangaConnectors"); - - b.HasDiscriminator("Name").HasValue("MangaConnector"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.MangaTag", b => - { - b.Property("Tag") - .HasColumnType("text"); - - b.HasKey("Tag"); - - b.ToTable("Tags"); - }); - - modelBuilder.Entity("API.Schema.Notification", b => - { - b.Property("NotificationId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Date") - .HasColumnType("timestamp with time zone"); - - b.Property("Message") - .IsRequired() - .HasColumnType("text"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text"); - - b.Property("Urgency") - .HasColumnType("smallint"); - - b.HasKey("NotificationId"); - - b.ToTable("Notifications"); - }); - - modelBuilder.Entity("API.Schema.NotificationConnectors.NotificationConnector", b => - { - b.Property("Name") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Body") - .IsRequired() - .HasColumnType("text"); - - b.Property>("Headers") - .IsRequired() - .HasColumnType("hstore"); - - b.Property("HttpMethod") - .IsRequired() - .HasColumnType("text"); - - b.Property("Url") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Name"); - - b.ToTable("NotificationConnectors"); - }); - - modelBuilder.Entity("AuthorManga", b => - { - b.Property("AuthorsAuthorId") - .HasColumnType("character varying(64)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("AuthorsAuthorId", "MangaId"); - - b.HasIndex("MangaId"); - - b.ToTable("AuthorManga"); - }); - - modelBuilder.Entity("MangaMangaTag", b => - { - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("TagsTag") - .HasColumnType("text"); - - b.HasKey("MangaId", "TagsTag"); - - b.HasIndex("TagsTag"); - - b.ToTable("MangaMangaTag"); - }); - - modelBuilder.Entity("API.Schema.Jobs.DownloadMangaCoverJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("MangaId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.HasIndex("MangaId"); - - b.ToTable("Jobs", t => - { - t.Property("MangaId") - .HasColumnName("DownloadMangaCoverJob_MangaId"); - }); - - b.HasDiscriminator().HasValue((byte)4); - }); - - modelBuilder.Entity("API.Schema.Jobs.DownloadNewChaptersJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("MangaId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.HasIndex("MangaId"); - - b.HasDiscriminator().HasValue((byte)1); - }); - - modelBuilder.Entity("API.Schema.Jobs.DownloadSingleChapterJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("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("FromLocation") - .IsRequired() - .HasColumnType("text"); - - b.Property("ToLocation") - .IsRequired() - .HasColumnType("text"); - - b.HasDiscriminator().HasValue((byte)3); - }); - - modelBuilder.Entity("API.Schema.Jobs.UpdateMetadataJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("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.DownloadMangaCoverJob", b => - { - b.HasOne("API.Schema.Manga", "Manga") - .WithMany() - .HasForeignKey("MangaId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Manga"); - }); - - modelBuilder.Entity("API.Schema.Jobs.DownloadNewChaptersJob", 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.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/20250307175004_dev-070325-6.cs b/API/Migrations/20250307175004_dev-070325-6.cs deleted file mode 100644 index 12c1106..0000000 --- a/API/Migrations/20250307175004_dev-070325-6.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace API.Migrations -{ - /// - public partial class dev0703256 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "IconUrl", - table: "MangaConnectors", - type: "text", - nullable: false, - defaultValue: ""); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "IconUrl", - table: "MangaConnectors"); - } - } -} diff --git a/API/Migrations/20250308121028_dev-080325-1.Designer.cs b/API/Migrations/20250308121028_dev-080325-1.Designer.cs deleted file mode 100644 index 3342824..0000000 --- a/API/Migrations/20250308121028_dev-080325-1.Designer.cs +++ /dev/null @@ -1,689 +0,0 @@ -// -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("20250308121028_dev-080325-1")] - partial class dev0803251 - { - /// - 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("AuthorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("AuthorName") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("AuthorId"); - - b.ToTable("Authors"); - }); - - modelBuilder.Entity("API.Schema.Chapter", b => - { - b.Property("ChapterId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("ArchiveFileName") - .IsRequired() - .HasColumnType("text"); - - b.Property("ChapterNumber") - .IsRequired() - .HasMaxLength(10) - .HasColumnType("character varying(10)"); - - b.Property("Downloaded") - .HasColumnType("boolean"); - - b.Property("ParentMangaId") - .IsRequired() - .HasColumnType("character varying(64)"); - - b.Property("Title") - .HasColumnType("text"); - - b.Property("Url") - .IsRequired() - .HasColumnType("text"); - - b.Property("VolumeNumber") - .HasColumnType("integer"); - - b.HasKey("ChapterId"); - - b.HasIndex("ParentMangaId"); - - b.ToTable("Chapters"); - }); - - modelBuilder.Entity("API.Schema.Jobs.Job", b => - { - b.Property("JobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.PrimitiveCollection("DependsOnJobsIds") - .HasMaxLength(64) - .HasColumnType("text[]"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("JobId1") - .HasColumnType("character varying(64)"); - - b.Property("JobType") - .HasColumnType("smallint"); - - b.Property("LastExecution") - .HasColumnType("timestamp with time zone"); - - b.Property("ParentJobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("RecurrenceMs") - .HasColumnType("numeric(20,0)"); - - b.Property("state") - .HasColumnType("smallint"); - - b.HasKey("JobId"); - - b.HasIndex("JobId1"); - - b.HasIndex("ParentJobId"); - - b.ToTable("Jobs"); - - b.HasDiscriminator("JobType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.LibraryConnectors.LibraryConnector", b => - { - b.Property("LibraryConnectorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Auth") - .IsRequired() - .HasColumnType("text"); - - b.Property("BaseUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("LibraryType") - .HasColumnType("smallint"); - - b.HasKey("LibraryConnectorId"); - - b.ToTable("LibraryConnectors"); - - b.HasDiscriminator("LibraryType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.Link", b => - { - b.Property("LinkId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("LinkProvider") - .IsRequired() - .HasColumnType("text"); - - b.Property("LinkUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("LinkId"); - - b.HasIndex("MangaId"); - - b.ToTable("Link"); - }); - - modelBuilder.Entity("API.Schema.Manga", b => - { - b.Property("MangaId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.PrimitiveCollection("AltTitleIds") - .IsRequired() - .HasColumnType("text[]"); - - b.PrimitiveCollection("AuthorIds") - .IsRequired() - .HasColumnType("text[]"); - - b.Property("ConnectorId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("CoverFileNameInCache") - .HasColumnType("text"); - - b.Property("CoverUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("Description") - .IsRequired() - .HasColumnType("text"); - - b.Property("FolderName") - .IsRequired() - .HasColumnType("text"); - - b.Property("IgnoreChapterBefore") - .HasColumnType("real"); - - b.PrimitiveCollection("LinkIds") - .IsRequired() - .HasColumnType("text[]"); - - b.Property("MangaConnectorId") - .IsRequired() - .HasColumnType("character varying(32)"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("OriginalLanguage") - .HasColumnType("text"); - - b.Property("ReleaseStatus") - .HasColumnType("smallint"); - - b.PrimitiveCollection("TagIds") - .IsRequired() - .HasColumnType("text[]"); - - b.Property("WebsiteUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("Year") - .HasColumnType("bigint"); - - b.HasKey("MangaId"); - - b.HasIndex("MangaConnectorId"); - - b.ToTable("Manga"); - }); - - modelBuilder.Entity("API.Schema.MangaAltTitle", b => - { - b.Property("AltTitleId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Language") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("character varying(8)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("AltTitleId"); - - b.HasIndex("MangaId"); - - b.ToTable("AltTitles"); - }); - - modelBuilder.Entity("API.Schema.MangaConnectors.MangaConnector", b => - { - b.Property("Name") - .HasMaxLength(32) - .HasColumnType("character varying(32)"); - - b.PrimitiveCollection("BaseUris") - .IsRequired() - .HasColumnType("text[]"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("IconUrl") - .IsRequired() - .HasColumnType("text"); - - b.PrimitiveCollection("SupportedLanguages") - .IsRequired() - .HasColumnType("text[]"); - - b.HasKey("Name"); - - b.ToTable("MangaConnectors"); - - b.HasDiscriminator("Name").HasValue("MangaConnector"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.MangaTag", b => - { - b.Property("Tag") - .HasColumnType("text"); - - b.HasKey("Tag"); - - b.ToTable("Tags"); - }); - - modelBuilder.Entity("API.Schema.Notification", b => - { - b.Property("NotificationId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Date") - .HasColumnType("timestamp with time zone"); - - b.Property("Message") - .IsRequired() - .HasColumnType("text"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text"); - - b.Property("Urgency") - .HasColumnType("smallint"); - - b.HasKey("NotificationId"); - - b.ToTable("Notifications"); - }); - - modelBuilder.Entity("API.Schema.NotificationConnectors.NotificationConnector", b => - { - b.Property("Name") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Body") - .IsRequired() - .HasColumnType("text"); - - b.Property>("Headers") - .IsRequired() - .HasColumnType("hstore"); - - b.Property("HttpMethod") - .IsRequired() - .HasColumnType("text"); - - b.Property("Url") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Name"); - - b.ToTable("NotificationConnectors"); - }); - - modelBuilder.Entity("AuthorManga", b => - { - b.Property("AuthorsAuthorId") - .HasColumnType("character varying(64)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("AuthorsAuthorId", "MangaId"); - - b.HasIndex("MangaId"); - - b.ToTable("AuthorManga"); - }); - - modelBuilder.Entity("MangaMangaTag", b => - { - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("TagsTag") - .HasColumnType("text"); - - b.HasKey("MangaId", "TagsTag"); - - b.HasIndex("TagsTag"); - - b.ToTable("MangaMangaTag"); - }); - - modelBuilder.Entity("API.Schema.Jobs.DownloadMangaCoverJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("MangaId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.HasIndex("MangaId"); - - b.ToTable("Jobs", t => - { - t.Property("MangaId") - .HasColumnName("DownloadMangaCoverJob_MangaId"); - }); - - b.HasDiscriminator().HasValue((byte)4); - }); - - modelBuilder.Entity("API.Schema.Jobs.DownloadNewChaptersJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("MangaId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.HasIndex("MangaId"); - - b.HasDiscriminator().HasValue((byte)1); - }); - - modelBuilder.Entity("API.Schema.Jobs.DownloadSingleChapterJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("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("FromLocation") - .IsRequired() - .HasColumnType("text"); - - b.Property("ToLocation") - .IsRequired() - .HasColumnType("text"); - - b.HasDiscriminator().HasValue((byte)3); - }); - - modelBuilder.Entity("API.Schema.Jobs.UpdateMetadataJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("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.DownloadMangaCoverJob", b => - { - b.HasOne("API.Schema.Manga", "Manga") - .WithMany() - .HasForeignKey("MangaId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Manga"); - }); - - modelBuilder.Entity("API.Schema.Jobs.DownloadNewChaptersJob", 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.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/20250308121028_dev-080325-1.cs b/API/Migrations/20250308121028_dev-080325-1.cs deleted file mode 100644 index a6401f3..0000000 --- a/API/Migrations/20250308121028_dev-080325-1.cs +++ /dev/null @@ -1,62 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace API.Migrations -{ - /// - public partial class dev0803251 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "AltTitleIds", - table: "Manga", - type: "text[]", - nullable: false, - defaultValue: new string[0]); - - migrationBuilder.AddColumn( - name: "AuthorIds", - table: "Manga", - type: "text[]", - nullable: false, - defaultValue: new string[0]); - - migrationBuilder.AddColumn( - name: "LinkIds", - table: "Manga", - type: "text[]", - nullable: false, - defaultValue: new string[0]); - - migrationBuilder.AddColumn( - name: "TagIds", - table: "Manga", - type: "text[]", - nullable: false, - defaultValue: new string[0]); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "AltTitleIds", - table: "Manga"); - - migrationBuilder.DropColumn( - name: "AuthorIds", - table: "Manga"); - - migrationBuilder.DropColumn( - name: "LinkIds", - table: "Manga"); - - migrationBuilder.DropColumn( - name: "TagIds", - table: "Manga"); - } - } -} diff --git a/API/Migrations/20250308154843_dev-080325-2.Designer.cs b/API/Migrations/20250308154843_dev-080325-2.Designer.cs deleted file mode 100644 index 21d68f8..0000000 --- a/API/Migrations/20250308154843_dev-080325-2.Designer.cs +++ /dev/null @@ -1,673 +0,0 @@ -// -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("20250308154843_dev-080325-2")] - partial class dev0803252 - { - /// - 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("AuthorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("AuthorName") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("AuthorId"); - - b.ToTable("Authors"); - }); - - modelBuilder.Entity("API.Schema.Chapter", b => - { - b.Property("ChapterId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("ArchiveFileName") - .IsRequired() - .HasColumnType("text"); - - b.Property("ChapterNumber") - .IsRequired() - .HasMaxLength(10) - .HasColumnType("character varying(10)"); - - b.Property("Downloaded") - .HasColumnType("boolean"); - - b.Property("ParentMangaId") - .IsRequired() - .HasColumnType("character varying(64)"); - - b.Property("Title") - .HasColumnType("text"); - - b.Property("Url") - .IsRequired() - .HasColumnType("text"); - - b.Property("VolumeNumber") - .HasColumnType("integer"); - - b.HasKey("ChapterId"); - - b.HasIndex("ParentMangaId"); - - b.ToTable("Chapters"); - }); - - modelBuilder.Entity("API.Schema.Jobs.Job", b => - { - b.Property("JobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.PrimitiveCollection("DependsOnJobsIds") - .HasMaxLength(64) - .HasColumnType("text[]"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("JobId1") - .HasColumnType("character varying(64)"); - - b.Property("JobType") - .HasColumnType("smallint"); - - b.Property("LastExecution") - .HasColumnType("timestamp with time zone"); - - b.Property("ParentJobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("RecurrenceMs") - .HasColumnType("numeric(20,0)"); - - b.Property("state") - .HasColumnType("smallint"); - - b.HasKey("JobId"); - - b.HasIndex("JobId1"); - - b.HasIndex("ParentJobId"); - - b.ToTable("Jobs"); - - b.HasDiscriminator("JobType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.LibraryConnectors.LibraryConnector", b => - { - b.Property("LibraryConnectorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Auth") - .IsRequired() - .HasColumnType("text"); - - b.Property("BaseUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("LibraryType") - .HasColumnType("smallint"); - - b.HasKey("LibraryConnectorId"); - - b.ToTable("LibraryConnectors"); - - b.HasDiscriminator("LibraryType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.Link", b => - { - b.Property("LinkId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("LinkProvider") - .IsRequired() - .HasColumnType("text"); - - b.Property("LinkUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("LinkId"); - - b.HasIndex("MangaId"); - - b.ToTable("Link"); - }); - - modelBuilder.Entity("API.Schema.Manga", b => - { - b.Property("MangaId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("ConnectorId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("CoverFileNameInCache") - .HasColumnType("text"); - - b.Property("CoverUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("Description") - .IsRequired() - .HasColumnType("text"); - - b.Property("FolderName") - .IsRequired() - .HasColumnType("text"); - - b.Property("IgnoreChapterBefore") - .HasColumnType("real"); - - b.Property("MangaConnectorId") - .IsRequired() - .HasColumnType("character varying(32)"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("OriginalLanguage") - .HasColumnType("text"); - - b.Property("ReleaseStatus") - .HasColumnType("smallint"); - - b.Property("WebsiteUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("Year") - .HasColumnType("bigint"); - - b.HasKey("MangaId"); - - b.HasIndex("MangaConnectorId"); - - b.ToTable("Manga"); - }); - - modelBuilder.Entity("API.Schema.MangaAltTitle", b => - { - b.Property("AltTitleId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Language") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("character varying(8)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("AltTitleId"); - - b.HasIndex("MangaId"); - - b.ToTable("AltTitles"); - }); - - modelBuilder.Entity("API.Schema.MangaConnectors.MangaConnector", b => - { - b.Property("Name") - .HasMaxLength(32) - .HasColumnType("character varying(32)"); - - b.PrimitiveCollection("BaseUris") - .IsRequired() - .HasColumnType("text[]"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("IconUrl") - .IsRequired() - .HasColumnType("text"); - - b.PrimitiveCollection("SupportedLanguages") - .IsRequired() - .HasColumnType("text[]"); - - b.HasKey("Name"); - - b.ToTable("MangaConnectors"); - - b.HasDiscriminator("Name").HasValue("MangaConnector"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.MangaTag", b => - { - b.Property("Tag") - .HasColumnType("text"); - - b.HasKey("Tag"); - - b.ToTable("Tags"); - }); - - modelBuilder.Entity("API.Schema.Notification", b => - { - b.Property("NotificationId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Date") - .HasColumnType("timestamp with time zone"); - - b.Property("Message") - .IsRequired() - .HasColumnType("text"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text"); - - b.Property("Urgency") - .HasColumnType("smallint"); - - b.HasKey("NotificationId"); - - b.ToTable("Notifications"); - }); - - modelBuilder.Entity("API.Schema.NotificationConnectors.NotificationConnector", b => - { - b.Property("Name") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Body") - .IsRequired() - .HasColumnType("text"); - - b.Property>("Headers") - .IsRequired() - .HasColumnType("hstore"); - - b.Property("HttpMethod") - .IsRequired() - .HasColumnType("text"); - - b.Property("Url") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Name"); - - b.ToTable("NotificationConnectors"); - }); - - modelBuilder.Entity("AuthorManga", b => - { - b.Property("AuthorsAuthorId") - .HasColumnType("character varying(64)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("AuthorsAuthorId", "MangaId"); - - b.HasIndex("MangaId"); - - b.ToTable("AuthorManga"); - }); - - modelBuilder.Entity("MangaMangaTag", b => - { - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("TagsTag") - .HasColumnType("text"); - - b.HasKey("MangaId", "TagsTag"); - - b.HasIndex("TagsTag"); - - b.ToTable("MangaMangaTag"); - }); - - modelBuilder.Entity("API.Schema.Jobs.DownloadMangaCoverJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("MangaId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.HasIndex("MangaId"); - - b.ToTable("Jobs", t => - { - t.Property("MangaId") - .HasColumnName("DownloadMangaCoverJob_MangaId"); - }); - - b.HasDiscriminator().HasValue((byte)4); - }); - - modelBuilder.Entity("API.Schema.Jobs.DownloadNewChaptersJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("MangaId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.HasIndex("MangaId"); - - b.HasDiscriminator().HasValue((byte)1); - }); - - modelBuilder.Entity("API.Schema.Jobs.DownloadSingleChapterJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("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("FromLocation") - .IsRequired() - .HasColumnType("text"); - - b.Property("ToLocation") - .IsRequired() - .HasColumnType("text"); - - b.HasDiscriminator().HasValue((byte)3); - }); - - modelBuilder.Entity("API.Schema.Jobs.UpdateMetadataJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("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.DownloadMangaCoverJob", b => - { - b.HasOne("API.Schema.Manga", "Manga") - .WithMany() - .HasForeignKey("MangaId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Manga"); - }); - - modelBuilder.Entity("API.Schema.Jobs.DownloadNewChaptersJob", 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.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/20250308154843_dev-080325-2.cs b/API/Migrations/20250308154843_dev-080325-2.cs deleted file mode 100644 index 70b10c8..0000000 --- a/API/Migrations/20250308154843_dev-080325-2.cs +++ /dev/null @@ -1,62 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace API.Migrations -{ - /// - public partial class dev0803252 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "AltTitleIds", - table: "Manga"); - - migrationBuilder.DropColumn( - name: "AuthorIds", - table: "Manga"); - - migrationBuilder.DropColumn( - name: "LinkIds", - table: "Manga"); - - migrationBuilder.DropColumn( - name: "TagIds", - table: "Manga"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "AltTitleIds", - table: "Manga", - type: "text[]", - nullable: false, - defaultValue: new string[0]); - - migrationBuilder.AddColumn( - name: "AuthorIds", - table: "Manga", - type: "text[]", - nullable: false, - defaultValue: new string[0]); - - migrationBuilder.AddColumn( - name: "LinkIds", - table: "Manga", - type: "text[]", - nullable: false, - defaultValue: new string[0]); - - migrationBuilder.AddColumn( - name: "TagIds", - table: "Manga", - type: "text[]", - nullable: false, - defaultValue: new string[0]); - } - } -} diff --git a/API/Migrations/20250308162728_dev-080325-3.Designer.cs b/API/Migrations/20250308162728_dev-080325-3.Designer.cs deleted file mode 100644 index d202086..0000000 --- a/API/Migrations/20250308162728_dev-080325-3.Designer.cs +++ /dev/null @@ -1,735 +0,0 @@ -// -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 - { - /// - 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("AuthorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("AuthorName") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("AuthorId"); - - b.ToTable("Authors"); - }); - - modelBuilder.Entity("API.Schema.Chapter", b => - { - b.Property("ChapterId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("ArchiveFileName") - .IsRequired() - .HasColumnType("text"); - - b.Property("ChapterNumber") - .IsRequired() - .HasMaxLength(10) - .HasColumnType("character varying(10)"); - - b.Property("Downloaded") - .HasColumnType("boolean"); - - b.Property("ParentMangaId") - .IsRequired() - .HasColumnType("character varying(64)"); - - b.Property("Title") - .HasColumnType("text"); - - b.Property("Url") - .IsRequired() - .HasColumnType("text"); - - b.Property("VolumeNumber") - .HasColumnType("integer"); - - b.HasKey("ChapterId"); - - b.HasIndex("ParentMangaId"); - - b.ToTable("Chapters"); - }); - - modelBuilder.Entity("API.Schema.Jobs.Job", b => - { - b.Property("JobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.PrimitiveCollection("DependsOnJobsIds") - .HasMaxLength(64) - .HasColumnType("text[]"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("JobId1") - .HasColumnType("character varying(64)"); - - b.Property("JobType") - .HasColumnType("smallint"); - - b.Property("LastExecution") - .HasColumnType("timestamp with time zone"); - - b.Property("ParentJobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("RecurrenceMs") - .HasColumnType("numeric(20,0)"); - - b.Property("state") - .HasColumnType("smallint"); - - b.HasKey("JobId"); - - b.HasIndex("JobId1"); - - b.HasIndex("ParentJobId"); - - b.ToTable("Jobs"); - - b.HasDiscriminator("JobType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.LibraryConnectors.LibraryConnector", b => - { - b.Property("LibraryConnectorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Auth") - .IsRequired() - .HasColumnType("text"); - - b.Property("BaseUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("LibraryType") - .HasColumnType("smallint"); - - b.HasKey("LibraryConnectorId"); - - b.ToTable("LibraryConnectors"); - - b.HasDiscriminator("LibraryType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.Link", b => - { - b.Property("LinkId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("LinkProvider") - .IsRequired() - .HasColumnType("text"); - - b.Property("LinkUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("LinkId"); - - b.HasIndex("MangaId"); - - b.ToTable("Link"); - }); - - modelBuilder.Entity("API.Schema.Manga", b => - { - b.Property("MangaId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("ConnectorId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("CoverFileNameInCache") - .HasColumnType("text"); - - b.Property("CoverUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("Description") - .IsRequired() - .HasColumnType("text"); - - b.Property("FolderName") - .IsRequired() - .HasColumnType("text"); - - b.Property("IgnoreChapterBefore") - .HasColumnType("real"); - - b.Property("MangaConnectorId") - .IsRequired() - .HasColumnType("character varying(32)"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("OriginalLanguage") - .HasColumnType("text"); - - b.Property("ReleaseStatus") - .HasColumnType("smallint"); - - b.Property("WebsiteUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("Year") - .HasColumnType("bigint"); - - b.HasKey("MangaId"); - - b.HasIndex("MangaConnectorId"); - - b.ToTable("Manga"); - }); - - modelBuilder.Entity("API.Schema.MangaAltTitle", b => - { - b.Property("AltTitleId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Language") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("character varying(8)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("AltTitleId"); - - b.HasIndex("MangaId"); - - b.ToTable("AltTitles"); - }); - - modelBuilder.Entity("API.Schema.MangaConnectors.MangaConnector", b => - { - b.Property("Name") - .HasMaxLength(32) - .HasColumnType("character varying(32)"); - - b.PrimitiveCollection("BaseUris") - .IsRequired() - .HasColumnType("text[]"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("IconUrl") - .IsRequired() - .HasColumnType("text"); - - b.PrimitiveCollection("SupportedLanguages") - .IsRequired() - .HasColumnType("text[]"); - - b.HasKey("Name"); - - b.ToTable("MangaConnectors"); - - b.HasDiscriminator("Name").HasValue("MangaConnector"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.MangaTag", b => - { - b.Property("Tag") - .HasColumnType("text"); - - b.HasKey("Tag"); - - b.ToTable("Tags"); - }); - - modelBuilder.Entity("API.Schema.Notification", b => - { - b.Property("NotificationId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Date") - .HasColumnType("timestamp with time zone"); - - b.Property("Message") - .IsRequired() - .HasColumnType("text"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text"); - - b.Property("Urgency") - .HasColumnType("smallint"); - - b.HasKey("NotificationId"); - - b.ToTable("Notifications"); - }); - - modelBuilder.Entity("API.Schema.NotificationConnectors.NotificationConnector", b => - { - b.Property("Name") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Body") - .IsRequired() - .HasColumnType("text"); - - b.Property>("Headers") - .IsRequired() - .HasColumnType("hstore"); - - b.Property("HttpMethod") - .IsRequired() - .HasColumnType("text"); - - b.Property("Url") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Name"); - - b.ToTable("NotificationConnectors"); - }); - - modelBuilder.Entity("AuthorManga", b => - { - b.Property("AuthorsAuthorId") - .HasColumnType("character varying(64)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("AuthorsAuthorId", "MangaId"); - - b.HasIndex("MangaId"); - - b.ToTable("AuthorManga"); - }); - - modelBuilder.Entity("MangaMangaTag", b => - { - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("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("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("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("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("FromLocation") - .IsRequired() - .HasColumnType("text"); - - b.Property("ToLocation") - .IsRequired() - .HasColumnType("text"); - - b.HasDiscriminator().HasValue((byte)3); - }); - - modelBuilder.Entity("API.Schema.Jobs.RetrieveChaptersJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("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("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("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 deleted file mode 100644 index 0484df2..0000000 --- a/API/Migrations/20250308162728_dev-080325-3.cs +++ /dev/null @@ -1,126 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace API.Migrations -{ - /// - public partial class dev0803253 : Migration - { - /// - 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( - name: "DownloadAvailableChaptersJob_MangaId", - table: "Jobs", - type: "character varying(64)", - maxLength: 64, - nullable: true); - - migrationBuilder.AddColumn( - 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); - } - - /// - 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 deleted file mode 100644 index 1c6fc1e..0000000 --- a/API/Migrations/20250308170713_dev-080325-4.Designer.cs +++ /dev/null @@ -1,735 +0,0 @@ -// -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 - { - /// - 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("AuthorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("AuthorName") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("AuthorId"); - - b.ToTable("Authors"); - }); - - modelBuilder.Entity("API.Schema.Chapter", b => - { - b.Property("ChapterId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("ArchiveFileName") - .IsRequired() - .HasColumnType("text"); - - b.Property("ChapterNumber") - .IsRequired() - .HasMaxLength(10) - .HasColumnType("character varying(10)"); - - b.Property("Downloaded") - .HasColumnType("boolean"); - - b.Property("ParentMangaId") - .IsRequired() - .HasColumnType("character varying(64)"); - - b.Property("Title") - .HasColumnType("text"); - - b.Property("Url") - .IsRequired() - .HasColumnType("text"); - - b.Property("VolumeNumber") - .HasColumnType("integer"); - - b.HasKey("ChapterId"); - - b.HasIndex("ParentMangaId"); - - b.ToTable("Chapters"); - }); - - modelBuilder.Entity("API.Schema.Jobs.Job", b => - { - b.Property("JobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.PrimitiveCollection("DependsOnJobsIds") - .HasMaxLength(64) - .HasColumnType("text[]"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("JobId1") - .HasColumnType("character varying(64)"); - - b.Property("JobType") - .HasColumnType("smallint"); - - b.Property("LastExecution") - .HasColumnType("timestamp with time zone"); - - b.Property("ParentJobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("RecurrenceMs") - .HasColumnType("numeric(20,0)"); - - b.Property("state") - .HasColumnType("smallint"); - - b.HasKey("JobId"); - - b.HasIndex("JobId1"); - - b.HasIndex("ParentJobId"); - - b.ToTable("Jobs"); - - b.HasDiscriminator("JobType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.LibraryConnectors.LibraryConnector", b => - { - b.Property("LibraryConnectorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Auth") - .IsRequired() - .HasColumnType("text"); - - b.Property("BaseUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("LibraryType") - .HasColumnType("smallint"); - - b.HasKey("LibraryConnectorId"); - - b.ToTable("LibraryConnectors"); - - b.HasDiscriminator("LibraryType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.Link", b => - { - b.Property("LinkId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("LinkProvider") - .IsRequired() - .HasColumnType("text"); - - b.Property("LinkUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("LinkId"); - - b.HasIndex("MangaId"); - - b.ToTable("Link"); - }); - - modelBuilder.Entity("API.Schema.Manga", b => - { - b.Property("MangaId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("ConnectorId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("CoverFileNameInCache") - .HasColumnType("text"); - - b.Property("CoverUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("Description") - .IsRequired() - .HasColumnType("text"); - - b.Property("FolderName") - .IsRequired() - .HasColumnType("text"); - - b.Property("IgnoreChapterBefore") - .HasColumnType("real"); - - b.Property("MangaConnectorId") - .IsRequired() - .HasColumnType("character varying(32)"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("OriginalLanguage") - .HasColumnType("text"); - - b.Property("ReleaseStatus") - .HasColumnType("smallint"); - - b.Property("WebsiteUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("Year") - .HasColumnType("bigint"); - - b.HasKey("MangaId"); - - b.HasIndex("MangaConnectorId"); - - b.ToTable("Manga"); - }); - - modelBuilder.Entity("API.Schema.MangaAltTitle", b => - { - b.Property("AltTitleId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Language") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("character varying(8)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("AltTitleId"); - - b.HasIndex("MangaId"); - - b.ToTable("AltTitles"); - }); - - modelBuilder.Entity("API.Schema.MangaConnectors.MangaConnector", b => - { - b.Property("Name") - .HasMaxLength(32) - .HasColumnType("character varying(32)"); - - b.PrimitiveCollection("BaseUris") - .IsRequired() - .HasColumnType("text[]"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("IconUrl") - .IsRequired() - .HasColumnType("text"); - - b.PrimitiveCollection("SupportedLanguages") - .IsRequired() - .HasColumnType("text[]"); - - b.HasKey("Name"); - - b.ToTable("MangaConnectors"); - - b.HasDiscriminator("Name").HasValue("MangaConnector"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.MangaTag", b => - { - b.Property("Tag") - .HasColumnType("text"); - - b.HasKey("Tag"); - - b.ToTable("Tags"); - }); - - modelBuilder.Entity("API.Schema.Notification", b => - { - b.Property("NotificationId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Date") - .HasColumnType("timestamp with time zone"); - - b.Property("Message") - .IsRequired() - .HasColumnType("text"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text"); - - b.Property("Urgency") - .HasColumnType("smallint"); - - b.HasKey("NotificationId"); - - b.ToTable("Notifications"); - }); - - modelBuilder.Entity("API.Schema.NotificationConnectors.NotificationConnector", b => - { - b.Property("Name") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Body") - .IsRequired() - .HasColumnType("text"); - - b.Property>("Headers") - .IsRequired() - .HasColumnType("hstore"); - - b.Property("HttpMethod") - .IsRequired() - .HasColumnType("text"); - - b.Property("Url") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Name"); - - b.ToTable("NotificationConnectors"); - }); - - modelBuilder.Entity("AuthorManga", b => - { - b.Property("AuthorsAuthorId") - .HasColumnType("character varying(64)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("AuthorsAuthorId", "MangaId"); - - b.HasIndex("MangaId"); - - b.ToTable("AuthorManga"); - }); - - modelBuilder.Entity("MangaMangaTag", b => - { - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("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("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("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("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("FromLocation") - .IsRequired() - .HasColumnType("text"); - - b.Property("ToLocation") - .IsRequired() - .HasColumnType("text"); - - b.HasDiscriminator().HasValue((byte)3); - }); - - modelBuilder.Entity("API.Schema.Jobs.RetrieveChaptersJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("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("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("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 deleted file mode 100644 index 8f418f7..0000000 --- a/API/Migrations/20250308170713_dev-080325-4.cs +++ /dev/null @@ -1,62 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace API.Migrations -{ - /// - public partial class dev0803254 : Migration - { - /// - 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); - } - - /// - 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); - } - } -} diff --git a/API/Migrations/20250313145235_dev-130325-1.Designer.cs b/API/Migrations/20250313145235_dev-130325-1.Designer.cs deleted file mode 100644 index ba59c25..0000000 --- a/API/Migrations/20250313145235_dev-130325-1.Designer.cs +++ /dev/null @@ -1,735 +0,0 @@ -// -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("20250313145235_dev-130325-1")] - partial class dev1303251 - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "9.0.3") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "hstore"); - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("API.Schema.Author", b => - { - b.Property("AuthorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("AuthorName") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("AuthorId"); - - b.ToTable("Authors"); - }); - - modelBuilder.Entity("API.Schema.Chapter", b => - { - b.Property("ChapterId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("ArchiveFileName") - .IsRequired() - .HasColumnType("text"); - - b.Property("ChapterNumber") - .IsRequired() - .HasMaxLength(10) - .HasColumnType("character varying(10)"); - - b.Property("Downloaded") - .HasColumnType("boolean"); - - b.Property("ParentMangaId") - .IsRequired() - .HasColumnType("character varying(64)"); - - b.Property("Title") - .HasColumnType("text"); - - b.Property("Url") - .IsRequired() - .HasColumnType("text"); - - b.Property("VolumeNumber") - .HasColumnType("integer"); - - b.HasKey("ChapterId"); - - b.HasIndex("ParentMangaId"); - - b.ToTable("Chapters"); - }); - - modelBuilder.Entity("API.Schema.Jobs.Job", b => - { - b.Property("JobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.PrimitiveCollection("DependsOnJobsIds") - .HasMaxLength(64) - .HasColumnType("text[]"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("JobId1") - .HasColumnType("character varying(64)"); - - b.Property("JobType") - .HasColumnType("smallint"); - - b.Property("LastExecution") - .HasColumnType("timestamp with time zone"); - - b.Property("ParentJobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("RecurrenceMs") - .HasColumnType("numeric(20,0)"); - - b.Property("state") - .HasColumnType("smallint"); - - b.HasKey("JobId"); - - b.HasIndex("JobId1"); - - b.HasIndex("ParentJobId"); - - b.ToTable("Jobs"); - - b.HasDiscriminator("JobType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.LibraryConnectors.LibraryConnector", b => - { - b.Property("LibraryConnectorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Auth") - .IsRequired() - .HasColumnType("text"); - - b.Property("BaseUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("LibraryType") - .HasColumnType("smallint"); - - b.HasKey("LibraryConnectorId"); - - b.ToTable("LibraryConnectors"); - - b.HasDiscriminator("LibraryType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.Link", b => - { - b.Property("LinkId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("LinkProvider") - .IsRequired() - .HasColumnType("text"); - - b.Property("LinkUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("LinkId"); - - b.HasIndex("MangaId"); - - b.ToTable("Link"); - }); - - modelBuilder.Entity("API.Schema.Manga", b => - { - b.Property("MangaId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("CoverFileNameInCache") - .HasColumnType("text"); - - b.Property("CoverUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("Description") - .IsRequired() - .HasColumnType("text"); - - b.Property("FolderName") - .IsRequired() - .HasColumnType("text"); - - b.Property("IdOnConnectorSite") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("IgnoreChapterBefore") - .HasColumnType("real"); - - b.Property("MangaConnectorId") - .IsRequired() - .HasColumnType("character varying(32)"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("OriginalLanguage") - .HasColumnType("text"); - - b.Property("ReleaseStatus") - .HasColumnType("smallint"); - - b.Property("WebsiteUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("Year") - .HasColumnType("bigint"); - - b.HasKey("MangaId"); - - b.HasIndex("MangaConnectorId"); - - b.ToTable("Manga"); - }); - - modelBuilder.Entity("API.Schema.MangaAltTitle", b => - { - b.Property("AltTitleId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Language") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("character varying(8)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("AltTitleId"); - - b.HasIndex("MangaId"); - - b.ToTable("AltTitles"); - }); - - modelBuilder.Entity("API.Schema.MangaConnectors.MangaConnector", b => - { - b.Property("Name") - .HasMaxLength(32) - .HasColumnType("character varying(32)"); - - b.PrimitiveCollection("BaseUris") - .IsRequired() - .HasColumnType("text[]"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("IconUrl") - .IsRequired() - .HasColumnType("text"); - - b.PrimitiveCollection("SupportedLanguages") - .IsRequired() - .HasColumnType("text[]"); - - b.HasKey("Name"); - - b.ToTable("MangaConnectors"); - - b.HasDiscriminator("Name").HasValue("MangaConnector"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.MangaTag", b => - { - b.Property("Tag") - .HasColumnType("text"); - - b.HasKey("Tag"); - - b.ToTable("Tags"); - }); - - modelBuilder.Entity("API.Schema.Notification", b => - { - b.Property("NotificationId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Date") - .HasColumnType("timestamp with time zone"); - - b.Property("Message") - .IsRequired() - .HasColumnType("text"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text"); - - b.Property("Urgency") - .HasColumnType("smallint"); - - b.HasKey("NotificationId"); - - b.ToTable("Notifications"); - }); - - modelBuilder.Entity("API.Schema.NotificationConnectors.NotificationConnector", b => - { - b.Property("Name") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Body") - .IsRequired() - .HasColumnType("text"); - - b.Property>("Headers") - .IsRequired() - .HasColumnType("hstore"); - - b.Property("HttpMethod") - .IsRequired() - .HasColumnType("text"); - - b.Property("Url") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Name"); - - b.ToTable("NotificationConnectors"); - }); - - modelBuilder.Entity("AuthorManga", b => - { - b.Property("AuthorsAuthorId") - .HasColumnType("character varying(64)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("AuthorsAuthorId", "MangaId"); - - b.HasIndex("MangaId"); - - b.ToTable("AuthorManga"); - }); - - modelBuilder.Entity("MangaMangaTag", b => - { - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("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("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("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("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("FromLocation") - .IsRequired() - .HasColumnType("text"); - - b.Property("ToLocation") - .IsRequired() - .HasColumnType("text"); - - b.HasDiscriminator().HasValue((byte)3); - }); - - modelBuilder.Entity("API.Schema.Jobs.RetrieveChaptersJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("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("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("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/20250313145235_dev-130325-1.cs b/API/Migrations/20250313145235_dev-130325-1.cs deleted file mode 100644 index 94cfb74..0000000 --- a/API/Migrations/20250313145235_dev-130325-1.cs +++ /dev/null @@ -1,28 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace API.Migrations -{ - /// - public partial class dev1303251 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.RenameColumn( - name: "ConnectorId", - table: "Manga", - newName: "IdOnConnectorSite"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.RenameColumn( - name: "IdOnConnectorSite", - table: "Manga", - newName: "ConnectorId"); - } - } -} diff --git a/API/Migrations/20250313175936_dev-130325-2.Designer.cs b/API/Migrations/20250313175936_dev-130325-2.Designer.cs deleted file mode 100644 index fba3600..0000000 --- a/API/Migrations/20250313175936_dev-130325-2.Designer.cs +++ /dev/null @@ -1,745 +0,0 @@ -// -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("20250313175936_dev-130325-2")] - partial class dev1303252 - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "9.0.3") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "hstore"); - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("API.Schema.Author", b => - { - b.Property("AuthorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("AuthorName") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("AuthorId"); - - b.ToTable("Authors"); - }); - - modelBuilder.Entity("API.Schema.Chapter", b => - { - b.Property("ChapterId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("ArchiveFileName") - .IsRequired() - .HasColumnType("text"); - - b.Property("ChapterNumber") - .IsRequired() - .HasMaxLength(10) - .HasColumnType("character varying(10)"); - - b.Property("Downloaded") - .HasColumnType("boolean"); - - b.Property("ParentMangaId") - .IsRequired() - .HasColumnType("character varying(64)"); - - b.Property("Title") - .HasColumnType("text"); - - b.Property("Url") - .IsRequired() - .HasColumnType("text"); - - b.Property("VolumeNumber") - .HasColumnType("integer"); - - b.HasKey("ChapterId"); - - b.HasIndex("ParentMangaId"); - - b.ToTable("Chapters"); - }); - - modelBuilder.Entity("API.Schema.Jobs.Job", b => - { - b.Property("JobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.PrimitiveCollection("DependsOnJobsIds") - .HasMaxLength(64) - .HasColumnType("text[]"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("JobId1") - .HasColumnType("character varying(64)"); - - b.Property("JobType") - .HasColumnType("smallint"); - - b.Property("LastExecution") - .HasColumnType("timestamp with time zone"); - - b.Property("ParentJobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("RecurrenceMs") - .HasColumnType("numeric(20,0)"); - - b.Property("state") - .HasColumnType("smallint"); - - b.HasKey("JobId"); - - b.HasIndex("JobId1"); - - b.HasIndex("ParentJobId"); - - b.ToTable("Jobs"); - - b.HasDiscriminator("JobType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.LibraryConnectors.LibraryConnector", b => - { - b.Property("LibraryConnectorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Auth") - .IsRequired() - .HasColumnType("text"); - - b.Property("BaseUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("LibraryType") - .HasColumnType("smallint"); - - b.HasKey("LibraryConnectorId"); - - b.ToTable("LibraryConnectors"); - - b.HasDiscriminator("LibraryType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.Link", b => - { - b.Property("LinkId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("LinkProvider") - .IsRequired() - .HasColumnType("text"); - - b.Property("LinkUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("LinkId"); - - b.HasIndex("MangaId"); - - b.ToTable("Link"); - }); - - modelBuilder.Entity("API.Schema.Manga", b => - { - b.Property("MangaId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("CoverFileNameInCache") - .HasColumnType("text"); - - b.Property("CoverUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("Description") - .IsRequired() - .HasColumnType("text"); - - b.Property("FolderName") - .IsRequired() - .HasColumnType("text"); - - b.Property("IdOnConnectorSite") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("character varying(128)"); - - b.Property("IgnoreChapterBefore") - .HasColumnType("real"); - - b.Property("MangaConnectorId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(512) - .HasColumnType("character varying(512)"); - - b.Property("OriginalLanguage") - .HasMaxLength(8) - .HasColumnType("character varying(8)"); - - b.Property("ReleaseStatus") - .HasColumnType("smallint"); - - b.Property("WebsiteUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("Year") - .HasColumnType("bigint"); - - b.HasKey("MangaId"); - - b.HasIndex("MangaConnectorId"); - - b.ToTable("Manga"); - }); - - modelBuilder.Entity("API.Schema.MangaAltTitle", b => - { - b.Property("AltTitleId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Language") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("character varying(8)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("AltTitleId"); - - b.HasIndex("MangaId"); - - b.ToTable("AltTitles"); - }); - - modelBuilder.Entity("API.Schema.MangaConnectors.MangaConnector", b => - { - b.Property("Name") - .HasMaxLength(32) - .HasColumnType("character varying(32)"); - - b.PrimitiveCollection("BaseUris") - .IsRequired() - .HasColumnType("text[]"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("IconUrl") - .IsRequired() - .HasColumnType("text"); - - b.PrimitiveCollection("SupportedLanguages") - .IsRequired() - .HasColumnType("text[]"); - - b.HasKey("Name"); - - b.ToTable("MangaConnectors"); - - b.HasDiscriminator("Name").HasValue("MangaConnector"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.MangaTag", b => - { - b.Property("Tag") - .HasColumnType("text"); - - b.HasKey("Tag"); - - b.ToTable("Tags"); - }); - - modelBuilder.Entity("API.Schema.Notification", b => - { - b.Property("NotificationId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Date") - .HasColumnType("timestamp with time zone"); - - b.Property("Message") - .IsRequired() - .HasColumnType("text"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text"); - - b.Property("Urgency") - .HasColumnType("smallint"); - - b.HasKey("NotificationId"); - - b.ToTable("Notifications"); - }); - - modelBuilder.Entity("API.Schema.NotificationConnectors.NotificationConnector", b => - { - b.Property("Name") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Body") - .IsRequired() - .HasColumnType("text"); - - b.Property>("Headers") - .IsRequired() - .HasColumnType("hstore"); - - b.Property("HttpMethod") - .IsRequired() - .HasColumnType("text"); - - b.Property("Url") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Name"); - - b.ToTable("NotificationConnectors"); - }); - - modelBuilder.Entity("AuthorManga", b => - { - b.Property("AuthorsAuthorId") - .HasColumnType("character varying(64)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("AuthorsAuthorId", "MangaId"); - - b.HasIndex("MangaId"); - - b.ToTable("AuthorManga"); - }); - - modelBuilder.Entity("MangaMangaTag", b => - { - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("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("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("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("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("FromLocation") - .IsRequired() - .HasColumnType("text"); - - b.Property("ToLocation") - .IsRequired() - .HasColumnType("text"); - - b.HasDiscriminator().HasValue((byte)3); - }); - - modelBuilder.Entity("API.Schema.Jobs.RetrieveChaptersJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("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("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("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.Manganato", b => - { - b.HasBaseType("API.Schema.MangaConnectors.MangaConnector"); - - b.HasDiscriminator().HasValue("Manganato"); - }); - - 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/20250313175936_dev-130325-2.cs b/API/Migrations/20250313175936_dev-130325-2.cs deleted file mode 100644 index b43f3a8..0000000 --- a/API/Migrations/20250313175936_dev-130325-2.cs +++ /dev/null @@ -1,94 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace API.Migrations -{ - /// - public partial class dev1303252 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "OriginalLanguage", - table: "Manga", - type: "character varying(8)", - maxLength: 8, - nullable: true, - oldClrType: typeof(string), - oldType: "text", - oldNullable: true); - - migrationBuilder.AlterColumn( - name: "Name", - table: "Manga", - type: "character varying(512)", - maxLength: 512, - nullable: false, - oldClrType: typeof(string), - oldType: "text"); - - migrationBuilder.AlterColumn( - name: "MangaConnectorId", - table: "Manga", - type: "character varying(64)", - maxLength: 64, - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(32)"); - - migrationBuilder.AlterColumn( - name: "IdOnConnectorSite", - table: "Manga", - type: "character varying(128)", - maxLength: 128, - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(64)", - oldMaxLength: 64); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "OriginalLanguage", - table: "Manga", - type: "text", - nullable: true, - oldClrType: typeof(string), - oldType: "character varying(8)", - oldMaxLength: 8, - oldNullable: true); - - migrationBuilder.AlterColumn( - name: "Name", - table: "Manga", - type: "text", - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(512)", - oldMaxLength: 512); - - migrationBuilder.AlterColumn( - name: "MangaConnectorId", - table: "Manga", - type: "character varying(32)", - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(64)", - oldMaxLength: 64); - - migrationBuilder.AlterColumn( - name: "IdOnConnectorSite", - table: "Manga", - type: "character varying(64)", - maxLength: 64, - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(128)", - oldMaxLength: 128); - } - } -} diff --git a/API/Migrations/20250313180256_dev-130325-3.Designer.cs b/API/Migrations/20250313180256_dev-130325-3.Designer.cs deleted file mode 100644 index 8acd5ac..0000000 --- a/API/Migrations/20250313180256_dev-130325-3.Designer.cs +++ /dev/null @@ -1,747 +0,0 @@ -// -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("20250313180256_dev-130325-3")] - partial class dev1303253 - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "9.0.3") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "hstore"); - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("API.Schema.Author", b => - { - b.Property("AuthorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("AuthorName") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("AuthorId"); - - b.ToTable("Authors"); - }); - - modelBuilder.Entity("API.Schema.Chapter", b => - { - b.Property("ChapterId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("ArchiveFileName") - .IsRequired() - .HasColumnType("text"); - - b.Property("ChapterNumber") - .IsRequired() - .HasMaxLength(10) - .HasColumnType("character varying(10)"); - - b.Property("Downloaded") - .HasColumnType("boolean"); - - b.Property("ParentMangaId") - .IsRequired() - .HasColumnType("character varying(64)"); - - b.Property("Title") - .HasColumnType("text"); - - b.Property("Url") - .IsRequired() - .HasColumnType("text"); - - b.Property("VolumeNumber") - .HasColumnType("integer"); - - b.HasKey("ChapterId"); - - b.HasIndex("ParentMangaId"); - - b.ToTable("Chapters"); - }); - - modelBuilder.Entity("API.Schema.Jobs.Job", b => - { - b.Property("JobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.PrimitiveCollection("DependsOnJobsIds") - .HasMaxLength(64) - .HasColumnType("text[]"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("JobId1") - .HasColumnType("character varying(64)"); - - b.Property("JobType") - .HasColumnType("smallint"); - - b.Property("LastExecution") - .HasColumnType("timestamp with time zone"); - - b.Property("ParentJobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("RecurrenceMs") - .HasColumnType("numeric(20,0)"); - - b.Property("state") - .HasColumnType("smallint"); - - b.HasKey("JobId"); - - b.HasIndex("JobId1"); - - b.HasIndex("ParentJobId"); - - b.ToTable("Jobs"); - - b.HasDiscriminator("JobType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.LibraryConnectors.LibraryConnector", b => - { - b.Property("LibraryConnectorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Auth") - .IsRequired() - .HasColumnType("text"); - - b.Property("BaseUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("LibraryType") - .HasColumnType("smallint"); - - b.HasKey("LibraryConnectorId"); - - b.ToTable("LibraryConnectors"); - - b.HasDiscriminator("LibraryType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.Link", b => - { - b.Property("LinkId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("LinkProvider") - .IsRequired() - .HasColumnType("text"); - - b.Property("LinkUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("LinkId"); - - b.HasIndex("MangaId"); - - b.ToTable("Link"); - }); - - modelBuilder.Entity("API.Schema.Manga", b => - { - b.Property("MangaId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("CoverFileNameInCache") - .HasColumnType("text"); - - b.Property("CoverUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("Description") - .IsRequired() - .HasColumnType("text"); - - b.Property("FolderName") - .IsRequired() - .HasColumnType("text"); - - b.Property("IdOnConnectorSite") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("character varying(128)"); - - b.Property("IgnoreChapterBefore") - .HasColumnType("real"); - - b.Property("MangaConnectorId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(512) - .HasColumnType("character varying(512)"); - - b.Property("OriginalLanguage") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("character varying(8)"); - - b.Property("ReleaseStatus") - .HasColumnType("smallint"); - - b.Property("WebsiteUrl") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("Year") - .HasColumnType("bigint"); - - b.HasKey("MangaId"); - - b.HasIndex("MangaConnectorId"); - - b.ToTable("Manga"); - }); - - modelBuilder.Entity("API.Schema.MangaAltTitle", b => - { - b.Property("AltTitleId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Language") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("character varying(8)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("AltTitleId"); - - b.HasIndex("MangaId"); - - b.ToTable("AltTitles"); - }); - - modelBuilder.Entity("API.Schema.MangaConnectors.MangaConnector", b => - { - b.Property("Name") - .HasMaxLength(32) - .HasColumnType("character varying(32)"); - - b.PrimitiveCollection("BaseUris") - .IsRequired() - .HasColumnType("text[]"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("IconUrl") - .IsRequired() - .HasColumnType("text"); - - b.PrimitiveCollection("SupportedLanguages") - .IsRequired() - .HasColumnType("text[]"); - - b.HasKey("Name"); - - b.ToTable("MangaConnectors"); - - b.HasDiscriminator("Name").HasValue("MangaConnector"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.MangaTag", b => - { - b.Property("Tag") - .HasColumnType("text"); - - b.HasKey("Tag"); - - b.ToTable("Tags"); - }); - - modelBuilder.Entity("API.Schema.Notification", b => - { - b.Property("NotificationId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Date") - .HasColumnType("timestamp with time zone"); - - b.Property("Message") - .IsRequired() - .HasColumnType("text"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text"); - - b.Property("Urgency") - .HasColumnType("smallint"); - - b.HasKey("NotificationId"); - - b.ToTable("Notifications"); - }); - - modelBuilder.Entity("API.Schema.NotificationConnectors.NotificationConnector", b => - { - b.Property("Name") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Body") - .IsRequired() - .HasColumnType("text"); - - b.Property>("Headers") - .IsRequired() - .HasColumnType("hstore"); - - b.Property("HttpMethod") - .IsRequired() - .HasColumnType("text"); - - b.Property("Url") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Name"); - - b.ToTable("NotificationConnectors"); - }); - - modelBuilder.Entity("AuthorManga", b => - { - b.Property("AuthorsAuthorId") - .HasColumnType("character varying(64)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("AuthorsAuthorId", "MangaId"); - - b.HasIndex("MangaId"); - - b.ToTable("AuthorManga"); - }); - - modelBuilder.Entity("MangaMangaTag", b => - { - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("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("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("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("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("FromLocation") - .IsRequired() - .HasColumnType("text"); - - b.Property("ToLocation") - .IsRequired() - .HasColumnType("text"); - - b.HasDiscriminator().HasValue((byte)3); - }); - - modelBuilder.Entity("API.Schema.Jobs.RetrieveChaptersJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("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("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("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.Manganato", b => - { - b.HasBaseType("API.Schema.MangaConnectors.MangaConnector"); - - b.HasDiscriminator().HasValue("Manganato"); - }); - - 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/20250313180256_dev-130325-3.cs b/API/Migrations/20250313180256_dev-130325-3.cs deleted file mode 100644 index f0e12f3..0000000 --- a/API/Migrations/20250313180256_dev-130325-3.cs +++ /dev/null @@ -1,58 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace API.Migrations -{ - /// - public partial class dev1303253 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "WebsiteUrl", - table: "Manga", - type: "character varying(256)", - maxLength: 256, - nullable: false, - oldClrType: typeof(string), - oldType: "text"); - - migrationBuilder.AlterColumn( - name: "OriginalLanguage", - table: "Manga", - type: "character varying(8)", - maxLength: 8, - nullable: false, - defaultValue: "", - oldClrType: typeof(string), - oldType: "character varying(8)", - oldMaxLength: 8, - oldNullable: true); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "WebsiteUrl", - table: "Manga", - type: "text", - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(256)", - oldMaxLength: 256); - - migrationBuilder.AlterColumn( - name: "OriginalLanguage", - table: "Manga", - type: "character varying(8)", - maxLength: 8, - nullable: true, - oldClrType: typeof(string), - oldType: "character varying(8)", - oldMaxLength: 8); - } - } -} diff --git a/API/Migrations/20250313180926_dev-130325-4.Designer.cs b/API/Migrations/20250313180926_dev-130325-4.Designer.cs deleted file mode 100644 index 49f138d..0000000 --- a/API/Migrations/20250313180926_dev-130325-4.Designer.cs +++ /dev/null @@ -1,767 +0,0 @@ -// -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("20250313180926_dev-130325-4")] - partial class dev1303254 - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "9.0.3") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "hstore"); - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("API.Schema.Author", b => - { - b.Property("AuthorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("AuthorName") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("character varying(128)"); - - b.HasKey("AuthorId"); - - b.ToTable("Authors"); - }); - - modelBuilder.Entity("API.Schema.Chapter", b => - { - b.Property("ChapterId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("ArchiveFileName") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("ChapterNumber") - .IsRequired() - .HasMaxLength(10) - .HasColumnType("character varying(10)"); - - b.Property("Downloaded") - .HasColumnType("boolean"); - - b.Property("ParentMangaId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Title") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("Url") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("VolumeNumber") - .HasColumnType("integer"); - - b.HasKey("ChapterId"); - - b.HasIndex("ParentMangaId"); - - b.ToTable("Chapters"); - }); - - modelBuilder.Entity("API.Schema.Jobs.Job", b => - { - b.Property("JobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.PrimitiveCollection("DependsOnJobsIds") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("text[]"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("JobId1") - .HasColumnType("character varying(64)"); - - b.Property("JobType") - .HasColumnType("smallint"); - - b.Property("LastExecution") - .HasColumnType("timestamp with time zone"); - - b.Property("ParentJobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("RecurrenceMs") - .HasColumnType("numeric(20,0)"); - - b.Property("state") - .HasColumnType("smallint"); - - b.HasKey("JobId"); - - b.HasIndex("JobId1"); - - b.HasIndex("ParentJobId"); - - b.ToTable("Jobs"); - - b.HasDiscriminator("JobType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.LibraryConnectors.LibraryConnector", b => - { - b.Property("LibraryConnectorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Auth") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("BaseUrl") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("LibraryType") - .HasColumnType("smallint"); - - b.HasKey("LibraryConnectorId"); - - b.ToTable("LibraryConnectors"); - - b.HasDiscriminator("LibraryType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.Link", b => - { - b.Property("LinkId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("LinkProvider") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("character varying(128)"); - - b.Property("LinkUrl") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("character varying(128)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("LinkId"); - - b.HasIndex("MangaId"); - - b.ToTable("Link"); - }); - - modelBuilder.Entity("API.Schema.Manga", b => - { - b.Property("MangaId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("CoverFileNameInCache") - .HasColumnType("text"); - - b.Property("CoverUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("Description") - .IsRequired() - .HasColumnType("text"); - - b.Property("FolderName") - .IsRequired() - .HasColumnType("text"); - - b.Property("IdOnConnectorSite") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("character varying(128)"); - - b.Property("IgnoreChapterBefore") - .HasColumnType("real"); - - b.Property("MangaConnectorId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("OriginalLanguage") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("character varying(8)"); - - b.Property("ReleaseStatus") - .HasColumnType("smallint"); - - b.Property("WebsiteUrl") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("Year") - .HasColumnType("bigint"); - - b.HasKey("MangaId"); - - b.HasIndex("MangaConnectorId"); - - b.ToTable("Manga"); - }); - - modelBuilder.Entity("API.Schema.MangaAltTitle", b => - { - b.Property("AltTitleId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Language") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("character varying(8)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("Title") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.HasKey("AltTitleId"); - - b.HasIndex("MangaId"); - - b.ToTable("AltTitles"); - }); - - modelBuilder.Entity("API.Schema.MangaConnectors.MangaConnector", b => - { - b.Property("Name") - .HasMaxLength(32) - .HasColumnType("character varying(32)"); - - b.PrimitiveCollection("BaseUris") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("text[]"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("IconUrl") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.PrimitiveCollection("SupportedLanguages") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("text[]"); - - b.HasKey("Name"); - - b.ToTable("MangaConnectors"); - - b.HasDiscriminator("Name").HasValue("MangaConnector"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.MangaTag", b => - { - b.Property("Tag") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.HasKey("Tag"); - - b.ToTable("Tags"); - }); - - modelBuilder.Entity("API.Schema.Notification", b => - { - b.Property("NotificationId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Date") - .HasColumnType("timestamp with time zone"); - - b.Property("Message") - .IsRequired() - .HasMaxLength(512) - .HasColumnType("character varying(512)"); - - b.Property("Title") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("character varying(128)"); - - b.Property("Urgency") - .HasColumnType("smallint"); - - b.HasKey("NotificationId"); - - b.ToTable("Notifications"); - }); - - modelBuilder.Entity("API.Schema.NotificationConnectors.NotificationConnector", b => - { - b.Property("Name") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Body") - .IsRequired() - .HasMaxLength(512) - .HasColumnType("character varying(512)"); - - b.Property>("Headers") - .IsRequired() - .HasColumnType("hstore"); - - b.Property("HttpMethod") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("character varying(8)"); - - b.Property("Url") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.HasKey("Name"); - - b.ToTable("NotificationConnectors"); - }); - - modelBuilder.Entity("AuthorManga", b => - { - b.Property("AuthorsAuthorId") - .HasColumnType("character varying(64)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("AuthorsAuthorId", "MangaId"); - - b.HasIndex("MangaId"); - - b.ToTable("AuthorManga"); - }); - - modelBuilder.Entity("MangaMangaTag", b => - { - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("MangaTagsTag") - .HasColumnType("character varying(64)"); - - 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("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("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("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("FromLocation") - .IsRequired() - .HasColumnType("text"); - - b.Property("ToLocation") - .IsRequired() - .HasColumnType("text"); - - b.HasDiscriminator().HasValue((byte)3); - }); - - modelBuilder.Entity("API.Schema.Jobs.RetrieveChaptersJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("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("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("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.Manganato", b => - { - b.HasBaseType("API.Schema.MangaConnectors.MangaConnector"); - - b.HasDiscriminator().HasValue("Manganato"); - }); - - 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/20250313180926_dev-130325-4.cs b/API/Migrations/20250313180926_dev-130325-4.cs deleted file mode 100644 index 57ad35d..0000000 --- a/API/Migrations/20250313180926_dev-130325-4.cs +++ /dev/null @@ -1,366 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace API.Migrations -{ - /// - public partial class dev1303254 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "Tag", - table: "Tags", - type: "character varying(64)", - maxLength: 64, - nullable: false, - oldClrType: typeof(string), - oldType: "text"); - - migrationBuilder.AlterColumn( - name: "Title", - table: "Notifications", - type: "character varying(128)", - maxLength: 128, - nullable: false, - oldClrType: typeof(string), - oldType: "text"); - - migrationBuilder.AlterColumn( - name: "Message", - table: "Notifications", - type: "character varying(512)", - maxLength: 512, - nullable: false, - oldClrType: typeof(string), - oldType: "text"); - - migrationBuilder.AlterColumn( - name: "Url", - table: "NotificationConnectors", - type: "character varying(256)", - maxLength: 256, - nullable: false, - oldClrType: typeof(string), - oldType: "text"); - - migrationBuilder.AlterColumn( - name: "HttpMethod", - table: "NotificationConnectors", - type: "character varying(8)", - maxLength: 8, - nullable: false, - oldClrType: typeof(string), - oldType: "text"); - - migrationBuilder.AlterColumn( - name: "Body", - table: "NotificationConnectors", - type: "character varying(512)", - maxLength: 512, - nullable: false, - oldClrType: typeof(string), - oldType: "text"); - - migrationBuilder.AlterColumn( - name: "MangaTagsTag", - table: "MangaMangaTag", - type: "character varying(64)", - nullable: false, - oldClrType: typeof(string), - oldType: "text"); - - migrationBuilder.AlterColumn( - name: "IconUrl", - table: "MangaConnectors", - type: "character varying(256)", - maxLength: 256, - nullable: false, - oldClrType: typeof(string), - oldType: "text"); - - migrationBuilder.AlterColumn( - name: "Name", - table: "Manga", - type: "character varying(256)", - maxLength: 256, - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(512)", - oldMaxLength: 512); - - migrationBuilder.AlterColumn( - name: "LinkUrl", - table: "Link", - type: "character varying(128)", - maxLength: 128, - nullable: false, - oldClrType: typeof(string), - oldType: "text"); - - migrationBuilder.AlterColumn( - name: "LinkProvider", - table: "Link", - type: "character varying(128)", - maxLength: 128, - nullable: false, - oldClrType: typeof(string), - oldType: "text"); - - migrationBuilder.AlterColumn( - name: "BaseUrl", - table: "LibraryConnectors", - type: "character varying(256)", - maxLength: 256, - nullable: false, - oldClrType: typeof(string), - oldType: "text"); - - migrationBuilder.AlterColumn( - name: "Auth", - table: "LibraryConnectors", - type: "character varying(256)", - maxLength: 256, - nullable: false, - oldClrType: typeof(string), - oldType: "text"); - - migrationBuilder.AlterColumn( - name: "DependsOnJobsIds", - table: "Jobs", - type: "text[]", - maxLength: 64, - nullable: false, - defaultValue: new string[0], - oldClrType: typeof(string[]), - oldType: "text[]", - oldMaxLength: 64, - oldNullable: true); - - migrationBuilder.AlterColumn( - name: "Url", - table: "Chapters", - type: "character varying(256)", - maxLength: 256, - nullable: false, - oldClrType: typeof(string), - oldType: "text"); - - migrationBuilder.AlterColumn( - name: "Title", - table: "Chapters", - type: "character varying(256)", - maxLength: 256, - nullable: true, - oldClrType: typeof(string), - oldType: "text", - oldNullable: true); - - migrationBuilder.AlterColumn( - name: "ArchiveFileName", - table: "Chapters", - type: "character varying(256)", - maxLength: 256, - nullable: false, - oldClrType: typeof(string), - oldType: "text"); - - migrationBuilder.AlterColumn( - name: "AuthorName", - table: "Authors", - type: "character varying(128)", - maxLength: 128, - nullable: false, - oldClrType: typeof(string), - oldType: "text"); - - migrationBuilder.AlterColumn( - name: "Title", - table: "AltTitles", - type: "character varying(256)", - maxLength: 256, - nullable: false, - oldClrType: typeof(string), - oldType: "text"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "Tag", - table: "Tags", - type: "text", - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(64)", - oldMaxLength: 64); - - migrationBuilder.AlterColumn( - name: "Title", - table: "Notifications", - type: "text", - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(128)", - oldMaxLength: 128); - - migrationBuilder.AlterColumn( - name: "Message", - table: "Notifications", - type: "text", - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(512)", - oldMaxLength: 512); - - migrationBuilder.AlterColumn( - name: "Url", - table: "NotificationConnectors", - type: "text", - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(256)", - oldMaxLength: 256); - - migrationBuilder.AlterColumn( - name: "HttpMethod", - table: "NotificationConnectors", - type: "text", - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(8)", - oldMaxLength: 8); - - migrationBuilder.AlterColumn( - name: "Body", - table: "NotificationConnectors", - type: "text", - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(512)", - oldMaxLength: 512); - - migrationBuilder.AlterColumn( - name: "MangaTagsTag", - table: "MangaMangaTag", - type: "text", - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(64)"); - - migrationBuilder.AlterColumn( - name: "IconUrl", - table: "MangaConnectors", - type: "text", - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(256)", - oldMaxLength: 256); - - migrationBuilder.AlterColumn( - name: "Name", - table: "Manga", - type: "character varying(512)", - maxLength: 512, - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(256)", - oldMaxLength: 256); - - migrationBuilder.AlterColumn( - name: "LinkUrl", - table: "Link", - type: "text", - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(128)", - oldMaxLength: 128); - - migrationBuilder.AlterColumn( - name: "LinkProvider", - table: "Link", - type: "text", - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(128)", - oldMaxLength: 128); - - migrationBuilder.AlterColumn( - name: "BaseUrl", - table: "LibraryConnectors", - type: "text", - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(256)", - oldMaxLength: 256); - - migrationBuilder.AlterColumn( - name: "Auth", - table: "LibraryConnectors", - type: "text", - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(256)", - oldMaxLength: 256); - - migrationBuilder.AlterColumn( - name: "DependsOnJobsIds", - table: "Jobs", - type: "text[]", - maxLength: 64, - nullable: true, - oldClrType: typeof(string[]), - oldType: "text[]", - oldMaxLength: 64); - - migrationBuilder.AlterColumn( - name: "Url", - table: "Chapters", - type: "text", - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(256)", - oldMaxLength: 256); - - migrationBuilder.AlterColumn( - name: "Title", - table: "Chapters", - type: "text", - nullable: true, - oldClrType: typeof(string), - oldType: "character varying(256)", - oldMaxLength: 256, - oldNullable: true); - - migrationBuilder.AlterColumn( - name: "ArchiveFileName", - table: "Chapters", - type: "text", - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(256)", - oldMaxLength: 256); - - migrationBuilder.AlterColumn( - name: "AuthorName", - table: "Authors", - type: "text", - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(128)", - oldMaxLength: 128); - - migrationBuilder.AlterColumn( - name: "Title", - table: "AltTitles", - type: "text", - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(256)", - oldMaxLength: 256); - } - } -} diff --git a/API/Migrations/20250313181126_dev-130325-5.Designer.cs b/API/Migrations/20250313181126_dev-130325-5.Designer.cs deleted file mode 100644 index 3b4508b..0000000 --- a/API/Migrations/20250313181126_dev-130325-5.Designer.cs +++ /dev/null @@ -1,766 +0,0 @@ -// -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("20250313181126_dev-130325-5")] - partial class dev1303255 - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "9.0.3") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "hstore"); - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("API.Schema.Author", b => - { - b.Property("AuthorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("AuthorName") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("character varying(128)"); - - b.HasKey("AuthorId"); - - b.ToTable("Authors"); - }); - - modelBuilder.Entity("API.Schema.Chapter", b => - { - b.Property("ChapterId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("ArchiveFileName") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("ChapterNumber") - .IsRequired() - .HasMaxLength(10) - .HasColumnType("character varying(10)"); - - b.Property("Downloaded") - .HasColumnType("boolean"); - - b.Property("ParentMangaId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Title") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("Url") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("VolumeNumber") - .HasColumnType("integer"); - - b.HasKey("ChapterId"); - - b.HasIndex("ParentMangaId"); - - b.ToTable("Chapters"); - }); - - modelBuilder.Entity("API.Schema.Jobs.Job", b => - { - b.Property("JobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.PrimitiveCollection("DependsOnJobsIds") - .HasMaxLength(64) - .HasColumnType("text[]"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("JobId1") - .HasColumnType("character varying(64)"); - - b.Property("JobType") - .HasColumnType("smallint"); - - b.Property("LastExecution") - .HasColumnType("timestamp with time zone"); - - b.Property("ParentJobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("RecurrenceMs") - .HasColumnType("numeric(20,0)"); - - b.Property("state") - .HasColumnType("smallint"); - - b.HasKey("JobId"); - - b.HasIndex("JobId1"); - - b.HasIndex("ParentJobId"); - - b.ToTable("Jobs"); - - b.HasDiscriminator("JobType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.LibraryConnectors.LibraryConnector", b => - { - b.Property("LibraryConnectorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Auth") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("BaseUrl") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("LibraryType") - .HasColumnType("smallint"); - - b.HasKey("LibraryConnectorId"); - - b.ToTable("LibraryConnectors"); - - b.HasDiscriminator("LibraryType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.Link", b => - { - b.Property("LinkId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("LinkProvider") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("character varying(128)"); - - b.Property("LinkUrl") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("character varying(128)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("LinkId"); - - b.HasIndex("MangaId"); - - b.ToTable("Link"); - }); - - modelBuilder.Entity("API.Schema.Manga", b => - { - b.Property("MangaId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("CoverFileNameInCache") - .HasColumnType("text"); - - b.Property("CoverUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("Description") - .IsRequired() - .HasColumnType("text"); - - b.Property("FolderName") - .IsRequired() - .HasColumnType("text"); - - b.Property("IdOnConnectorSite") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("character varying(128)"); - - b.Property("IgnoreChapterBefore") - .HasColumnType("real"); - - b.Property("MangaConnectorId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("OriginalLanguage") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("character varying(8)"); - - b.Property("ReleaseStatus") - .HasColumnType("smallint"); - - b.Property("WebsiteUrl") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("Year") - .HasColumnType("bigint"); - - b.HasKey("MangaId"); - - b.HasIndex("MangaConnectorId"); - - b.ToTable("Manga"); - }); - - modelBuilder.Entity("API.Schema.MangaAltTitle", b => - { - b.Property("AltTitleId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Language") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("character varying(8)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("Title") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.HasKey("AltTitleId"); - - b.HasIndex("MangaId"); - - b.ToTable("AltTitles"); - }); - - modelBuilder.Entity("API.Schema.MangaConnectors.MangaConnector", b => - { - b.Property("Name") - .HasMaxLength(32) - .HasColumnType("character varying(32)"); - - b.PrimitiveCollection("BaseUris") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("text[]"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("IconUrl") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.PrimitiveCollection("SupportedLanguages") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("text[]"); - - b.HasKey("Name"); - - b.ToTable("MangaConnectors"); - - b.HasDiscriminator("Name").HasValue("MangaConnector"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.MangaTag", b => - { - b.Property("Tag") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.HasKey("Tag"); - - b.ToTable("Tags"); - }); - - modelBuilder.Entity("API.Schema.Notification", b => - { - b.Property("NotificationId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Date") - .HasColumnType("timestamp with time zone"); - - b.Property("Message") - .IsRequired() - .HasMaxLength(512) - .HasColumnType("character varying(512)"); - - b.Property("Title") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("character varying(128)"); - - b.Property("Urgency") - .HasColumnType("smallint"); - - b.HasKey("NotificationId"); - - b.ToTable("Notifications"); - }); - - modelBuilder.Entity("API.Schema.NotificationConnectors.NotificationConnector", b => - { - b.Property("Name") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Body") - .IsRequired() - .HasMaxLength(512) - .HasColumnType("character varying(512)"); - - b.Property>("Headers") - .IsRequired() - .HasColumnType("hstore"); - - b.Property("HttpMethod") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("character varying(8)"); - - b.Property("Url") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.HasKey("Name"); - - b.ToTable("NotificationConnectors"); - }); - - modelBuilder.Entity("AuthorManga", b => - { - b.Property("AuthorsAuthorId") - .HasColumnType("character varying(64)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("AuthorsAuthorId", "MangaId"); - - b.HasIndex("MangaId"); - - b.ToTable("AuthorManga"); - }); - - modelBuilder.Entity("MangaMangaTag", b => - { - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("MangaTagsTag") - .HasColumnType("character varying(64)"); - - 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("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("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("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("FromLocation") - .IsRequired() - .HasColumnType("text"); - - b.Property("ToLocation") - .IsRequired() - .HasColumnType("text"); - - b.HasDiscriminator().HasValue((byte)3); - }); - - modelBuilder.Entity("API.Schema.Jobs.RetrieveChaptersJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("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("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("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.Manganato", b => - { - b.HasBaseType("API.Schema.MangaConnectors.MangaConnector"); - - b.HasDiscriminator().HasValue("Manganato"); - }); - - 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/20250313181126_dev-130325-5.cs b/API/Migrations/20250313181126_dev-130325-5.cs deleted file mode 100644 index f897cf0..0000000 --- a/API/Migrations/20250313181126_dev-130325-5.cs +++ /dev/null @@ -1,40 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace API.Migrations -{ - /// - public partial class dev1303255 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "DependsOnJobsIds", - table: "Jobs", - type: "text[]", - maxLength: 64, - nullable: true, - oldClrType: typeof(string[]), - oldType: "text[]", - oldMaxLength: 64); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "DependsOnJobsIds", - table: "Jobs", - type: "text[]", - maxLength: 64, - nullable: false, - defaultValue: new string[0], - oldClrType: typeof(string[]), - oldType: "text[]", - oldMaxLength: 64, - oldNullable: true); - } - } -} diff --git a/API/Migrations/20250313191146_dev-130325-6.Designer.cs b/API/Migrations/20250313191146_dev-130325-6.Designer.cs deleted file mode 100644 index 1fa6aee..0000000 --- a/API/Migrations/20250313191146_dev-130325-6.Designer.cs +++ /dev/null @@ -1,768 +0,0 @@ -// -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("20250313191146_dev-130325-6")] - partial class dev1303256 - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "9.0.3") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "hstore"); - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("API.Schema.Author", b => - { - b.Property("AuthorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("AuthorName") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("character varying(128)"); - - b.HasKey("AuthorId"); - - b.ToTable("Authors"); - }); - - modelBuilder.Entity("API.Schema.Chapter", b => - { - b.Property("ChapterId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("ArchiveFileName") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("ChapterNumber") - .IsRequired() - .HasMaxLength(10) - .HasColumnType("character varying(10)"); - - b.Property("Downloaded") - .HasColumnType("boolean"); - - b.Property("ParentMangaId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Title") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("Url") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("VolumeNumber") - .HasColumnType("integer"); - - b.HasKey("ChapterId"); - - b.HasIndex("ParentMangaId"); - - b.ToTable("Chapters"); - }); - - modelBuilder.Entity("API.Schema.Jobs.Job", b => - { - b.Property("JobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.PrimitiveCollection("DependsOnJobsIds") - .HasMaxLength(64) - .HasColumnType("text[]"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("JobId1") - .HasColumnType("character varying(64)"); - - b.Property("JobType") - .HasColumnType("smallint"); - - b.Property("LastExecution") - .HasColumnType("timestamp with time zone"); - - b.Property("ParentJobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("RecurrenceMs") - .HasColumnType("numeric(20,0)"); - - b.Property("state") - .HasColumnType("smallint"); - - b.HasKey("JobId"); - - b.HasIndex("JobId1"); - - b.HasIndex("ParentJobId"); - - b.ToTable("Jobs"); - - b.HasDiscriminator("JobType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.LibraryConnectors.LibraryConnector", b => - { - b.Property("LibraryConnectorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Auth") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("BaseUrl") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("LibraryType") - .HasColumnType("smallint"); - - b.HasKey("LibraryConnectorId"); - - b.ToTable("LibraryConnectors"); - - b.HasDiscriminator("LibraryType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.Link", b => - { - b.Property("LinkId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("LinkProvider") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("character varying(128)"); - - b.Property("LinkUrl") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("character varying(128)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("LinkId"); - - b.HasIndex("MangaId"); - - b.ToTable("Link"); - }); - - modelBuilder.Entity("API.Schema.Manga", b => - { - b.Property("MangaId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("CoverFileNameInCache") - .HasColumnType("text"); - - b.Property("CoverUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("Description") - .IsRequired() - .HasColumnType("text"); - - b.Property("FolderName") - .IsRequired() - .HasColumnType("text"); - - b.Property("IdOnConnectorSite") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("character varying(128)"); - - b.Property("IgnoreChapterBefore") - .HasColumnType("real"); - - b.Property("MangaConnectorId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("OriginalLanguage") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("character varying(8)"); - - b.Property("ReleaseStatus") - .HasColumnType("smallint"); - - b.Property("WebsiteUrl") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("Year") - .HasColumnType("bigint"); - - b.HasKey("MangaId"); - - b.HasIndex("MangaConnectorId"); - - b.ToTable("Manga"); - }); - - modelBuilder.Entity("API.Schema.MangaAltTitle", b => - { - b.Property("AltTitleId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Language") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("character varying(8)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("Title") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.HasKey("AltTitleId"); - - b.HasIndex("MangaId"); - - b.ToTable("AltTitles"); - }); - - modelBuilder.Entity("API.Schema.MangaConnectors.MangaConnector", b => - { - b.Property("Name") - .HasMaxLength(32) - .HasColumnType("character varying(32)"); - - b.PrimitiveCollection("BaseUris") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("text[]"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("IconUrl") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.PrimitiveCollection("SupportedLanguages") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("text[]"); - - b.HasKey("Name"); - - b.ToTable("MangaConnectors"); - - b.HasDiscriminator("Name").HasValue("MangaConnector"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.MangaTag", b => - { - b.Property("Tag") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.HasKey("Tag"); - - b.ToTable("Tags"); - }); - - modelBuilder.Entity("API.Schema.Notification", b => - { - b.Property("NotificationId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Date") - .HasColumnType("timestamp with time zone"); - - b.Property("Message") - .IsRequired() - .HasMaxLength(512) - .HasColumnType("character varying(512)"); - - b.Property("Title") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("character varying(128)"); - - b.Property("Urgency") - .HasColumnType("smallint"); - - b.HasKey("NotificationId"); - - b.ToTable("Notifications"); - }); - - modelBuilder.Entity("API.Schema.NotificationConnectors.NotificationConnector", b => - { - b.Property("Name") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Body") - .IsRequired() - .HasMaxLength(512) - .HasColumnType("character varying(512)"); - - b.Property>("Headers") - .IsRequired() - .HasColumnType("hstore"); - - b.Property("HttpMethod") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("character varying(8)"); - - b.Property("Url") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.HasKey("Name"); - - b.ToTable("NotificationConnectors"); - }); - - modelBuilder.Entity("AuthorManga", b => - { - b.Property("AuthorsAuthorId") - .HasColumnType("character varying(64)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("AuthorsAuthorId", "MangaId"); - - b.HasIndex("MangaId"); - - b.ToTable("AuthorManga"); - }); - - modelBuilder.Entity("MangaMangaTag", b => - { - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("MangaTagsTag") - .HasColumnType("character varying(64)"); - - 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("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("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("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("FromLocation") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("ToLocation") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.HasDiscriminator().HasValue((byte)3); - }); - - modelBuilder.Entity("API.Schema.Jobs.RetrieveChaptersJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("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("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("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.Manganato", b => - { - b.HasBaseType("API.Schema.MangaConnectors.MangaConnector"); - - b.HasDiscriminator().HasValue("Manganato"); - }); - - 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/20250313191146_dev-130325-6.cs b/API/Migrations/20250313191146_dev-130325-6.cs deleted file mode 100644 index 9815f35..0000000 --- a/API/Migrations/20250313191146_dev-130325-6.cs +++ /dev/null @@ -1,58 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace API.Migrations -{ - /// - public partial class dev1303256 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "ToLocation", - table: "Jobs", - type: "character varying(256)", - maxLength: 256, - nullable: true, - oldClrType: typeof(string), - oldType: "text", - oldNullable: true); - - migrationBuilder.AlterColumn( - name: "FromLocation", - table: "Jobs", - type: "character varying(256)", - maxLength: 256, - nullable: true, - oldClrType: typeof(string), - oldType: "text", - oldNullable: true); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "ToLocation", - table: "Jobs", - type: "text", - nullable: true, - oldClrType: typeof(string), - oldType: "character varying(256)", - oldMaxLength: 256, - oldNullable: true); - - migrationBuilder.AlterColumn( - name: "FromLocation", - table: "Jobs", - type: "text", - nullable: true, - oldClrType: typeof(string), - oldType: "character varying(256)", - oldMaxLength: 256, - oldNullable: true); - } - } -} diff --git a/API/Migrations/20250313212324_dev-130325-7.Designer.cs b/API/Migrations/20250313212324_dev-130325-7.Designer.cs deleted file mode 100644 index 6537c2b..0000000 --- a/API/Migrations/20250313212324_dev-130325-7.Designer.cs +++ /dev/null @@ -1,770 +0,0 @@ -// -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("20250313212324_dev-130325-7")] - partial class dev1303257 - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "9.0.3") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "hstore"); - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("API.Schema.Author", b => - { - b.Property("AuthorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("AuthorName") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("character varying(128)"); - - b.HasKey("AuthorId"); - - b.ToTable("Authors"); - }); - - modelBuilder.Entity("API.Schema.Chapter", b => - { - b.Property("ChapterId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("ArchiveFileName") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("ChapterNumber") - .IsRequired() - .HasMaxLength(10) - .HasColumnType("character varying(10)"); - - b.Property("Downloaded") - .HasColumnType("boolean"); - - b.Property("ParentMangaId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Title") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("Url") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("VolumeNumber") - .HasColumnType("integer"); - - b.HasKey("ChapterId"); - - b.HasIndex("ParentMangaId"); - - b.ToTable("Chapters"); - }); - - modelBuilder.Entity("API.Schema.Jobs.Job", b => - { - b.Property("JobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.PrimitiveCollection("DependsOnJobsIds") - .HasMaxLength(64) - .HasColumnType("text[]"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("JobId1") - .HasColumnType("character varying(64)"); - - b.Property("JobType") - .HasColumnType("smallint"); - - b.Property("LastExecution") - .HasColumnType("timestamp with time zone"); - - b.Property("ParentJobId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("RecurrenceMs") - .HasColumnType("numeric(20,0)"); - - b.Property("state") - .HasColumnType("smallint"); - - b.HasKey("JobId"); - - b.HasIndex("JobId1"); - - b.HasIndex("ParentJobId"); - - b.ToTable("Jobs"); - - b.HasDiscriminator("JobType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.LibraryConnectors.LibraryConnector", b => - { - b.Property("LibraryConnectorId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Auth") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("BaseUrl") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("LibraryType") - .HasColumnType("smallint"); - - b.HasKey("LibraryConnectorId"); - - b.ToTable("LibraryConnectors"); - - b.HasDiscriminator("LibraryType"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.Link", b => - { - b.Property("LinkId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("LinkProvider") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("character varying(128)"); - - b.Property("LinkUrl") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("character varying(128)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("LinkId"); - - b.HasIndex("MangaId"); - - b.ToTable("Link"); - }); - - modelBuilder.Entity("API.Schema.Manga", b => - { - b.Property("MangaId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("CoverFileNameInCache") - .HasColumnType("text"); - - b.Property("CoverUrl") - .IsRequired() - .HasColumnType("text"); - - b.Property("Description") - .IsRequired() - .HasColumnType("text"); - - b.Property("FolderName") - .IsRequired() - .HasColumnType("text"); - - b.Property("IdOnConnectorSite") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("character varying(128)"); - - b.Property("IgnoreChapterBefore") - .HasColumnType("real"); - - b.Property("MangaConnectorId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("OriginalLanguage") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("character varying(8)"); - - b.Property("ReleaseStatus") - .HasColumnType("smallint"); - - b.Property("WebsiteUrl") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("Year") - .HasColumnType("bigint"); - - b.HasKey("MangaId"); - - b.HasIndex("MangaConnectorId"); - - b.ToTable("Manga"); - }); - - modelBuilder.Entity("API.Schema.MangaAltTitle", b => - { - b.Property("AltTitleId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Language") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("character varying(8)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("Title") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.HasKey("AltTitleId"); - - b.HasIndex("MangaId"); - - b.ToTable("AltTitles"); - }); - - modelBuilder.Entity("API.Schema.MangaConnectors.MangaConnector", b => - { - b.Property("Name") - .HasMaxLength(32) - .HasColumnType("character varying(32)"); - - b.PrimitiveCollection("BaseUris") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("text[]"); - - b.Property("Enabled") - .HasColumnType("boolean"); - - b.Property("IconUrl") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.PrimitiveCollection("SupportedLanguages") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("text[]"); - - b.HasKey("Name"); - - b.ToTable("MangaConnectors"); - - b.HasDiscriminator("Name").HasValue("MangaConnector"); - - b.UseTphMappingStrategy(); - }); - - modelBuilder.Entity("API.Schema.MangaTag", b => - { - b.Property("Tag") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.HasKey("Tag"); - - b.ToTable("Tags"); - }); - - modelBuilder.Entity("API.Schema.Notification", b => - { - b.Property("NotificationId") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Date") - .HasColumnType("timestamp with time zone"); - - b.Property("Message") - .IsRequired() - .HasMaxLength(512) - .HasColumnType("character varying(512)"); - - b.Property("Title") - .IsRequired() - .HasMaxLength(128) - .HasColumnType("character varying(128)"); - - b.Property("Urgency") - .HasColumnType("smallint"); - - b.HasKey("NotificationId"); - - b.ToTable("Notifications"); - }); - - modelBuilder.Entity("API.Schema.NotificationConnectors.NotificationConnector", b => - { - b.Property("Name") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Body") - .IsRequired() - .HasMaxLength(512) - .HasColumnType("character varying(512)"); - - b.Property>("Headers") - .IsRequired() - .HasColumnType("hstore"); - - b.Property("HttpMethod") - .IsRequired() - .HasMaxLength(8) - .HasColumnType("character varying(8)"); - - b.Property("Url") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.HasKey("Name"); - - b.ToTable("NotificationConnectors"); - }); - - modelBuilder.Entity("AuthorManga", b => - { - b.Property("AuthorsAuthorId") - .HasColumnType("character varying(64)"); - - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.HasKey("AuthorsAuthorId", "MangaId"); - - b.HasIndex("MangaId"); - - b.ToTable("AuthorManga"); - }); - - modelBuilder.Entity("MangaMangaTag", b => - { - b.Property("MangaId") - .HasColumnType("character varying(64)"); - - b.Property("MangaTagsTag") - .HasColumnType("character varying(64)"); - - 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("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("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("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("FromLocation") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("ToLocation") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.HasDiscriminator().HasValue((byte)3); - }); - - modelBuilder.Entity("API.Schema.Jobs.RetrieveChaptersJob", b => - { - b.HasBaseType("API.Schema.Jobs.Job"); - - b.Property("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("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("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.Manganato", b => - { - b.HasBaseType("API.Schema.MangaConnectors.MangaConnector"); - - b.HasDiscriminator().HasValue("Manganato"); - }); - - 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") - .OnDelete(DeleteBehavior.Cascade); - }); - - 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") - .OnDelete(DeleteBehavior.Cascade); - }); - - 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/20250313212324_dev-130325-7.cs b/API/Migrations/20250313212324_dev-130325-7.cs deleted file mode 100644 index df54578..0000000 --- a/API/Migrations/20250313212324_dev-130325-7.cs +++ /dev/null @@ -1,64 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace API.Migrations -{ - /// - public partial class dev1303257 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "FK_AltTitles_Manga_MangaId", - table: "AltTitles"); - - migrationBuilder.DropForeignKey( - name: "FK_Link_Manga_MangaId", - table: "Link"); - - migrationBuilder.AddForeignKey( - name: "FK_AltTitles_Manga_MangaId", - table: "AltTitles", - column: "MangaId", - principalTable: "Manga", - principalColumn: "MangaId", - onDelete: ReferentialAction.Cascade); - - migrationBuilder.AddForeignKey( - name: "FK_Link_Manga_MangaId", - table: "Link", - column: "MangaId", - principalTable: "Manga", - principalColumn: "MangaId", - onDelete: ReferentialAction.Cascade); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "FK_AltTitles_Manga_MangaId", - table: "AltTitles"); - - migrationBuilder.DropForeignKey( - name: "FK_Link_Manga_MangaId", - table: "Link"); - - migrationBuilder.AddForeignKey( - name: "FK_AltTitles_Manga_MangaId", - table: "AltTitles", - column: "MangaId", - principalTable: "Manga", - principalColumn: "MangaId"); - - migrationBuilder.AddForeignKey( - name: "FK_Link_Manga_MangaId", - table: "Link", - column: "MangaId", - principalTable: "Manga", - principalColumn: "MangaId"); - } - } -} diff --git a/API/Migrations/20250313222533_dev-130325-8.cs b/API/Migrations/20250313222533_dev-130325-8.cs deleted file mode 100644 index 22f2017..0000000 --- a/API/Migrations/20250313222533_dev-130325-8.cs +++ /dev/null @@ -1,138 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace API.Migrations -{ - /// - public partial class dev1303258 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "Url", - table: "NotificationConnectors", - type: "character varying(2048)", - maxLength: 2048, - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(256)", - oldMaxLength: 256); - - migrationBuilder.AlterColumn( - name: "Body", - table: "NotificationConnectors", - type: "character varying(4096)", - maxLength: 4096, - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(512)", - oldMaxLength: 512); - - migrationBuilder.AlterColumn( - name: "IconUrl", - table: "MangaConnectors", - type: "character varying(2048)", - maxLength: 2048, - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(256)", - oldMaxLength: 256); - - migrationBuilder.AlterColumn( - name: "LinkUrl", - table: "Link", - type: "character varying(2048)", - maxLength: 2048, - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(128)", - oldMaxLength: 128); - - migrationBuilder.AlterColumn( - name: "LinkProvider", - table: "Link", - type: "character varying(64)", - maxLength: 64, - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(128)", - oldMaxLength: 128); - - migrationBuilder.AlterColumn( - name: "Url", - table: "Chapters", - type: "character varying(2048)", - maxLength: 2048, - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(256)", - oldMaxLength: 256); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "Url", - table: "NotificationConnectors", - type: "character varying(256)", - maxLength: 256, - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(2048)", - oldMaxLength: 2048); - - migrationBuilder.AlterColumn( - name: "Body", - table: "NotificationConnectors", - type: "character varying(512)", - maxLength: 512, - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(4096)", - oldMaxLength: 4096); - - migrationBuilder.AlterColumn( - name: "IconUrl", - table: "MangaConnectors", - type: "character varying(256)", - maxLength: 256, - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(2048)", - oldMaxLength: 2048); - - migrationBuilder.AlterColumn( - name: "LinkUrl", - table: "Link", - type: "character varying(128)", - maxLength: 128, - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(2048)", - oldMaxLength: 2048); - - migrationBuilder.AlterColumn( - name: "LinkProvider", - table: "Link", - type: "character varying(128)", - maxLength: 128, - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(64)", - oldMaxLength: 64); - - migrationBuilder.AlterColumn( - name: "Url", - table: "Chapters", - type: "character varying(256)", - maxLength: 256, - nullable: false, - oldClrType: typeof(string), - oldType: "character varying(2048)", - oldMaxLength: 2048); - } - } -} diff --git a/API/Migrations/20250313233529_dev-130325-9.cs b/API/Migrations/20250313233529_dev-130325-9.cs deleted file mode 100644 index dac86dc..0000000 --- a/API/Migrations/20250313233529_dev-130325-9.cs +++ /dev/null @@ -1,103 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace API.Migrations -{ - /// - public partial class dev1303259 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "FK_Jobs_Jobs_JobId1", - table: "Jobs"); - - migrationBuilder.DropForeignKey( - name: "FK_Jobs_Jobs_ParentJobId", - table: "Jobs"); - - migrationBuilder.DropIndex( - name: "IX_Jobs_JobId1", - table: "Jobs"); - - migrationBuilder.DropColumn( - name: "JobId1", - table: "Jobs"); - - migrationBuilder.CreateTable( - name: "JobJob", - columns: table => new - { - DependsOnJobsJobId = table.Column(type: "character varying(64)", nullable: false), - JobId = table.Column(type: "character varying(64)", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_JobJob", x => new { x.DependsOnJobsJobId, x.JobId }); - table.ForeignKey( - name: "FK_JobJob_Jobs_DependsOnJobsJobId", - column: x => x.DependsOnJobsJobId, - principalTable: "Jobs", - principalColumn: "JobId", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_JobJob_Jobs_JobId", - column: x => x.JobId, - principalTable: "Jobs", - principalColumn: "JobId", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateIndex( - name: "IX_JobJob_JobId", - table: "JobJob", - column: "JobId"); - - migrationBuilder.AddForeignKey( - name: "FK_Jobs_Jobs_ParentJobId", - table: "Jobs", - column: "ParentJobId", - principalTable: "Jobs", - principalColumn: "JobId", - onDelete: ReferentialAction.Cascade); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "FK_Jobs_Jobs_ParentJobId", - table: "Jobs"); - - migrationBuilder.DropTable( - name: "JobJob"); - - migrationBuilder.AddColumn( - name: "JobId1", - table: "Jobs", - type: "character varying(64)", - nullable: true); - - migrationBuilder.CreateIndex( - name: "IX_Jobs_JobId1", - table: "Jobs", - column: "JobId1"); - - migrationBuilder.AddForeignKey( - name: "FK_Jobs_Jobs_JobId1", - table: "Jobs", - column: "JobId1", - principalTable: "Jobs", - principalColumn: "JobId"); - - migrationBuilder.AddForeignKey( - name: "FK_Jobs_Jobs_ParentJobId", - table: "Jobs", - column: "ParentJobId", - principalTable: "Jobs", - principalColumn: "JobId"); - } - } -} diff --git a/API/Migrations/20250313222533_dev-130325-8.Designer.cs b/API/Migrations/20250316143014_dev-160325-Initial.Designer.cs similarity index 91% rename from API/Migrations/20250313222533_dev-130325-8.Designer.cs rename to API/Migrations/20250316143014_dev-160325-Initial.Designer.cs index 26af45c..24a7d03 100644 --- a/API/Migrations/20250313222533_dev-130325-8.Designer.cs +++ b/API/Migrations/20250316143014_dev-160325-Initial.Designer.cs @@ -13,8 +13,8 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace API.Migrations { [DbContext(typeof(PgsqlContext))] - [Migration("20250313222533_dev-130325-8")] - partial class dev1303258 + [Migration("20250316143014_dev-160325-Initial")] + partial class dev160325Initial { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -49,11 +49,6 @@ namespace API.Migrations .HasMaxLength(64) .HasColumnType("character varying(64)"); - b.Property("ArchiveFileName") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - b.Property("ChapterNumber") .IsRequired() .HasMaxLength(10) @@ -62,6 +57,11 @@ namespace API.Migrations b.Property("Downloaded") .HasColumnType("boolean"); + b.Property("FileName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + b.Property("ParentMangaId") .IsRequired() .HasMaxLength(64) @@ -99,9 +99,6 @@ namespace API.Migrations b.Property("Enabled") .HasColumnType("boolean"); - b.Property("JobId1") - .HasColumnType("character varying(64)"); - b.Property("JobType") .HasColumnType("smallint"); @@ -120,8 +117,6 @@ namespace API.Migrations b.HasKey("JobId"); - b.HasIndex("JobId1"); - b.HasIndex("ParentJobId"); b.ToTable("Jobs"); @@ -182,7 +177,28 @@ namespace API.Migrations b.HasIndex("MangaId"); - b.ToTable("Link"); + b.ToTable("Links"); + }); + + modelBuilder.Entity("API.Schema.LocalLibrary", b => + { + b.Property("LocalLibraryId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("BasePath") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("LibraryName") + .IsRequired() + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.HasKey("LocalLibraryId"); + + b.ToTable("LocalLibraries"); }); modelBuilder.Entity("API.Schema.Manga", b => @@ -202,9 +218,10 @@ namespace API.Migrations .IsRequired() .HasColumnType("text"); - b.Property("FolderName") + b.Property("DirectoryName") .IsRequired() - .HasColumnType("text"); + .HasMaxLength(256) + .HasColumnType("character varying(256)"); b.Property("IdOnConnectorSite") .IsRequired() @@ -214,6 +231,9 @@ namespace API.Migrations b.Property("IgnoreChapterBefore") .HasColumnType("real"); + b.Property("LibraryLocalLibraryId") + .HasColumnType("character varying(64)"); + b.Property("MangaConnectorId") .IsRequired() .HasMaxLength(64) @@ -242,9 +262,11 @@ namespace API.Migrations b.HasKey("MangaId"); + b.HasIndex("LibraryLocalLibraryId"); + b.HasIndex("MangaConnectorId"); - b.ToTable("Manga"); + b.ToTable("Mangas"); }); modelBuilder.Entity("API.Schema.MangaAltTitle", b => @@ -389,6 +411,21 @@ namespace API.Migrations b.ToTable("AuthorManga"); }); + modelBuilder.Entity("JobJob", b => + { + b.Property("DependsOnJobsJobId") + .HasColumnType("character varying(64)"); + + b.Property("JobId") + .HasColumnType("character varying(64)"); + + b.HasKey("DependsOnJobsJobId", "JobId"); + + b.HasIndex("JobId"); + + b.ToTable("JobJob"); + }); + modelBuilder.Entity("MangaMangaTag", b => { b.Property("MangaId") @@ -619,13 +656,10 @@ namespace API.Migrations 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"); + .HasForeignKey("ParentJobId") + .OnDelete(DeleteBehavior.Cascade); b.Navigation("ParentJob"); }); @@ -640,12 +674,19 @@ namespace API.Migrations modelBuilder.Entity("API.Schema.Manga", b => { + b.HasOne("API.Schema.LocalLibrary", "Library") + .WithMany() + .HasForeignKey("LibraryLocalLibraryId") + .OnDelete(DeleteBehavior.Cascade); + b.HasOne("API.Schema.MangaConnectors.MangaConnector", "MangaConnector") .WithMany() .HasForeignKey("MangaConnectorId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); + b.Navigation("Library"); + b.Navigation("MangaConnector"); }); @@ -672,6 +713,21 @@ namespace API.Migrations .IsRequired(); }); + modelBuilder.Entity("JobJob", b => + { + b.HasOne("API.Schema.Jobs.Job", null) + .WithMany() + .HasForeignKey("DependsOnJobsJobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("API.Schema.Jobs.Job", null) + .WithMany() + .HasForeignKey("JobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("MangaMangaTag", b => { b.HasOne("API.Schema.Manga", null) @@ -753,11 +809,6 @@ namespace API.Migrations b.Navigation("Manga"); }); - modelBuilder.Entity("API.Schema.Jobs.Job", b => - { - b.Navigation("DependsOnJobs"); - }); - modelBuilder.Entity("API.Schema.Manga", b => { b.Navigation("AltTitles"); diff --git a/API/Migrations/20250303141044_dev-030325-1.cs b/API/Migrations/20250316143014_dev-160325-Initial.cs similarity index 56% rename from API/Migrations/20250303141044_dev-030325-1.cs rename to API/Migrations/20250316143014_dev-160325-Initial.cs index 4204f5d..c447504 100644 --- a/API/Migrations/20250303141044_dev-030325-1.cs +++ b/API/Migrations/20250316143014_dev-160325-Initial.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using Microsoft.EntityFrameworkCore.Migrations; #nullable disable @@ -6,17 +7,20 @@ using Microsoft.EntityFrameworkCore.Migrations; namespace API.Migrations { /// - public partial class dev0303251 : Migration + public partial class dev160325Initial : Migration { /// protected override void Up(MigrationBuilder migrationBuilder) { + migrationBuilder.AlterDatabase() + .Annotation("Npgsql:PostgresExtension:hstore", ",,"); + migrationBuilder.CreateTable( name: "Authors", columns: table => new { AuthorId = table.Column(type: "character varying(64)", maxLength: 64, nullable: false), - AuthorName = table.Column(type: "text", nullable: false) + AuthorName = table.Column(type: "character varying(128)", maxLength: 128, nullable: false) }, constraints: table => { @@ -29,21 +33,36 @@ namespace API.Migrations { LibraryConnectorId = table.Column(type: "character varying(64)", maxLength: 64, nullable: false), LibraryType = table.Column(type: "smallint", nullable: false), - BaseUrl = table.Column(type: "text", nullable: false), - Auth = table.Column(type: "text", nullable: false) + BaseUrl = table.Column(type: "character varying(256)", maxLength: 256, nullable: false), + Auth = table.Column(type: "character varying(256)", maxLength: 256, nullable: false) }, constraints: table => { table.PrimaryKey("PK_LibraryConnectors", x => x.LibraryConnectorId); }); + migrationBuilder.CreateTable( + name: "LocalLibraries", + columns: table => new + { + LocalLibraryId = table.Column(type: "character varying(64)", maxLength: 64, nullable: false), + BasePath = table.Column(type: "character varying(256)", maxLength: 256, nullable: false), + LibraryName = table.Column(type: "character varying(512)", maxLength: 512, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_LocalLibraries", x => x.LocalLibraryId); + }); + migrationBuilder.CreateTable( name: "MangaConnectors", columns: table => new { Name = table.Column(type: "character varying(32)", maxLength: 32, nullable: false), - SupportedLanguages = table.Column(type: "text[]", nullable: false), - BaseUris = table.Column(type: "text[]", nullable: false) + SupportedLanguages = table.Column(type: "text[]", maxLength: 8, nullable: false), + IconUrl = table.Column(type: "character varying(2048)", maxLength: 2048, nullable: false), + BaseUris = table.Column(type: "text[]", maxLength: 256, nullable: false), + Enabled = table.Column(type: "boolean", nullable: false) }, constraints: table => { @@ -54,18 +73,15 @@ namespace API.Migrations name: "NotificationConnectors", columns: table => new { - NotificationConnectorId = table.Column(type: "character varying(64)", maxLength: 64, nullable: false), - NotificationConnectorType = table.Column(type: "smallint", nullable: false), - Endpoint = table.Column(type: "text", nullable: true), - AppToken = table.Column(type: "text", nullable: true), - Id = table.Column(type: "text", nullable: true), - Ntfy_Endpoint = table.Column(type: "text", nullable: true), - Auth = table.Column(type: "text", nullable: true), - Topic = table.Column(type: "text", nullable: true) + Name = table.Column(type: "character varying(64)", maxLength: 64, nullable: false), + Url = table.Column(type: "character varying(2048)", maxLength: 2048, nullable: false), + Headers = table.Column>(type: "hstore", nullable: false), + HttpMethod = table.Column(type: "character varying(8)", maxLength: 8, nullable: false), + Body = table.Column(type: "character varying(4096)", maxLength: 4096, nullable: false) }, constraints: table => { - table.PrimaryKey("PK_NotificationConnectors", x => x.NotificationConnectorId); + table.PrimaryKey("PK_NotificationConnectors", x => x.Name); }); migrationBuilder.CreateTable( @@ -74,8 +90,8 @@ namespace API.Migrations { NotificationId = table.Column(type: "character varying(64)", maxLength: 64, nullable: false), Urgency = table.Column(type: "smallint", nullable: false), - Title = table.Column(type: "text", nullable: false), - Message = table.Column(type: "text", nullable: false), + Title = table.Column(type: "character varying(128)", maxLength: 128, nullable: false), + Message = table.Column(type: "character varying(512)", maxLength: 512, nullable: false), Date = table.Column(type: "timestamp with time zone", nullable: false) }, constraints: table => @@ -87,7 +103,7 @@ namespace API.Migrations name: "Tags", columns: table => new { - Tag = table.Column(type: "text", nullable: false) + Tag = table.Column(type: "character varying(64)", maxLength: 64, nullable: false) }, constraints: table => { @@ -95,28 +111,35 @@ namespace API.Migrations }); migrationBuilder.CreateTable( - name: "Manga", + name: "Mangas", columns: table => new { MangaId = table.Column(type: "character varying(64)", maxLength: 64, nullable: false), - ConnectorId = table.Column(type: "character varying(64)", maxLength: 64, nullable: false), - Name = table.Column(type: "text", nullable: false), + IdOnConnectorSite = table.Column(type: "character varying(128)", maxLength: 128, nullable: false), + Name = table.Column(type: "character varying(256)", maxLength: 256, nullable: false), Description = table.Column(type: "text", nullable: false), - WebsiteUrl = table.Column(type: "text", nullable: false), + WebsiteUrl = table.Column(type: "character varying(256)", maxLength: 256, nullable: false), CoverUrl = table.Column(type: "text", nullable: false), CoverFileNameInCache = table.Column(type: "text", nullable: true), Year = table.Column(type: "bigint", nullable: false), - OriginalLanguage = table.Column(type: "text", nullable: true), + OriginalLanguage = table.Column(type: "character varying(8)", maxLength: 8, nullable: false), ReleaseStatus = table.Column(type: "smallint", nullable: false), - FolderName = table.Column(type: "text", nullable: false), + DirectoryName = table.Column(type: "character varying(256)", maxLength: 256, nullable: false), + LibraryLocalLibraryId = table.Column(type: "character varying(64)", nullable: true), IgnoreChapterBefore = table.Column(type: "real", nullable: false), - MangaConnectorId = table.Column(type: "character varying(32)", nullable: false) + MangaConnectorId = table.Column(type: "character varying(64)", maxLength: 64, nullable: false) }, constraints: table => { - table.PrimaryKey("PK_Manga", x => x.MangaId); + table.PrimaryKey("PK_Mangas", x => x.MangaId); table.ForeignKey( - name: "FK_Manga_MangaConnectors_MangaConnectorId", + name: "FK_Mangas_LocalLibraries_LibraryLocalLibraryId", + column: x => x.LibraryLocalLibraryId, + principalTable: "LocalLibraries", + principalColumn: "LocalLibraryId", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_Mangas_MangaConnectors_MangaConnectorId", column: x => x.MangaConnectorId, principalTable: "MangaConnectors", principalColumn: "Name", @@ -129,17 +152,18 @@ namespace API.Migrations { AltTitleId = table.Column(type: "character varying(64)", maxLength: 64, nullable: false), Language = table.Column(type: "character varying(8)", maxLength: 8, nullable: false), - Title = table.Column(type: "text", nullable: false), + Title = table.Column(type: "character varying(256)", maxLength: 256, nullable: false), MangaId = table.Column(type: "character varying(64)", nullable: true) }, constraints: table => { table.PrimaryKey("PK_AltTitles", x => x.AltTitleId); table.ForeignKey( - name: "FK_AltTitles_Manga_MangaId", + name: "FK_AltTitles_Mangas_MangaId", column: x => x.MangaId, - principalTable: "Manga", - principalColumn: "MangaId"); + principalTable: "Mangas", + principalColumn: "MangaId", + onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( @@ -159,9 +183,9 @@ namespace API.Migrations principalColumn: "AuthorId", onDelete: ReferentialAction.Cascade); table.ForeignKey( - name: "FK_AuthorManga_Manga_MangaId", + name: "FK_AuthorManga_Mangas_MangaId", column: x => x.MangaId, - principalTable: "Manga", + principalTable: "Mangas", principalColumn: "MangaId", onDelete: ReferentialAction.Cascade); }); @@ -173,40 +197,41 @@ namespace API.Migrations ChapterId = table.Column(type: "character varying(64)", maxLength: 64, nullable: false), VolumeNumber = table.Column(type: "integer", nullable: true), ChapterNumber = table.Column(type: "character varying(10)", maxLength: 10, nullable: false), - Url = table.Column(type: "text", nullable: false), - Title = table.Column(type: "text", nullable: true), - ArchiveFileName = table.Column(type: "text", nullable: false), + Url = table.Column(type: "character varying(2048)", maxLength: 2048, nullable: false), + Title = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), + FileName = table.Column(type: "character varying(256)", maxLength: 256, nullable: false), Downloaded = table.Column(type: "boolean", nullable: false), - ParentMangaId = table.Column(type: "character varying(64)", nullable: false) + ParentMangaId = table.Column(type: "character varying(64)", maxLength: 64, nullable: false) }, constraints: table => { table.PrimaryKey("PK_Chapters", x => x.ChapterId); table.ForeignKey( - name: "FK_Chapters_Manga_ParentMangaId", + name: "FK_Chapters_Mangas_ParentMangaId", column: x => x.ParentMangaId, - principalTable: "Manga", + principalTable: "Mangas", principalColumn: "MangaId", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( - name: "Link", + name: "Links", columns: table => new { LinkId = table.Column(type: "character varying(64)", maxLength: 64, nullable: false), - LinkProvider = table.Column(type: "text", nullable: false), - LinkUrl = table.Column(type: "text", nullable: false), + LinkProvider = table.Column(type: "character varying(64)", maxLength: 64, nullable: false), + LinkUrl = table.Column(type: "character varying(2048)", maxLength: 2048, nullable: false), MangaId = table.Column(type: "character varying(64)", nullable: true) }, constraints: table => { - table.PrimaryKey("PK_Link", x => x.LinkId); + table.PrimaryKey("PK_Links", x => x.LinkId); table.ForeignKey( - name: "FK_Link_Manga_MangaId", + name: "FK_Links_Mangas_MangaId", column: x => x.MangaId, - principalTable: "Manga", - principalColumn: "MangaId"); + principalTable: "Mangas", + principalColumn: "MangaId", + onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( @@ -214,20 +239,20 @@ namespace API.Migrations columns: table => new { MangaId = table.Column(type: "character varying(64)", nullable: false), - TagsTag = table.Column(type: "text", nullable: false) + MangaTagsTag = table.Column(type: "character varying(64)", nullable: false) }, constraints: table => { - table.PrimaryKey("PK_MangaMangaTag", x => new { x.MangaId, x.TagsTag }); + table.PrimaryKey("PK_MangaMangaTag", x => new { x.MangaId, x.MangaTagsTag }); table.ForeignKey( - name: "FK_MangaMangaTag_Manga_MangaId", + name: "FK_MangaMangaTag_Mangas_MangaId", column: x => x.MangaId, - principalTable: "Manga", + principalTable: "Mangas", principalColumn: "MangaId", onDelete: ReferentialAction.Cascade); table.ForeignKey( - name: "FK_MangaMangaTag_Tags_TagsTag", - column: x => x.TagsTag, + name: "FK_MangaMangaTag_Tags_MangaTagsTag", + column: x => x.MangaTagsTag, principalTable: "Tags", principalColumn: "Tag", onDelete: ReferentialAction.Cascade); @@ -243,12 +268,15 @@ namespace API.Migrations JobType = table.Column(type: "smallint", nullable: false), RecurrenceMs = table.Column(type: "numeric(20,0)", nullable: false), LastExecution = table.Column(type: "timestamp with time zone", nullable: false), - state = table.Column(type: "integer", nullable: false), - JobId1 = table.Column(type: "character varying(64)", nullable: true), + state = table.Column(type: "smallint", nullable: false), + Enabled = table.Column(type: "boolean", nullable: false), + DownloadAvailableChaptersJob_MangaId = table.Column(type: "character varying(64)", maxLength: 64, nullable: true), MangaId = table.Column(type: "character varying(64)", maxLength: 64, nullable: true), ChapterId = table.Column(type: "character varying(64)", maxLength: 64, nullable: true), - FromLocation = table.Column(type: "text", nullable: true), - ToLocation = table.Column(type: "text", nullable: true), + FromLocation = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), + ToLocation = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), + RetrieveChaptersJob_MangaId = table.Column(type: "character varying(64)", maxLength: 64, nullable: true), + UpdateFilesDownloadedJob_MangaId = table.Column(type: "character varying(64)", maxLength: 64, nullable: true), UpdateMetadataJob_MangaId = table.Column(type: "character varying(64)", maxLength: 64, nullable: true) }, constraints: table => @@ -260,28 +288,66 @@ namespace API.Migrations principalTable: "Chapters", principalColumn: "ChapterId", onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_Jobs_Jobs_JobId1", - column: x => x.JobId1, - principalTable: "Jobs", - principalColumn: "JobId"); table.ForeignKey( name: "FK_Jobs_Jobs_ParentJobId", column: x => x.ParentJobId, principalTable: "Jobs", - principalColumn: "JobId"); + principalColumn: "JobId", + onDelete: ReferentialAction.Cascade); table.ForeignKey( - name: "FK_Jobs_Manga_MangaId", - column: x => x.MangaId, - principalTable: "Manga", + name: "FK_Jobs_Mangas_DownloadAvailableChaptersJob_MangaId", + column: x => x.DownloadAvailableChaptersJob_MangaId, + principalTable: "Mangas", principalColumn: "MangaId", onDelete: ReferentialAction.Cascade); table.ForeignKey( - name: "FK_Jobs_Manga_UpdateMetadataJob_MangaId", - column: x => x.UpdateMetadataJob_MangaId, - principalTable: "Manga", + name: "FK_Jobs_Mangas_MangaId", + column: x => x.MangaId, + principalTable: "Mangas", principalColumn: "MangaId", onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_Jobs_Mangas_RetrieveChaptersJob_MangaId", + column: x => x.RetrieveChaptersJob_MangaId, + principalTable: "Mangas", + principalColumn: "MangaId", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_Jobs_Mangas_UpdateFilesDownloadedJob_MangaId", + column: x => x.UpdateFilesDownloadedJob_MangaId, + principalTable: "Mangas", + principalColumn: "MangaId", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_Jobs_Mangas_UpdateMetadataJob_MangaId", + column: x => x.UpdateMetadataJob_MangaId, + principalTable: "Mangas", + principalColumn: "MangaId", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "JobJob", + columns: table => new + { + DependsOnJobsJobId = table.Column(type: "character varying(64)", nullable: false), + JobId = table.Column(type: "character varying(64)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_JobJob", x => new { x.DependsOnJobsJobId, x.JobId }); + table.ForeignKey( + name: "FK_JobJob_Jobs_DependsOnJobsJobId", + column: x => x.DependsOnJobsJobId, + principalTable: "Jobs", + principalColumn: "JobId", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_JobJob_Jobs_JobId", + column: x => x.JobId, + principalTable: "Jobs", + principalColumn: "JobId", + onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateIndex( @@ -299,15 +365,20 @@ namespace API.Migrations table: "Chapters", column: "ParentMangaId"); + migrationBuilder.CreateIndex( + name: "IX_JobJob_JobId", + table: "JobJob", + column: "JobId"); + migrationBuilder.CreateIndex( name: "IX_Jobs_ChapterId", table: "Jobs", column: "ChapterId"); migrationBuilder.CreateIndex( - name: "IX_Jobs_JobId1", + name: "IX_Jobs_DownloadAvailableChaptersJob_MangaId", table: "Jobs", - column: "JobId1"); + column: "DownloadAvailableChaptersJob_MangaId"); migrationBuilder.CreateIndex( name: "IX_Jobs_MangaId", @@ -319,25 +390,40 @@ namespace API.Migrations table: "Jobs", column: "ParentJobId"); + migrationBuilder.CreateIndex( + name: "IX_Jobs_RetrieveChaptersJob_MangaId", + table: "Jobs", + column: "RetrieveChaptersJob_MangaId"); + + migrationBuilder.CreateIndex( + name: "IX_Jobs_UpdateFilesDownloadedJob_MangaId", + table: "Jobs", + column: "UpdateFilesDownloadedJob_MangaId"); + migrationBuilder.CreateIndex( name: "IX_Jobs_UpdateMetadataJob_MangaId", table: "Jobs", column: "UpdateMetadataJob_MangaId"); migrationBuilder.CreateIndex( - name: "IX_Link_MangaId", - table: "Link", + name: "IX_Links_MangaId", + table: "Links", column: "MangaId"); migrationBuilder.CreateIndex( - name: "IX_Manga_MangaConnectorId", - table: "Manga", - column: "MangaConnectorId"); + name: "IX_MangaMangaTag_MangaTagsTag", + table: "MangaMangaTag", + column: "MangaTagsTag"); migrationBuilder.CreateIndex( - name: "IX_MangaMangaTag_TagsTag", - table: "MangaMangaTag", - column: "TagsTag"); + name: "IX_Mangas_LibraryLocalLibraryId", + table: "Mangas", + column: "LibraryLocalLibraryId"); + + migrationBuilder.CreateIndex( + name: "IX_Mangas_MangaConnectorId", + table: "Mangas", + column: "MangaConnectorId"); } /// @@ -350,13 +436,13 @@ namespace API.Migrations name: "AuthorManga"); migrationBuilder.DropTable( - name: "Jobs"); + name: "JobJob"); migrationBuilder.DropTable( name: "LibraryConnectors"); migrationBuilder.DropTable( - name: "Link"); + name: "Links"); migrationBuilder.DropTable( name: "MangaMangaTag"); @@ -371,13 +457,19 @@ namespace API.Migrations name: "Authors"); migrationBuilder.DropTable( - name: "Chapters"); + name: "Jobs"); migrationBuilder.DropTable( name: "Tags"); migrationBuilder.DropTable( - name: "Manga"); + name: "Chapters"); + + migrationBuilder.DropTable( + name: "Mangas"); + + migrationBuilder.DropTable( + name: "LocalLibraries"); migrationBuilder.DropTable( name: "MangaConnectors"); diff --git a/API/Migrations/20250313233529_dev-130325-9.Designer.cs b/API/Migrations/20250316150158_dev-160325-2.Designer.cs similarity index 94% rename from API/Migrations/20250313233529_dev-130325-9.Designer.cs rename to API/Migrations/20250316150158_dev-160325-2.Designer.cs index 897905f..e2bd7a1 100644 --- a/API/Migrations/20250313233529_dev-130325-9.Designer.cs +++ b/API/Migrations/20250316150158_dev-160325-2.Designer.cs @@ -13,8 +13,8 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace API.Migrations { [DbContext(typeof(PgsqlContext))] - [Migration("20250313233529_dev-130325-9")] - partial class dev1303259 + [Migration("20250316150158_dev-160325-2")] + partial class dev1603252 { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -49,11 +49,6 @@ namespace API.Migrations .HasMaxLength(64) .HasColumnType("character varying(64)"); - b.Property("ArchiveFileName") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - b.Property("ChapterNumber") .IsRequired() .HasMaxLength(10) @@ -62,6 +57,11 @@ namespace API.Migrations b.Property("Downloaded") .HasColumnType("boolean"); + b.Property("FileName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + b.Property("ParentMangaId") .IsRequired() .HasMaxLength(64) @@ -177,7 +177,28 @@ namespace API.Migrations b.HasIndex("MangaId"); - b.ToTable("Link"); + b.ToTable("Links"); + }); + + modelBuilder.Entity("API.Schema.LocalLibrary", b => + { + b.Property("LocalLibraryId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("BasePath") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("LibraryName") + .IsRequired() + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.HasKey("LocalLibraryId"); + + b.ToTable("LocalLibraries"); }); modelBuilder.Entity("API.Schema.Manga", b => @@ -197,9 +218,10 @@ namespace API.Migrations .IsRequired() .HasColumnType("text"); - b.Property("FolderName") + b.Property("DirectoryName") .IsRequired() - .HasColumnType("text"); + .HasMaxLength(256) + .HasColumnType("character varying(256)"); b.Property("IdOnConnectorSite") .IsRequired() @@ -209,6 +231,9 @@ namespace API.Migrations b.Property("IgnoreChapterBefore") .HasColumnType("real"); + b.Property("LibraryLocalLibraryId") + .HasColumnType("character varying(64)"); + b.Property("MangaConnectorId") .IsRequired() .HasMaxLength(64) @@ -237,9 +262,11 @@ namespace API.Migrations b.HasKey("MangaId"); + b.HasIndex("LibraryLocalLibraryId"); + b.HasIndex("MangaConnectorId"); - b.ToTable("Manga"); + b.ToTable("Mangas"); }); modelBuilder.Entity("API.Schema.MangaAltTitle", b => @@ -647,12 +674,19 @@ namespace API.Migrations modelBuilder.Entity("API.Schema.Manga", b => { + b.HasOne("API.Schema.LocalLibrary", "Library") + .WithMany() + .HasForeignKey("LibraryLocalLibraryId") + .OnDelete(DeleteBehavior.Restrict); + b.HasOne("API.Schema.MangaConnectors.MangaConnector", "MangaConnector") .WithMany() .HasForeignKey("MangaConnectorId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); + b.Navigation("Library"); + b.Navigation("MangaConnector"); }); diff --git a/API/Migrations/20250316150158_dev-160325-2.cs b/API/Migrations/20250316150158_dev-160325-2.cs new file mode 100644 index 0000000..6adb255 --- /dev/null +++ b/API/Migrations/20250316150158_dev-160325-2.cs @@ -0,0 +1,42 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace API.Migrations +{ + /// + public partial class dev1603252 : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Mangas_LocalLibraries_LibraryLocalLibraryId", + table: "Mangas"); + + migrationBuilder.AddForeignKey( + name: "FK_Mangas_LocalLibraries_LibraryLocalLibraryId", + table: "Mangas", + column: "LibraryLocalLibraryId", + principalTable: "LocalLibraries", + principalColumn: "LocalLibraryId", + onDelete: ReferentialAction.Restrict); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Mangas_LocalLibraries_LibraryLocalLibraryId", + table: "Mangas"); + + migrationBuilder.AddForeignKey( + name: "FK_Mangas_LocalLibraries_LibraryLocalLibraryId", + table: "Mangas", + column: "LibraryLocalLibraryId", + principalTable: "LocalLibraries", + principalColumn: "LocalLibraryId", + onDelete: ReferentialAction.Cascade); + } + } +} diff --git a/API/Migrations/PgsqlContextModelSnapshot.cs b/API/Migrations/PgsqlContextModelSnapshot.cs index e49d53e..db6e2e7 100644 --- a/API/Migrations/PgsqlContextModelSnapshot.cs +++ b/API/Migrations/PgsqlContextModelSnapshot.cs @@ -46,11 +46,6 @@ namespace API.Migrations .HasMaxLength(64) .HasColumnType("character varying(64)"); - b.Property("ArchiveFileName") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - b.Property("ChapterNumber") .IsRequired() .HasMaxLength(10) @@ -59,6 +54,11 @@ namespace API.Migrations b.Property("Downloaded") .HasColumnType("boolean"); + b.Property("FileName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + b.Property("ParentMangaId") .IsRequired() .HasMaxLength(64) @@ -174,7 +174,28 @@ namespace API.Migrations b.HasIndex("MangaId"); - b.ToTable("Link"); + b.ToTable("Links"); + }); + + modelBuilder.Entity("API.Schema.LocalLibrary", b => + { + b.Property("LocalLibraryId") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("BasePath") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("LibraryName") + .IsRequired() + .HasMaxLength(512) + .HasColumnType("character varying(512)"); + + b.HasKey("LocalLibraryId"); + + b.ToTable("LocalLibraries"); }); modelBuilder.Entity("API.Schema.Manga", b => @@ -194,9 +215,10 @@ namespace API.Migrations .IsRequired() .HasColumnType("text"); - b.Property("FolderName") + b.Property("DirectoryName") .IsRequired() - .HasColumnType("text"); + .HasMaxLength(256) + .HasColumnType("character varying(256)"); b.Property("IdOnConnectorSite") .IsRequired() @@ -206,6 +228,9 @@ namespace API.Migrations b.Property("IgnoreChapterBefore") .HasColumnType("real"); + b.Property("LibraryLocalLibraryId") + .HasColumnType("character varying(64)"); + b.Property("MangaConnectorId") .IsRequired() .HasMaxLength(64) @@ -234,9 +259,11 @@ namespace API.Migrations b.HasKey("MangaId"); + b.HasIndex("LibraryLocalLibraryId"); + b.HasIndex("MangaConnectorId"); - b.ToTable("Manga"); + b.ToTable("Mangas"); }); modelBuilder.Entity("API.Schema.MangaAltTitle", b => @@ -644,12 +671,19 @@ namespace API.Migrations modelBuilder.Entity("API.Schema.Manga", b => { + b.HasOne("API.Schema.LocalLibrary", "Library") + .WithMany() + .HasForeignKey("LibraryLocalLibraryId") + .OnDelete(DeleteBehavior.Restrict); + b.HasOne("API.Schema.MangaConnectors.MangaConnector", "MangaConnector") .WithMany() .HasForeignKey("MangaConnectorId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); + b.Navigation("Library"); + b.Navigation("MangaConnector"); }); diff --git a/API/Program.cs b/API/Program.cs index 0448685..05e12ac 100644 --- a/API/Program.cs +++ b/API/Program.cs @@ -120,9 +120,12 @@ using (var scope = app.Services.CreateScope()) MangaConnector[] newConnectors = connectors.Where(c => !context.MangaConnectors.Contains(c)).ToArray(); context.MangaConnectors.AddRange(newConnectors); - context.Jobs.AddRange(context.Manga.AsEnumerable().Select(m => new UpdateFilesDownloadedJob(0, m.MangaId))); + context.Jobs.AddRange(context.Mangas.AsEnumerable().Select(m => new UpdateFilesDownloadedJob(0, m.MangaId))); context.Jobs.RemoveRange(context.Jobs.Where(j => j.state == JobState.Completed && j.RecurrenceMs < 1)); + + if (!context.LocalLibraries.Any()) + context.LocalLibraries.Add(new LocalLibrary(TrangaSettings.downloadLocation, "Default Library")); string[] emojis = { "(•‿•)", "(づ \u25d5‿\u25d5 )づ", "( \u02d8\u25bd\u02d8)っ\u2668", "=\uff3e\u25cf \u22cf \u25cf\uff3e=", "(ΦωΦ)", "(\u272a\u3268\u272a)", "( ノ・o・ )ノ", "(〜^\u2207^ )〜", "~(\u2267ω\u2266)~","૮ \u00b4• ﻌ \u00b4• ა", "(\u02c3ᆺ\u02c2)", "(=\ud83d\udf66 \u0f1d \ud83d\udf66=)"}; context.Notifications.Add(new Notification("Tranga Started", emojis[Random.Shared.Next(0, emojis.Length - 1)], NotificationUrgency.High)); diff --git a/API/Schema/Chapter.cs b/API/Schema/Chapter.cs index 1d7d3d8..7256d4e 100644 --- a/API/Schema/Chapter.cs +++ b/API/Schema/Chapter.cs @@ -1,4 +1,5 @@ using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; using System.Xml.Linq; using API.Schema.Jobs; using Microsoft.EntityFrameworkCore; @@ -13,7 +14,6 @@ public class Chapter : IComparable : this(parentManga.MangaId, url, chapterNumber, volumeNumber, title) { ParentManga = parentManga; - ArchiveFileName = BuildArchiveFileName(); } public Chapter(string parentMangaId, string url, string chapterNumber, @@ -25,6 +25,7 @@ public class Chapter : IComparable ChapterNumber = chapterNumber; VolumeNumber = volumeNumber; Title = title; + FileName = GetArchiveFilePath(); } [StringLength(64)] @@ -43,7 +44,10 @@ public class Chapter : IComparable public string? Title { get; private set; } [StringLength(256)] [Required] - public string ArchiveFileName { get; private set; } + public string FileName { get; private set; } + [JsonIgnore] + [NotMapped] + public string? FullArchiveFilePath => ParentManga is { } m ? Path.Join(m.FullDirectoryPath, FileName) : null; [Required] public bool Downloaded { get; internal set; } = false; [Required] @@ -82,26 +86,14 @@ public class Chapter : IComparable return UpdateArchiveFileName(); } - private string BuildArchiveFileName() - { - return - $"{ParentManga.Name} - Vol.{VolumeNumber ?? 0} Ch.{ChapterNumber}{(Title is null ? "" : $" - {Title}")}.cbz"; - } - private MoveFileOrFolderJob? UpdateArchiveFileName() { - string oldPath = GetArchiveFilePath(); - ArchiveFileName = BuildArchiveFileName(); - return Downloaded ? new MoveFileOrFolderJob(oldPath, GetArchiveFilePath()) : null; - } - - /// - /// Creates full file path of chapter-archive - /// - /// Filepath - internal string GetArchiveFilePath() - { - return Path.Join(TrangaSettings.downloadLocation, ParentManga.FolderName, ArchiveFileName); + string? oldPath = FullArchiveFilePath; + if (oldPath is null) + return null; + string newPath = GetArchiveFilePath(); + FileName = newPath; + return Downloaded ? new MoveFileOrFolderJob(oldPath, newPath) : null; } /// @@ -114,6 +106,11 @@ public class Chapter : IComparable return File.Exists(path); } + private string GetArchiveFilePath() + { + return $"{ParentManga!.Name} - Vol.{VolumeNumber ?? 0} Ch.{ChapterNumber}{(Title is null ? "" : $" - {Title}")}.cbz"; + } + private static int CompareChapterNumbers(string ch1, string ch2) { int[] ch1Arr = ch1.Split('.').Select(c => int.TryParse(c, out int result) ? result : -1).ToArray(); diff --git a/API/Schema/Jobs/DownloadMangaCoverJob.cs b/API/Schema/Jobs/DownloadMangaCoverJob.cs index 80d2bc4..485ffc6 100644 --- a/API/Schema/Jobs/DownloadMangaCoverJob.cs +++ b/API/Schema/Jobs/DownloadMangaCoverJob.cs @@ -14,7 +14,7 @@ public class DownloadMangaCoverJob(string mangaId, string? parentJobId = null, I protected override IEnumerable RunInternal(PgsqlContext context) { - Manga? manga = Manga ?? context.Manga.Find(this.MangaId); + Manga? manga = Manga ?? context.Mangas.Find(this.MangaId); if (manga is null) return []; diff --git a/API/Schema/Jobs/DownloadSingleChapterJob.cs b/API/Schema/Jobs/DownloadSingleChapterJob.cs index e36fe61..c623e49 100644 --- a/API/Schema/Jobs/DownloadSingleChapterJob.cs +++ b/API/Schema/Jobs/DownloadSingleChapterJob.cs @@ -25,10 +25,10 @@ public class DownloadSingleChapterJob(string chapterId, string? parentJobId = nu protected override IEnumerable RunInternal(PgsqlContext context) { Chapter chapter = Chapter ?? context.Chapters.Find(ChapterId)!; - Manga manga = chapter.ParentManga ?? context.Manga.Find(chapter.ParentMangaId)!; + Manga manga = chapter.ParentManga ?? context.Mangas.Find(chapter.ParentMangaId)!; MangaConnector connector = manga.MangaConnector ?? context.MangaConnectors.Find(manga.MangaConnectorId)!; string[] imageUrls = connector.GetChapterImageUrls(chapter); - string saveArchiveFilePath = chapter.GetArchiveFilePath(); + string saveArchiveFilePath = chapter.FullArchiveFilePath; //Check if Publication Directory already exists string directoryPath = Path.GetDirectoryName(saveArchiveFilePath)!; diff --git a/API/Schema/Jobs/JobType.cs b/API/Schema/Jobs/JobType.cs index 5f2e870..6919313 100644 --- a/API/Schema/Jobs/JobType.cs +++ b/API/Schema/Jobs/JobType.cs @@ -9,5 +9,6 @@ public enum JobType : byte MoveFileOrFolderJob = 3, DownloadMangaCoverJob = 4, RetrieveChaptersJob = 5, - UpdateFilesDownloadedJob = 6 + UpdateFilesDownloadedJob = 6, + MoveMangaLibraryJob = 7 } \ No newline at end of file diff --git a/API/Schema/Jobs/MoveMangaLibraryJob.cs b/API/Schema/Jobs/MoveMangaLibraryJob.cs new file mode 100644 index 0000000..8159820 --- /dev/null +++ b/API/Schema/Jobs/MoveMangaLibraryJob.cs @@ -0,0 +1,30 @@ +using System.ComponentModel.DataAnnotations; + +namespace API.Schema.Jobs; + +public class MoveMangaLibraryJob(string mangaId, string toLibraryId, string? parentJobId = null, ICollection? dependsOnJobsIds = null) + : Job(TokenGen.CreateToken(typeof(MoveMangaLibraryJob)), JobType.MoveMangaLibraryJob, 0, parentJobId, dependsOnJobsIds) +{ + [StringLength(64)] + [Required] + public string MangaId { get; init; } = mangaId; + [StringLength(64)] + [Required] + public string ToLibraryId { get; init; } = toLibraryId; + + protected override IEnumerable RunInternal(PgsqlContext context) + { + Manga? manga = context.Mangas.Find(MangaId); + if(manga is null) + throw new KeyNotFoundException(); + LocalLibrary? library = context.LocalLibraries.Find(ToLibraryId); + if(library is null) + throw new KeyNotFoundException(); + Chapter[] chapters = context.Chapters.Where(c => c.ParentMangaId == MangaId).ToArray(); + Dictionary oldPath = chapters.ToDictionary(c => c, c => c.FullArchiveFilePath!); + manga.Library = library; + context.SaveChanges(); + + return chapters.Select(c => new MoveFileOrFolderJob(oldPath[c], c.FullArchiveFilePath!)); + } +} \ No newline at end of file diff --git a/API/Schema/Jobs/RetrieveChaptersJob.cs b/API/Schema/Jobs/RetrieveChaptersJob.cs index 30b65fa..c485226 100644 --- a/API/Schema/Jobs/RetrieveChaptersJob.cs +++ b/API/Schema/Jobs/RetrieveChaptersJob.cs @@ -21,7 +21,7 @@ public class RetrieveChaptersJob(ulong recurrenceMs, string mangaId, string? par * Manga as a new entity and Postgres throws a Duplicate PK exception. * m.MangaConnector does not have this issue (IDK why). */ - Manga m = context.Manga.Find(MangaId)!; + Manga m = context.Mangas.Find(MangaId)!; MangaConnector connector = context.MangaConnectors.Find(m.MangaConnectorId)!; // This gets all chapters that are not downloaded Chapter[] allNewChapters = connector.GetNewChapters(m).DistinctBy(c => c.ChapterId).ToArray(); diff --git a/API/Schema/LocalLibrary.cs b/API/Schema/LocalLibrary.cs new file mode 100644 index 0000000..5ad7597 --- /dev/null +++ b/API/Schema/LocalLibrary.cs @@ -0,0 +1,17 @@ +using System.ComponentModel.DataAnnotations; + +namespace API.Schema; + +public class LocalLibrary(string basePath, string libraryName) +{ + [StringLength(64)] + [Required] + public string LocalLibraryId { get; init; } = TokenGen.CreateToken(typeof(LocalLibrary), basePath); + [StringLength(256)] + [Required] + public string BasePath { get; internal set; } = basePath; + + [StringLength(512)] + [Required] + public string LibraryName { get; internal set; } = libraryName; +} \ No newline at end of file diff --git a/API/Schema/Manga.cs b/API/Schema/Manga.cs index f1669fa..b467872 100644 --- a/API/Schema/Manga.cs +++ b/API/Schema/Manga.cs @@ -44,8 +44,16 @@ public class Manga public string? OriginalLanguage { get; internal set; } [Required] public MangaReleaseStatus ReleaseStatus { get; internal set; } + [StringLength(256)] [Required] - public string FolderName { get; private set; } + public string DirectoryName { get; private set; } + public LocalLibrary? Library { get; internal set; } + [JsonIgnore] + [NotMapped] + public string LibraryPath => Library is null ? TrangaSettings.downloadLocation : Library.BasePath; + [JsonIgnore] + [NotMapped] + public string FullDirectoryPath => Path.Join(LibraryPath, DirectoryName); [Required] public float IgnoreChapterBefore { get; internal set; } [StringLength(64)] @@ -81,7 +89,8 @@ public class Manga public Manga(string idOnConnectorSite, string name, string description, string websiteUrl, string coverUrl, string? coverFileNameInCache, uint year, string? originalLanguage, MangaReleaseStatus releaseStatus, float ignoreChapterBefore, MangaConnector mangaConnector, ICollection authors, - ICollection mangaTags, ICollection links, ICollection altTitles) + ICollection mangaTags, ICollection links, ICollection altTitles, + LocalLibrary? library = null) : this(idOnConnectorSite, name, description, websiteUrl, coverUrl, coverFileNameInCache, year, originalLanguage, releaseStatus, ignoreChapterBefore, mangaConnector.Name) { @@ -89,6 +98,7 @@ public class Manga this.MangaTags = mangaTags; this.Links = links; this.AltTitles = altTitles; + this.Library = library; } public Manga(string idOnConnectorSite, string name, string description, string websiteUrl, string coverUrl, @@ -107,14 +117,14 @@ public class Manga ReleaseStatus = releaseStatus; IgnoreChapterBefore = ignoreChapterBefore; MangaConnectorId = mangaConnectorId; - FolderName = BuildFolderName(name); + DirectoryName = BuildFolderName(name); } public MoveFileOrFolderJob UpdateFolderName(string downloadLocation, string newName) { - string oldName = this.FolderName; - this.FolderName = newName; - return new MoveFileOrFolderJob(Path.Join(downloadLocation, oldName), Path.Join(downloadLocation, this.FolderName)); + string oldName = this.DirectoryName; + this.DirectoryName = newName; + return new MoveFileOrFolderJob(Path.Join(downloadLocation, oldName), Path.Join(downloadLocation, this.DirectoryName)); } internal void UpdateWithInfo(Manga other) @@ -164,7 +174,7 @@ public class Manga public string CreatePublicationFolder() { - string publicationFolder = Path.Join(TrangaSettings.downloadLocation, this.FolderName); + string publicationFolder = Path.Join(LibraryPath, this.DirectoryName); if(!Directory.Exists(publicationFolder)) Directory.CreateDirectory(publicationFolder); if(RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) diff --git a/API/Schema/PgsqlContext.cs b/API/Schema/PgsqlContext.cs index e829766..a5ec743 100644 --- a/API/Schema/PgsqlContext.cs +++ b/API/Schema/PgsqlContext.cs @@ -10,10 +10,11 @@ public class PgsqlContext(DbContextOptions options) : DbContext(op { public DbSet Jobs { get; set; } public DbSet MangaConnectors { get; set; } - public DbSet Manga { get; set; } + public DbSet Mangas { get; set; } + public DbSet LocalLibraries { get; set; } public DbSet Chapters { get; set; } public DbSet Authors { get; set; } - public DbSet Link { get; set; } + public DbSet Links { get; set; } public DbSet Tags { get; set; } public DbSet AltTitles { get; set; } public DbSet LibraryConnectors { get; set; } @@ -73,6 +74,13 @@ public class PgsqlContext(DbContextOptions options) : DbContext(op modelBuilder.Entity() .Navigation(m => m.MangaConnector) .AutoInclude(); + modelBuilder.Entity() + .HasOne(m => m.Library) + .WithMany() + .OnDelete(DeleteBehavior.Restrict); + modelBuilder.Entity() + .Navigation(m => m.Library) + .AutoInclude(); modelBuilder.Entity() .HasMany(m => m.Authors) .WithMany(); diff --git a/API/Tranga.cs b/API/Tranga.cs index 3b34c91..32662e8 100644 --- a/API/Tranga.cs +++ b/API/Tranga.cs @@ -153,7 +153,7 @@ public static class Tranga { foreach (DownloadAvailableChaptersJob job in jobsByType[JobType.DownloadAvailableChaptersJob]) { - Manga manga = job.Manga ?? context.Manga.Find(job.MangaId)!; + Manga manga = job.Manga ?? context.Mangas.Find(job.MangaId)!; MangaConnector connector = manga.MangaConnector ?? context.MangaConnectors.Find(manga.MangaConnectorId)!; if(!metadataJobsByConnector.TryAdd(connector, [job])) metadataJobsByConnector[connector].Add(job); @@ -163,7 +163,7 @@ public static class Tranga { foreach (UpdateMetadataJob job in jobsByType[JobType.UpdateMetaDataJob]) { - Manga manga = job.Manga ?? context.Manga.Find(job.MangaId)!; + Manga manga = job.Manga ?? context.Mangas.Find(job.MangaId)!; MangaConnector connector = manga.MangaConnector ?? context.MangaConnectors.Find(manga.MangaConnectorId)!; if(!metadataJobsByConnector.TryAdd(connector, [job])) metadataJobsByConnector[connector].Add(job); @@ -173,7 +173,7 @@ public static class Tranga { foreach (RetrieveChaptersJob job in jobsByType[JobType.RetrieveChaptersJob]) { - Manga manga = job.Manga ?? context.Manga.Find(job.MangaId)!; + Manga manga = job.Manga ?? context.Mangas.Find(job.MangaId)!; MangaConnector connector = manga.MangaConnector ?? context.MangaConnectors.Find(manga.MangaConnectorId)!; if(!metadataJobsByConnector.TryAdd(connector, [job])) metadataJobsByConnector[connector].Add(job); @@ -189,7 +189,7 @@ public static class Tranga foreach (DownloadSingleChapterJob job in jobsByType[JobType.DownloadSingleChapterJob]) { Chapter chapter = job.Chapter ?? context.Chapters.Find(job.ChapterId)!; - Manga manga = chapter.ParentManga ?? context.Manga.Find(chapter.ParentMangaId)!; + Manga manga = chapter.ParentManga ?? context.Mangas.Find(chapter.ParentMangaId)!; MangaConnector connector = manga.MangaConnector ?? context.MangaConnectors.Find(manga.MangaConnectorId)!; if(!downloadJobsByConnector.TryAdd(connector, [job]))