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 bca01095..e4f686a8 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/dataLoaders/ChapterDataLoader.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/dataLoaders/ChapterDataLoader.kt @@ -109,11 +109,68 @@ class LastReadChapterForMangaDataLoader : KotlinDataLoader { addLogger(Slf4jSqlDebugLogger) val lastReadChaptersByMangaId = ChapterTable - .select { (ChapterTable.manga inList ids) and (ChapterTable.isRead eq true) } - .orderBy(ChapterTable.sourceOrder to SortOrder.DESC) + .select { (ChapterTable.manga inList ids) } + .orderBy(ChapterTable.lastReadAt to SortOrder.DESC) .groupBy { it[ChapterTable.manga].value } ids.map { id -> lastReadChaptersByMangaId[id]?.let { chapters -> ChapterType(chapters.first()) } } } } } } + +class LatestReadChapterForMangaDataLoader : KotlinDataLoader { + override val dataLoaderName = "LatestReadChapterForMangaDataLoader" + + override fun getDataLoader(): DataLoader = + DataLoaderFactory.newDataLoader { ids -> + future { + transaction { + addLogger(Slf4jSqlDebugLogger) + val latestReadChaptersByMangaId = + ChapterTable + .select { (ChapterTable.manga inList ids) and (ChapterTable.isRead eq true) } + .orderBy(ChapterTable.sourceOrder to SortOrder.DESC) + .groupBy { it[ChapterTable.manga].value } + ids.map { id -> latestReadChaptersByMangaId[id]?.let { chapters -> ChapterType(chapters.first()) } } + } + } + } +} + +class LatestFetchedChapterForMangaDataLoader : KotlinDataLoader { + override val dataLoaderName = "LatestFetchedChapterForMangaDataLoader" + + override fun getDataLoader(): DataLoader = + DataLoaderFactory.newDataLoader { ids -> + future { + transaction { + addLogger(Slf4jSqlDebugLogger) + val latestFetchedChaptersByMangaId = + ChapterTable + .select { (ChapterTable.manga inList ids) } + .orderBy(ChapterTable.fetchedAt to SortOrder.DESC, ChapterTable.sourceOrder to SortOrder.DESC) + .groupBy { it[ChapterTable.manga].value } + ids.map { id -> latestFetchedChaptersByMangaId[id]?.let { chapters -> ChapterType(chapters.first()) } } + } + } + } +} + +class LatestUploadedChapterForMangaDataLoader : KotlinDataLoader { + override val dataLoaderName = "LatestUploadedChapterForMangaDataLoader" + + override fun getDataLoader(): DataLoader = + DataLoaderFactory.newDataLoader { ids -> + future { + transaction { + addLogger(Slf4jSqlDebugLogger) + val latestUploadedChaptersByMangaId = + ChapterTable + .select { (ChapterTable.manga inList ids) } + .orderBy(ChapterTable.date_upload to SortOrder.DESC, ChapterTable.sourceOrder to SortOrder.DESC) + .groupBy { it[ChapterTable.manga].value } + ids.map { id -> latestUploadedChaptersByMangaId[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 f981b1e0..24953c1f 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/server/TachideskDataLoaderRegistryFactory.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/server/TachideskDataLoaderRegistryFactory.kt @@ -20,6 +20,9 @@ import suwayomi.tachidesk.graphql.dataLoaders.ExtensionDataLoader import suwayomi.tachidesk.graphql.dataLoaders.ExtensionForSourceDataLoader import suwayomi.tachidesk.graphql.dataLoaders.GlobalMetaDataLoader import suwayomi.tachidesk.graphql.dataLoaders.LastReadChapterForMangaDataLoader +import suwayomi.tachidesk.graphql.dataLoaders.LatestFetchedChapterForMangaDataLoader +import suwayomi.tachidesk.graphql.dataLoaders.LatestReadChapterForMangaDataLoader +import suwayomi.tachidesk.graphql.dataLoaders.LatestUploadedChapterForMangaDataLoader import suwayomi.tachidesk.graphql.dataLoaders.MangaDataLoader import suwayomi.tachidesk.graphql.dataLoaders.MangaForCategoryDataLoader import suwayomi.tachidesk.graphql.dataLoaders.MangaForIdsDataLoader @@ -39,6 +42,9 @@ class TachideskDataLoaderRegistryFactory { DownloadedChapterCountForMangaDataLoader(), UnreadChapterCountForMangaDataLoader(), LastReadChapterForMangaDataLoader(), + LatestReadChapterForMangaDataLoader(), + LatestFetchedChapterForMangaDataLoader(), + LatestUploadedChapterForMangaDataLoader(), 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 66060740..1180c216 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/MangaType.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/MangaType.kt @@ -53,6 +53,9 @@ class MangaType( dataFetchingEnvironment.getDataLoader("DownloadedChapterCountForMangaDataLoader").clear(mangaId) dataFetchingEnvironment.getDataLoader("UnreadChapterCountForMangaDataLoader").clear(mangaId) dataFetchingEnvironment.getDataLoader("LastReadChapterForMangaDataLoader").clear(mangaId) + dataFetchingEnvironment.getDataLoader("LatestReadChapterForMangaDataLoader").clear(mangaId) + dataFetchingEnvironment.getDataLoader("LatestFetchedChapterForMangaDataLoader").clear(mangaId) + dataFetchingEnvironment.getDataLoader("LatestUploadedChapterForMangaDataLoader").clear(mangaId) dataFetchingEnvironment.getDataLoader( "ChaptersForMangaDataLoader", ).clear(mangaId) @@ -113,6 +116,18 @@ class MangaType( return dataFetchingEnvironment.getValueFromDataLoader("LastReadChapterForMangaDataLoader", id) } + fun latestReadChapter(dataFetchingEnvironment: DataFetchingEnvironment): CompletableFuture { + return dataFetchingEnvironment.getValueFromDataLoader("LatestReadChapterForMangaDataLoader", id) + } + + fun latestFetchedChapter(dataFetchingEnvironment: DataFetchingEnvironment): CompletableFuture { + return dataFetchingEnvironment.getValueFromDataLoader("LatestFetchedChapterForMangaDataLoader", id) + } + + fun latestUploadedChapter(dataFetchingEnvironment: DataFetchingEnvironment): CompletableFuture { + return dataFetchingEnvironment.getValueFromDataLoader("LatestUploadedChapterForMangaDataLoader", id) + } + fun chapters(dataFetchingEnvironment: DataFetchingEnvironment): CompletableFuture { return dataFetchingEnvironment.getValueFromDataLoader("ChaptersForMangaDataLoader", id) }