From 8a20a1ef5094efc05426ed420bbde40358fdf2dd Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Mon, 11 Mar 2024 00:01:03 +0100 Subject: [PATCH] Add first unread chapter field to MangaType (#900) --- .../graphql/dataLoaders/ChapterDataLoader.kt | 19 +++++++++++++++++++ .../TachideskDataLoaderRegistryFactory.kt | 2 ++ .../tachidesk/graphql/types/MangaType.kt | 5 +++++ 3 files changed, 26 insertions(+) diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/dataLoaders/ChapterDataLoader.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/dataLoaders/ChapterDataLoader.kt index e4f686a8..52a5d852 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/dataLoaders/ChapterDataLoader.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/dataLoaders/ChapterDataLoader.kt @@ -174,3 +174,22 @@ class LatestUploadedChapterForMangaDataLoader : KotlinDataLoader { + override val dataLoaderName = "FirstUnreadChapterForMangaDataLoader" + + override fun getDataLoader(): DataLoader = + DataLoaderFactory.newDataLoader { ids -> + future { + transaction { + addLogger(Slf4jSqlDebugLogger) + val firstUnreadChaptersByMangaId = + ChapterTable + .select { (ChapterTable.manga inList ids) and (ChapterTable.isRead eq false) } + .orderBy(ChapterTable.sourceOrder to SortOrder.ASC) + .groupBy { it[ChapterTable.manga].value } + ids.map { id -> firstUnreadChaptersByMangaId[id]?.let { chapters -> ChapterType(chapters.first()) } } + } + } + } +} diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/server/TachideskDataLoaderRegistryFactory.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/server/TachideskDataLoaderRegistryFactory.kt index 3807dfa8..4d4eac3c 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/server/TachideskDataLoaderRegistryFactory.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/server/TachideskDataLoaderRegistryFactory.kt @@ -19,6 +19,7 @@ import suwayomi.tachidesk.graphql.dataLoaders.DisplayScoreForTrackRecordDataLoad import suwayomi.tachidesk.graphql.dataLoaders.DownloadedChapterCountForMangaDataLoader import suwayomi.tachidesk.graphql.dataLoaders.ExtensionDataLoader import suwayomi.tachidesk.graphql.dataLoaders.ExtensionForSourceDataLoader +import suwayomi.tachidesk.graphql.dataLoaders.FirstUnreadChapterForMangaDataLoader import suwayomi.tachidesk.graphql.dataLoaders.GlobalMetaDataLoader import suwayomi.tachidesk.graphql.dataLoaders.LastReadChapterForMangaDataLoader import suwayomi.tachidesk.graphql.dataLoaders.LatestFetchedChapterForMangaDataLoader @@ -54,6 +55,7 @@ class TachideskDataLoaderRegistryFactory { LatestReadChapterForMangaDataLoader(), LatestFetchedChapterForMangaDataLoader(), LatestUploadedChapterForMangaDataLoader(), + FirstUnreadChapterForMangaDataLoader(), GlobalMetaDataLoader(), ChapterMetaDataLoader(), MangaMetaDataLoader(), diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/MangaType.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/MangaType.kt index ef58440b..84e7b237 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/MangaType.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/MangaType.kt @@ -57,6 +57,7 @@ class MangaType( dataFetchingEnvironment.getDataLoader("LatestReadChapterForMangaDataLoader").clear(mangaId) dataFetchingEnvironment.getDataLoader("LatestFetchedChapterForMangaDataLoader").clear(mangaId) dataFetchingEnvironment.getDataLoader("LatestUploadedChapterForMangaDataLoader").clear(mangaId) + dataFetchingEnvironment.getDataLoader("FirstUnreadChapterForMangaDataLoader").clear(mangaId) dataFetchingEnvironment.getDataLoader( "ChaptersForMangaDataLoader", ).clear(mangaId) @@ -131,6 +132,10 @@ class MangaType( return dataFetchingEnvironment.getValueFromDataLoader("LatestUploadedChapterForMangaDataLoader", id) } + fun firstUnreadChapter(dataFetchingEnvironment: DataFetchingEnvironment): CompletableFuture { + return dataFetchingEnvironment.getValueFromDataLoader("FirstUnreadChapterForMangaDataLoader", id) + } + fun chapters(dataFetchingEnvironment: DataFetchingEnvironment): CompletableFuture { return dataFetchingEnvironment.getValueFromDataLoader("ChaptersForMangaDataLoader", id) }