diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/dataLoaders/MetaDataLoader.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/dataLoaders/MetaDataLoader.kt new file mode 100644 index 00000000..1ac2b6ac --- /dev/null +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/dataLoaders/MetaDataLoader.kt @@ -0,0 +1,45 @@ +package suwayomi.tachidesk.graphql.dataLoaders + +import com.expediagroup.graphql.dataloader.KotlinDataLoader +import org.dataloader.DataLoader +import org.dataloader.DataLoaderFactory +import org.jetbrains.exposed.sql.StdOutSqlLogger +import org.jetbrains.exposed.sql.addLogger +import org.jetbrains.exposed.sql.select +import org.jetbrains.exposed.sql.transactions.transaction +import suwayomi.tachidesk.graphql.types.ChapterMetaItem +import suwayomi.tachidesk.graphql.types.MangaMetaItem +import suwayomi.tachidesk.graphql.types.MetaType +import suwayomi.tachidesk.manga.model.table.ChapterMetaTable +import suwayomi.tachidesk.manga.model.table.MangaMetaTable +import java.util.concurrent.CompletableFuture + +class ChapterMetaDataLoader : KotlinDataLoader { + override val dataLoaderName = "ChapterMetaDataLoader" + override fun getDataLoader(): DataLoader = DataLoaderFactory.newDataLoader { ids -> + CompletableFuture.supplyAsync { + transaction { + addLogger(StdOutSqlLogger) + val metasByChapterId = ChapterMetaTable.select { ChapterMetaTable.ref inList ids } + .map { ChapterMetaItem(it) } + .groupBy { it.ref } + ids.map { metasByChapterId[it] ?: emptyList() } + } + } + } +} + +class MangaMetaDataLoader : KotlinDataLoader { + override val dataLoaderName = "MangaMetaDataLoader" + override fun getDataLoader(): DataLoader = DataLoaderFactory.newDataLoader { ids -> + CompletableFuture.supplyAsync { + transaction { + addLogger(StdOutSqlLogger) + val metasByChapterId = MangaMetaTable.select { MangaMetaTable.ref inList ids } + .map { MangaMetaItem(it) } + .groupBy { it.ref } + ids.map { metasByChapterId[it] ?: emptyList() } + } + } + } +} diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/dataLoaders/TachideskDataLoaderRegistryFactory.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/dataLoaders/TachideskDataLoaderRegistryFactory.kt index 27ed965a..a0f5cf38 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/dataLoaders/TachideskDataLoaderRegistryFactory.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/dataLoaders/TachideskDataLoaderRegistryFactory.kt @@ -12,5 +12,7 @@ import com.expediagroup.graphql.dataloader.KotlinDataLoaderRegistryFactory val tachideskDataLoaderRegistryFactory = KotlinDataLoaderRegistryFactory( MangaDataLoader(), ChapterDataLoader(), - ChaptersForMangaDataLoader() + ChaptersForMangaDataLoader(), + ChapterMetaDataLoader(), + MangaMetaDataLoader() ) 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 f8536ad9..03a1102c 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/ChapterType.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/ChapterType.kt @@ -30,7 +30,6 @@ class ChapterType( val isDownloaded: Boolean, val pageCount: Int // val chapterCount: Int?, -// val meta: Map = emptyMap() ) { constructor(row: ResultRow) : this( row[ChapterTable.id].value, @@ -49,14 +48,13 @@ class ChapterType( row[ChapterTable.isDownloaded], row[ChapterTable.pageCount] // transaction { ChapterTable.select { manga eq chapterEntry[manga].value }.count().toInt() }, -// Chapter.getChapterMetaMap(chapterEntry[id]) ) fun manga(dataFetchingEnvironment: DataFetchingEnvironment): CompletableFuture { return dataFetchingEnvironment.getValueFromDataLoader("MangaDataLoader", mangaId) } -// fun chapters(): List { -// return listOf("Foo", "Bar", "Baz") -// } + fun meta(dataFetchingEnvironment: DataFetchingEnvironment): CompletableFuture { + return dataFetchingEnvironment.getValueFromDataLoader("ChapterMetaDataLoader", id) + } } 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 50323872..b00dadfa 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/MangaType.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/MangaType.kt @@ -67,4 +67,8 @@ class MangaType( return Instant.now().epochSecond.minus(chaptersLastFetchedAt!!) } + + fun meta(dataFetchingEnvironment: DataFetchingEnvironment): CompletableFuture { + return dataFetchingEnvironment.getValueFromDataLoader("MangaMetaDataLoader", id) + } } diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/MetaType.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/MetaType.kt new file mode 100644 index 00000000..d9826d72 --- /dev/null +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/MetaType.kt @@ -0,0 +1,23 @@ +package suwayomi.tachidesk.graphql.types + +import com.expediagroup.graphql.generator.annotations.GraphQLIgnore +import org.jetbrains.exposed.sql.ResultRow +import suwayomi.tachidesk.manga.model.table.ChapterMetaTable +import suwayomi.tachidesk.manga.model.table.MangaMetaTable + +typealias MetaType = List + +open class MetaItem( + val key: String, + val value: String, + @GraphQLIgnore + val ref: Int +) + +class ChapterMetaItem( + private val row: ResultRow +) : MetaItem(row[ChapterMetaTable.key], row[ChapterMetaTable.value], row[ChapterMetaTable.ref].value) + +class MangaMetaItem( + private val row: ResultRow +) : MetaItem(row[MangaMetaTable.key], row[MangaMetaTable.value], row[MangaMetaTable.ref].value)