From 6315940cd6fc6567e1822c37e1bd5d3a3119f021 Mon Sep 17 00:00:00 2001 From: Alessandro Benetton Date: Sun, 2 Feb 2025 00:18:57 +0100 Subject: [PATCH] [postgres-Server-V2] fix: pk conflict error in chapter download (still not working though) --- API/Schema/Jobs/DownloadNewChaptersJob.cs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/API/Schema/Jobs/DownloadNewChaptersJob.cs b/API/Schema/Jobs/DownloadNewChaptersJob.cs index 6cc82b8..b00472e 100644 --- a/API/Schema/Jobs/DownloadNewChaptersJob.cs +++ b/API/Schema/Jobs/DownloadNewChaptersJob.cs @@ -12,11 +12,22 @@ public class DownloadNewChaptersJob(ulong recurrenceMs, string mangaId, string? protected override IEnumerable RunInternal(PgsqlContext context) { - Manga m = Manga ?? context.Manga.Find(MangaId)!; - MangaConnector connector = m.MangaConnector ?? context.MangaConnectors.Find(m.MangaConnectorId)!; - Chapter[] newChapters = connector.GetNewChapters(m); + /* + * For some reason, directly using Manga from above instead of finding it again causes DBContext to consider + * 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)!; + MangaConnector connector = context.MangaConnectors.Find(m.MangaConnectorId)!; + // This gets all chapters that are not downloaded + Chapter[] allNewChapters = connector.GetNewChapters(m); + + // This filters out chapters that are not downloaded but already exist in the DB + string[] chapterIds = context.Chapters.Where(chapter => chapter.ParentMangaId == m.MangaId).Select(chapter => chapter.ChapterId).ToArray(); + Chapter[] newChapters = allNewChapters.Where(chapter => !chapterIds.Contains(chapter.ChapterId)).ToArray(); context.Chapters.AddRangeAsync(newChapters).Wait(); context.SaveChangesAsync().Wait(); - return newChapters.Select(chapter => new DownloadSingleChapterJob(chapter.ChapterId, this.JobId)); + + return allNewChapters.Select(chapter => new DownloadSingleChapterJob(chapter.ChapterId, this.JobId)); } } \ No newline at end of file