From ec870759cfd252b08abee21d82a563457e748146 Mon Sep 17 00:00:00 2001 From: Mitchell Syer Date: Thu, 22 May 2025 19:58:09 -0400 Subject: [PATCH] Add highest numbered chapter function in MangaType (#1397) * Add highest numbered chapter function in MangaType * Fix name --- .../graphql/dataLoaders/ChapterDataLoader.kt | 24 +++++++++++++++++++ .../TachideskDataLoaderRegistryFactory.kt | 2 ++ .../tachidesk/graphql/types/MangaType.kt | 3 +++ .../suwayomi/tachidesk/manga/impl/Chapter.kt | 2 +- .../tachidesk/manga/impl/util/DirName.kt | 2 +- 5 files changed, 31 insertions(+), 2 deletions(-) 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 ad768dec..f0fe0a89 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/dataLoaders/ChapterDataLoader.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/dataLoaders/ChapterDataLoader.kt @@ -256,3 +256,27 @@ class FirstUnreadChapterForMangaDataLoader : KotlinDataLoader } } } + +class HighestNumberedChapterForMangaDataLoader : KotlinDataLoader { + override val dataLoaderName = "HighestNumberedChapterForMangaDataLoader" + + override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader = + DataLoaderFactory.newDataLoader { ids -> + future { + transaction { + addLogger(Slf4jSqlDebugLogger) + val highestNumberedChaptersByMangaId = + ChapterTable + .selectAll() + .where { (ChapterTable.manga inList ids) and (ChapterTable.chapter_number greater 0f) } + .orderBy(ChapterTable.chapter_number to SortOrder.DESC_NULLS_LAST) + .groupBy { it[ChapterTable.manga].value } + ids.map { id -> + highestNumberedChaptersByMangaId[id] + ?.firstOrNull() + ?.let { chapter -> ChapterType(chapter) } + } + } + } + } +} 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 16313f7d..ad15540a 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/server/TachideskDataLoaderRegistryFactory.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/server/TachideskDataLoaderRegistryFactory.kt @@ -23,6 +23,7 @@ import suwayomi.tachidesk.graphql.dataLoaders.ExtensionForSourceDataLoader import suwayomi.tachidesk.graphql.dataLoaders.FirstUnreadChapterForMangaDataLoader import suwayomi.tachidesk.graphql.dataLoaders.GlobalMetaDataLoader import suwayomi.tachidesk.graphql.dataLoaders.HasDuplicateChaptersForMangaDataLoader +import suwayomi.tachidesk.graphql.dataLoaders.HighestNumberedChapterForMangaDataLoader import suwayomi.tachidesk.graphql.dataLoaders.LastReadChapterForMangaDataLoader import suwayomi.tachidesk.graphql.dataLoaders.LatestFetchedChapterForMangaDataLoader import suwayomi.tachidesk.graphql.dataLoaders.LatestReadChapterForMangaDataLoader @@ -60,6 +61,7 @@ class TachideskDataLoaderRegistryFactory { LatestFetchedChapterForMangaDataLoader(), LatestUploadedChapterForMangaDataLoader(), FirstUnreadChapterForMangaDataLoader(), + HighestNumberedChapterForMangaDataLoader(), 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 b96c9b74..dc6a6424 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/MangaType.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/MangaType.kt @@ -154,6 +154,9 @@ class MangaType( fun firstUnreadChapter(dataFetchingEnvironment: DataFetchingEnvironment): CompletableFuture = dataFetchingEnvironment.getValueFromDataLoader("FirstUnreadChapterForMangaDataLoader", id) + fun highestNumberedChapter(dataFetchingEnvironment: DataFetchingEnvironment): CompletableFuture = + dataFetchingEnvironment.getValueFromDataLoader("HighestNumberedChapterForMangaDataLoader", id) + fun chapters(dataFetchingEnvironment: DataFetchingEnvironment): CompletableFuture = dataFetchingEnvironment.getValueFromDataLoader("ChaptersForMangaDataLoader", id) diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Chapter.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Chapter.kt index 6b92949b..e8d6642e 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Chapter.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Chapter.kt @@ -559,7 +559,7 @@ object Chapter { .where { ChapterMetaTable.ref inList chapterIds } .groupBy { it[ChapterMetaTable.ref] } .mapValues { it.value.associate { it[ChapterMetaTable.key] to it[ChapterMetaTable.value] } } - .withDefault { emptyMap() } + .withDefault { emptyMap() } } fun getChapterMetaMap(chapter: EntityID): Map = diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/util/DirName.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/util/DirName.kt index f8612edd..07798bde 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/util/DirName.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/util/DirName.kt @@ -73,7 +73,7 @@ fun updateMangaDownloadDir( val mangaEntry = getMangaEntry(mangaId) val source = GetCatalogueSource.getCatalogueSourceOrStub(mangaEntry[MangaTable.sourceReference]) - val sourceDir = source.toString() + val sourceDir = SafePath.buildValidFilename(source.toString()) val mangaDir = SafePath.buildValidFilename(mangaEntry[MangaTable.title]) val newMangaDir = SafePath.buildValidFilename(newTitle)