From 11be9691018b6c353194c12a7298f0414620e974 Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Sat, 16 Dec 2023 18:59:17 +0100 Subject: [PATCH] Fix/download subscription returning outdated data for finished downloads (#794) * Return latest data for finished downloads In case a download has finished, the cache of the data loader has to be cleared to be able to get the latest data, otherwise, the returned chapter will still be marked as not downloaded * Correctly clear manga data loader caches --- .../suwayomi/tachidesk/graphql/types/ChapterType.kt | 13 +++++++++++++ .../tachidesk/graphql/types/DownloadType.kt | 11 +++++++++++ .../suwayomi/tachidesk/graphql/types/MangaType.kt | 10 +++++----- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/ChapterType.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/ChapterType.kt index c354e52b..aeeff7b5 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/ChapterType.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/ChapterType.kt @@ -38,6 +38,19 @@ class ChapterType( val pageCount: Int, // val chapterCount: Int?, ) : Node { + companion object { + fun clearCacheFor( + chapterId: Int, + mangaId: Int, + dataFetchingEnvironment: DataFetchingEnvironment, + ) { + dataFetchingEnvironment.getDataLoader("ChapterDataLoader").clear(chapterId) + dataFetchingEnvironment.getDataLoader("ChaptersForMangaDataLoader").clear(mangaId) + dataFetchingEnvironment.getDataLoader("DownloadedChapterCountForMangaDataLoader").clear(mangaId) + dataFetchingEnvironment.getDataLoader("LastReadChapterForMangaDataLoader").clear(mangaId) + } + } + constructor(row: ResultRow) : this( row[ChapterTable.id].value, row[ChapterTable.url], diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/DownloadType.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/DownloadType.kt index f1921811..9036579b 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/DownloadType.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/DownloadType.kt @@ -15,6 +15,7 @@ import suwayomi.tachidesk.graphql.server.primitives.Edge import suwayomi.tachidesk.graphql.server.primitives.Node import suwayomi.tachidesk.graphql.server.primitives.NodeList import suwayomi.tachidesk.graphql.server.primitives.PageInfo +import suwayomi.tachidesk.graphql.types.DownloadState.FINISHED import suwayomi.tachidesk.manga.impl.download.model.DownloadChapter import suwayomi.tachidesk.manga.impl.download.model.DownloadStatus import suwayomi.tachidesk.manga.impl.download.model.Status @@ -57,10 +58,20 @@ class DownloadType( ) fun manga(dataFetchingEnvironment: DataFetchingEnvironment): CompletableFuture { + val clearCache = state == FINISHED + if (clearCache) { + MangaType.clearCacheFor(mangaId, dataFetchingEnvironment) + } + return dataFetchingEnvironment.getValueFromDataLoader("MangaDataLoader", mangaId) } fun chapter(dataFetchingEnvironment: DataFetchingEnvironment): CompletableFuture { + val clearCache = state == FINISHED + if (clearCache) { + ChapterType.clearCacheFor(chapterId, mangaId, dataFetchingEnvironment) + } + return dataFetchingEnvironment.getValueFromDataLoader("ChapterDataLoader", chapterId) } } 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 75858e3d..130c96f1 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/MangaType.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/MangaType.kt @@ -46,16 +46,16 @@ class MangaType( mangaId: Int, dataFetchingEnvironment: DataFetchingEnvironment, ) { - dataFetchingEnvironment.getDataLoader, MangaNodeList>("MangaDataLoader").clear(listOf(mangaId)) - dataFetchingEnvironment.getDataLoader, MangaNodeList>("MangaForIdsDataLoader").clear(listOf(mangaId)) + dataFetchingEnvironment.getDataLoader("MangaDataLoader").clear(mangaId) + dataFetchingEnvironment.getDataLoader("MangaForIdsDataLoader").clear(mangaId) dataFetchingEnvironment.getDataLoader("DownloadedChapterCountForMangaDataLoader").clear(mangaId) dataFetchingEnvironment.getDataLoader("UnreadChapterCountForMangaDataLoader").clear(mangaId) - dataFetchingEnvironment.getDataLoader("LastReadChapterForMangaDataLoader").clear(mangaId) + dataFetchingEnvironment.getDataLoader("LastReadChapterForMangaDataLoader").clear(mangaId) dataFetchingEnvironment.getDataLoader( "ChaptersForMangaDataLoader", ).clear(mangaId) - dataFetchingEnvironment.getDataLoader("MangaMetaDataLoader").clear(mangaId) - dataFetchingEnvironment.getDataLoader("CategoriesForMangaDataLoader").clear(mangaId) + dataFetchingEnvironment.getDataLoader>("MangaMetaDataLoader").clear(mangaId) + dataFetchingEnvironment.getDataLoader("CategoriesForMangaDataLoader").clear(mangaId) } }