diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/dataLoaders/MetaDataLoader.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/dataLoaders/MetaDataLoader.kt index a9465eef..3a61300a 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/dataLoaders/MetaDataLoader.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/dataLoaders/MetaDataLoader.kt @@ -7,14 +7,32 @@ import org.jetbrains.exposed.sql.Slf4jSqlDebugLogger import org.jetbrains.exposed.sql.addLogger import org.jetbrains.exposed.sql.select import org.jetbrains.exposed.sql.transactions.transaction +import suwayomi.tachidesk.global.model.table.GlobalMetaTable import suwayomi.tachidesk.graphql.types.CategoryMetaItem import suwayomi.tachidesk.graphql.types.ChapterMetaItem +import suwayomi.tachidesk.graphql.types.GlobalMetaItem import suwayomi.tachidesk.graphql.types.MangaMetaItem +import suwayomi.tachidesk.graphql.types.MetaItem import suwayomi.tachidesk.graphql.types.MetaType import suwayomi.tachidesk.manga.model.table.ChapterMetaTable import suwayomi.tachidesk.manga.model.table.MangaMetaTable import suwayomi.tachidesk.server.JavalinSetup.future +class GlobalMetaDataLoader : KotlinDataLoader { + override val dataLoaderName = "GlobalMetaDataLoader" + override fun getDataLoader(): DataLoader = DataLoaderFactory.newDataLoader { ids -> + future { + transaction { + addLogger(Slf4jSqlDebugLogger) + val metasByRefId = GlobalMetaTable.select { GlobalMetaTable.key inList ids } + .map { GlobalMetaItem(it) } + .associateBy { it.key } + ids.map { metasByRefId[it] } + } + } + } +} + class ChapterMetaDataLoader : KotlinDataLoader { override val dataLoaderName = "ChapterMetaDataLoader" override fun getDataLoader(): DataLoader = DataLoaderFactory.newDataLoader { ids -> diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/queries/MetaQuery.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/queries/MetaQuery.kt new file mode 100644 index 00000000..ae6742a0 --- /dev/null +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/queries/MetaQuery.kt @@ -0,0 +1,31 @@ +/* + * Copyright (C) Contributors to the Suwayomi project + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +package suwayomi.tachidesk.graphql.queries + +import com.expediagroup.graphql.server.extensions.getValueFromDataLoader +import graphql.schema.DataFetchingEnvironment +import org.jetbrains.exposed.sql.selectAll +import org.jetbrains.exposed.sql.transactions.transaction +import suwayomi.tachidesk.global.model.table.GlobalMetaTable +import suwayomi.tachidesk.graphql.types.GlobalMetaItem +import suwayomi.tachidesk.graphql.types.MetaItem +import java.util.concurrent.CompletableFuture + +class MetaQuery { + fun meta(dataFetchingEnvironment: DataFetchingEnvironment, key: String): CompletableFuture { + return dataFetchingEnvironment.getValueFromDataLoader("GlobalMetaDataLoader", key) + } + + fun metas(): List { + val results = transaction { + GlobalMetaTable.selectAll().toList() + } + + return results.map { GlobalMetaItem(it) } + } +} 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 bafdefdb..b180e9f8 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/server/TachideskDataLoaderRegistryFactory.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/server/TachideskDataLoaderRegistryFactory.kt @@ -15,6 +15,7 @@ import suwayomi.tachidesk.graphql.dataLoaders.ChapterMetaDataLoader import suwayomi.tachidesk.graphql.dataLoaders.ChaptersForMangaDataLoader import suwayomi.tachidesk.graphql.dataLoaders.ExtensionDataLoader import suwayomi.tachidesk.graphql.dataLoaders.ExtensionForSourceDataLoader +import suwayomi.tachidesk.graphql.dataLoaders.GlobalMetaDataLoader import suwayomi.tachidesk.graphql.dataLoaders.MangaDataLoader import suwayomi.tachidesk.graphql.dataLoaders.MangaForCategoryDataLoader import suwayomi.tachidesk.graphql.dataLoaders.MangaMetaDataLoader @@ -29,6 +30,7 @@ class TachideskDataLoaderRegistryFactory { MangaDataLoader(), ChapterDataLoader(), ChaptersForMangaDataLoader(), + GlobalMetaDataLoader(), ChapterMetaDataLoader(), MangaMetaDataLoader(), MangaForCategoryDataLoader(), diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/server/TachideskGraphQLSchema.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/server/TachideskGraphQLSchema.kt index 665ea526..92e0d2a5 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/server/TachideskGraphQLSchema.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/server/TachideskGraphQLSchema.kt @@ -18,6 +18,7 @@ import suwayomi.tachidesk.graphql.queries.CategoryQuery import suwayomi.tachidesk.graphql.queries.ChapterQuery import suwayomi.tachidesk.graphql.queries.ExtensionQuery import suwayomi.tachidesk.graphql.queries.MangaQuery +import suwayomi.tachidesk.graphql.queries.MetaQuery import suwayomi.tachidesk.graphql.queries.SourceQuery import suwayomi.tachidesk.graphql.subscriptions.DownloadSubscription import kotlin.reflect.KClass @@ -41,7 +42,8 @@ val schema = toSchema( TopLevelObject(ChapterQuery()), TopLevelObject(CategoryQuery()), TopLevelObject(SourceQuery()), - TopLevelObject(ExtensionQuery()) + TopLevelObject(ExtensionQuery()), + TopLevelObject(MetaQuery()) ), mutations = listOf( TopLevelObject(ChapterMutation()) diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/MetaType.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/MetaType.kt index a8c19240..2283104e 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/MetaType.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/MetaType.kt @@ -2,6 +2,7 @@ package suwayomi.tachidesk.graphql.types import com.expediagroup.graphql.generator.annotations.GraphQLIgnore import org.jetbrains.exposed.sql.ResultRow +import suwayomi.tachidesk.global.model.table.GlobalMetaTable import suwayomi.tachidesk.manga.model.table.CategoryMetaTable import suwayomi.tachidesk.manga.model.table.ChapterMetaTable import suwayomi.tachidesk.manga.model.table.MangaMetaTable @@ -12,7 +13,7 @@ open class MetaItem( val key: String, val value: String, @GraphQLIgnore - val ref: Int + val ref: Int? ) class ChapterMetaItem( @@ -26,3 +27,7 @@ class MangaMetaItem( class CategoryMetaItem( private val row: ResultRow ) : MetaItem(row[CategoryMetaTable.key], row[CategoryMetaTable.value], row[CategoryMetaTable.ref].value) + +class GlobalMetaItem( + private val row: ResultRow +) : MetaItem(row[GlobalMetaTable.key], row[GlobalMetaTable.value], null)