Remove asDataFetcherResult

This commit is contained in:
Syer10
2026-05-10 12:21:29 -04:00
parent a210153ed1
commit 5561761020
16 changed files with 1140 additions and 1257 deletions

View File

@@ -1,27 +0,0 @@
package suwayomi.tachidesk.graphql
import com.expediagroup.graphql.server.extensions.toGraphQLError
import graphql.execution.DataFetcherResult
import io.github.oshai.kotlinlogging.KotlinLogging
val logger = KotlinLogging.logger { }
inline fun <T : Any> asDataFetcherResult(block: () -> T): DataFetcherResult<T> {
val result =
runCatching {
block()
}
if (result.isFailure) {
logger.error(result.exceptionOrNull()) { "asDataFetcherResult: failed due to" }
return DataFetcherResult
.newResult<T>()
.error(result.exceptionOrNull()!!.toGraphQLError())
.build()
}
return DataFetcherResult
.newResult<T>()
.data(result.getOrNull())
.build()
}

View File

@@ -1,3 +1,5 @@
@file:Suppress("RedundantNullableReturnType", "unused")
package suwayomi.tachidesk.graphql.mutations package suwayomi.tachidesk.graphql.mutations
import com.expediagroup.graphql.generator.annotations.GraphQLDeprecated import com.expediagroup.graphql.generator.annotations.GraphQLDeprecated

View File

@@ -1,3 +1,5 @@
@file:Suppress("RedundantNullableReturnType", "unused")
package suwayomi.tachidesk.graphql.mutations package suwayomi.tachidesk.graphql.mutations
import graphql.execution.DataFetcherResult import graphql.execution.DataFetcherResult
@@ -15,7 +17,6 @@ import org.jetbrains.exposed.sql.or
import org.jetbrains.exposed.sql.selectAll import org.jetbrains.exposed.sql.selectAll
import org.jetbrains.exposed.sql.transactions.transaction import org.jetbrains.exposed.sql.transactions.transaction
import org.jetbrains.exposed.sql.update import org.jetbrains.exposed.sql.update
import suwayomi.tachidesk.graphql.asDataFetcherResult
import suwayomi.tachidesk.graphql.directives.RequireAuth import suwayomi.tachidesk.graphql.directives.RequireAuth
import suwayomi.tachidesk.graphql.types.CategoryMetaType import suwayomi.tachidesk.graphql.types.CategoryMetaType
import suwayomi.tachidesk.graphql.types.CategoryType import suwayomi.tachidesk.graphql.types.CategoryType
@@ -42,13 +43,12 @@ class CategoryMutation {
) )
@RequireAuth @RequireAuth
fun setCategoryMeta(input: SetCategoryMetaInput): DataFetcherResult<SetCategoryMetaPayload> = fun setCategoryMeta(input: SetCategoryMetaInput): SetCategoryMetaPayload? {
asDataFetcherResult {
val (clientMutationId, meta) = input val (clientMutationId, meta) = input
Category.modifyMeta(meta.categoryId, meta.key, meta.value) Category.modifyMeta(meta.categoryId, meta.key, meta.value)
SetCategoryMetaPayload(clientMutationId, meta) return SetCategoryMetaPayload(clientMutationId, meta)
} }
data class DeleteCategoryMetaInput( data class DeleteCategoryMetaInput(
@@ -64,8 +64,7 @@ class CategoryMutation {
) )
@RequireAuth @RequireAuth
fun deleteCategoryMeta(input: DeleteCategoryMetaInput): DataFetcherResult<DeleteCategoryMetaPayload> = fun deleteCategoryMeta(input: DeleteCategoryMetaInput): DeleteCategoryMetaPayload? {
asDataFetcherResult {
val (clientMutationId, categoryId, key) = input val (clientMutationId, categoryId, key) = input
val (meta, category) = val (meta, category) =
@@ -90,7 +89,7 @@ class CategoryMutation {
} to category } to category
} }
DeleteCategoryMetaPayload(clientMutationId, meta, category) return DeleteCategoryMetaPayload(clientMutationId, meta, category)
} }
data class SetCategoryMetasItem( data class SetCategoryMetasItem(
@@ -110,8 +109,7 @@ class CategoryMutation {
) )
@RequireAuth @RequireAuth
fun setCategoryMetas(input: SetCategoryMetasInput): DataFetcherResult<SetCategoryMetasPayload> = fun setCategoryMetas(input: SetCategoryMetasInput): SetCategoryMetasPayload? {
asDataFetcherResult {
val (clientMutationId, items) = input val (clientMutationId, items) = input
val metaByCategoryId = val metaByCategoryId =
@@ -145,7 +143,7 @@ class CategoryMutation {
updatedMetas to categories updatedMetas to categories
} }
SetCategoryMetasPayload(clientMutationId, updatedMetas, categories) return SetCategoryMetasPayload(clientMutationId, updatedMetas, categories)
} }
data class DeleteCategoryMetasItem( data class DeleteCategoryMetasItem(
@@ -166,8 +164,7 @@ class CategoryMutation {
) )
@RequireAuth @RequireAuth
fun deleteCategoryMetas(input: DeleteCategoryMetasInput): DataFetcherResult<DeleteCategoryMetasPayload> = fun deleteCategoryMetas(input: DeleteCategoryMetasInput): DeleteCategoryMetasPayload? {
asDataFetcherResult {
val (clientMutationId, items) = input val (clientMutationId, items) = input
items.forEach { item -> items.forEach { item ->
@@ -222,7 +219,7 @@ class CategoryMutation {
.distinctBy { it.id } .distinctBy { it.id }
} }
DeleteCategoryMetasPayload(clientMutationId, allDeletedMetas, categories) return DeleteCategoryMetasPayload(clientMutationId, allDeletedMetas, categories)
} }
data class UpdateCategoryPatch( data class UpdateCategoryPatch(
@@ -291,8 +288,7 @@ class CategoryMutation {
} }
@RequireAuth @RequireAuth
fun updateCategory(input: UpdateCategoryInput): DataFetcherResult<UpdateCategoryPayload> = fun updateCategory(input: UpdateCategoryInput): UpdateCategoryPayload? {
asDataFetcherResult {
val (clientMutationId, id, patch) = input val (clientMutationId, id, patch) = input
updateCategories(listOf(id), patch) updateCategories(listOf(id), patch)
@@ -302,15 +298,14 @@ class CategoryMutation {
CategoryType(CategoryTable.selectAll().where { CategoryTable.id eq id }.first()) CategoryType(CategoryTable.selectAll().where { CategoryTable.id eq id }.first())
} }
UpdateCategoryPayload( return UpdateCategoryPayload(
clientMutationId = clientMutationId, clientMutationId = clientMutationId,
category = category, category = category,
) )
} }
@RequireAuth @RequireAuth
fun updateCategories(input: UpdateCategoriesInput): DataFetcherResult<UpdateCategoriesPayload> = fun updateCategories(input: UpdateCategoriesInput): UpdateCategoriesPayload? {
asDataFetcherResult {
val (clientMutationId, ids, patch) = input val (clientMutationId, ids, patch) = input
updateCategories(ids, patch) updateCategories(ids, patch)
@@ -320,7 +315,7 @@ class CategoryMutation {
CategoryTable.selectAll().where { CategoryTable.id inList ids }.map { CategoryType(it) } CategoryTable.selectAll().where { CategoryTable.id inList ids }.map { CategoryType(it) }
} }
UpdateCategoriesPayload( return UpdateCategoriesPayload(
clientMutationId = clientMutationId, clientMutationId = clientMutationId,
categories = categories, categories = categories,
) )
@@ -338,8 +333,7 @@ class CategoryMutation {
) )
@RequireAuth @RequireAuth
fun updateCategoryOrder(input: UpdateCategoryOrderInput): DataFetcherResult<UpdateCategoryOrderPayload> = fun updateCategoryOrder(input: UpdateCategoryOrderInput): UpdateCategoryOrderPayload? {
asDataFetcherResult {
val (clientMutationId, categoryId, position) = input val (clientMutationId, categoryId, position) = input
require(position > 0) { require(position > 0) {
"'order' must not be <= 0" "'order' must not be <= 0"
@@ -376,7 +370,7 @@ class CategoryMutation {
CategoryTable.selectAll().orderBy(CategoryTable.order).map { CategoryType(it) } CategoryTable.selectAll().orderBy(CategoryTable.order).map { CategoryType(it) }
} }
UpdateCategoryOrderPayload( return UpdateCategoryOrderPayload(
clientMutationId = clientMutationId, clientMutationId = clientMutationId,
categories = categories, categories = categories,
) )
@@ -397,8 +391,7 @@ class CategoryMutation {
) )
@RequireAuth @RequireAuth
fun createCategory(input: CreateCategoryInput): DataFetcherResult<CreateCategoryPayload> = fun createCategory(input: CreateCategoryInput): CreateCategoryPayload? {
asDataFetcherResult {
val (clientMutationId, name, order, default, includeInUpdate, includeInDownload) = input val (clientMutationId, name, order, default, includeInUpdate, includeInDownload) = input
transaction { transaction {
require(CategoryTable.selectAll().where { CategoryTable.name eq input.name }.isEmpty()) { require(CategoryTable.selectAll().where { CategoryTable.name eq input.name }.isEmpty()) {
@@ -442,7 +435,7 @@ class CategoryMutation {
CategoryType(CategoryTable.selectAll().where { CategoryTable.id eq id }.first()) CategoryType(CategoryTable.selectAll().where { CategoryTable.id eq id }.first())
} }
CreateCategoryPayload(clientMutationId, category) return CreateCategoryPayload(clientMutationId, category)
} }
data class DeleteCategoryInput( data class DeleteCategoryInput(
@@ -457,11 +450,10 @@ class CategoryMutation {
) )
@RequireAuth @RequireAuth
fun deleteCategory(input: DeleteCategoryInput): DataFetcherResult<DeleteCategoryPayload> { fun deleteCategory(input: DeleteCategoryInput): DeleteCategoryPayload? {
return asDataFetcherResult {
val (clientMutationId, categoryId) = input val (clientMutationId, categoryId) = input
if (categoryId == 0) { // Don't delete default category if (categoryId == 0) { // Don't delete default category
return@asDataFetcherResult DeleteCategoryPayload( return DeleteCategoryPayload(
clientMutationId, clientMutationId,
null, null,
emptyList(), emptyList(),
@@ -496,8 +488,7 @@ class CategoryMutation {
} to mangas } to mangas
} }
DeleteCategoryPayload(clientMutationId, category, mangas) return DeleteCategoryPayload(clientMutationId, category, mangas)
}
} }
data class UpdateMangaCategoriesPatch( data class UpdateMangaCategoriesPatch(
@@ -547,8 +538,7 @@ class CategoryMutation {
} }
@RequireAuth @RequireAuth
fun updateMangaCategories(input: UpdateMangaCategoriesInput): DataFetcherResult<UpdateMangaCategoriesPayload> = fun updateMangaCategories(input: UpdateMangaCategoriesInput): UpdateMangaCategoriesPayload? {
asDataFetcherResult {
val (clientMutationId, id, patch) = input val (clientMutationId, id, patch) = input
updateMangas(listOf(id), patch) updateMangas(listOf(id), patch)
@@ -558,15 +548,14 @@ class CategoryMutation {
MangaType(MangaTable.selectAll().where { MangaTable.id eq id }.first()) MangaType(MangaTable.selectAll().where { MangaTable.id eq id }.first())
} }
UpdateMangaCategoriesPayload( return UpdateMangaCategoriesPayload(
clientMutationId = clientMutationId, clientMutationId = clientMutationId,
manga = manga, manga = manga,
) )
} }
@RequireAuth @RequireAuth
fun updateMangasCategories(input: UpdateMangasCategoriesInput): DataFetcherResult<UpdateMangasCategoriesPayload> = fun updateMangasCategories(input: UpdateMangasCategoriesInput): UpdateMangasCategoriesPayload? {
asDataFetcherResult {
val (clientMutationId, ids, patch) = input val (clientMutationId, ids, patch) = input
updateMangas(ids, patch) updateMangas(ids, patch)
@@ -576,7 +565,7 @@ class CategoryMutation {
MangaTable.selectAll().where { MangaTable.id inList ids }.map { MangaType(it) } MangaTable.selectAll().where { MangaTable.id inList ids }.map { MangaType(it) }
} }
UpdateMangasCategoriesPayload( return UpdateMangasCategoriesPayload(
clientMutationId = clientMutationId, clientMutationId = clientMutationId,
mangas = mangas, mangas = mangas,
) )

View File

@@ -1,6 +1,7 @@
@file:Suppress("RedundantNullableReturnType", "unused")
package suwayomi.tachidesk.graphql.mutations package suwayomi.tachidesk.graphql.mutations
import graphql.execution.DataFetcherResult
import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.jetbrains.exposed.dao.id.EntityID import org.jetbrains.exposed.dao.id.EntityID
@@ -16,7 +17,6 @@ import org.jetbrains.exposed.sql.selectAll
import org.jetbrains.exposed.sql.statements.BatchUpdateStatement import org.jetbrains.exposed.sql.statements.BatchUpdateStatement
import org.jetbrains.exposed.sql.transactions.transaction import org.jetbrains.exposed.sql.transactions.transaction
import org.jetbrains.exposed.sql.update import org.jetbrains.exposed.sql.update
import suwayomi.tachidesk.graphql.asDataFetcherResult
import suwayomi.tachidesk.graphql.directives.RequireAuth import suwayomi.tachidesk.graphql.directives.RequireAuth
import suwayomi.tachidesk.graphql.types.ChapterMetaType import suwayomi.tachidesk.graphql.types.ChapterMetaType
import suwayomi.tachidesk.graphql.types.ChapterType import suwayomi.tachidesk.graphql.types.ChapterType
@@ -120,8 +120,7 @@ class ChapterMutation {
} }
@RequireAuth @RequireAuth
fun updateChapter(input: UpdateChapterInput): DataFetcherResult<UpdateChapterPayload> = fun updateChapter(input: UpdateChapterInput): UpdateChapterPayload? {
asDataFetcherResult {
val (clientMutationId, id, patch) = input val (clientMutationId, id, patch) = input
updateChapters(listOf(id), patch) updateChapters(listOf(id), patch)
@@ -131,15 +130,14 @@ class ChapterMutation {
ChapterType(ChapterTable.selectAll().where { ChapterTable.id eq id }.first()) ChapterType(ChapterTable.selectAll().where { ChapterTable.id eq id }.first())
} }
UpdateChapterPayload( return UpdateChapterPayload(
clientMutationId = clientMutationId, clientMutationId = clientMutationId,
chapter = chapter, chapter = chapter,
) )
} }
@RequireAuth @RequireAuth
fun updateChapters(input: UpdateChaptersInput): DataFetcherResult<UpdateChaptersPayload> = fun updateChapters(input: UpdateChaptersInput): UpdateChaptersPayload? {
asDataFetcherResult {
val (clientMutationId, ids, patch) = input val (clientMutationId, ids, patch) = input
updateChapters(ids, patch) updateChapters(ids, patch)
@@ -149,7 +147,7 @@ class ChapterMutation {
ChapterTable.selectAll().where { ChapterTable.id inList ids }.map { ChapterType(it) } ChapterTable.selectAll().where { ChapterTable.id inList ids }.map { ChapterType(it) }
} }
UpdateChaptersPayload( return UpdateChaptersPayload(
clientMutationId = clientMutationId, clientMutationId = clientMutationId,
chapters = chapters, chapters = chapters,
) )
@@ -166,11 +164,10 @@ class ChapterMutation {
) )
@RequireAuth @RequireAuth
fun fetchChapters(input: FetchChaptersInput): CompletableFuture<DataFetcherResult<FetchChaptersPayload>> { fun fetchChapters(input: FetchChaptersInput): CompletableFuture<FetchChaptersPayload?> {
val (clientMutationId, mangaId) = input val (clientMutationId, mangaId) = input
return future { return future {
asDataFetcherResult {
Chapter.fetchChapterList(mangaId) Chapter.fetchChapterList(mangaId)
val chapters = val chapters =
@@ -188,7 +185,6 @@ class ChapterMutation {
) )
} }
} }
}
data class SetChapterMetaInput( data class SetChapterMetaInput(
val clientMutationId: String? = null, val clientMutationId: String? = null,
@@ -201,13 +197,12 @@ class ChapterMutation {
) )
@RequireAuth @RequireAuth
fun setChapterMeta(input: SetChapterMetaInput): DataFetcherResult<SetChapterMetaPayload> = fun setChapterMeta(input: SetChapterMetaInput): SetChapterMetaPayload? {
asDataFetcherResult {
val (clientMutationId, meta) = input val (clientMutationId, meta) = input
Chapter.modifyChapterMeta(meta.chapterId, meta.key, meta.value) Chapter.modifyChapterMeta(meta.chapterId, meta.key, meta.value)
SetChapterMetaPayload(clientMutationId, meta) return SetChapterMetaPayload(clientMutationId, meta)
} }
data class DeleteChapterMetaInput( data class DeleteChapterMetaInput(
@@ -223,8 +218,7 @@ class ChapterMutation {
) )
@RequireAuth @RequireAuth
fun deleteChapterMeta(input: DeleteChapterMetaInput): DataFetcherResult<DeleteChapterMetaPayload> = fun deleteChapterMeta(input: DeleteChapterMetaInput): DeleteChapterMetaPayload? {
asDataFetcherResult {
val (clientMutationId, chapterId, key) = input val (clientMutationId, chapterId, key) = input
val (meta, chapter) = val (meta, chapter) =
@@ -249,7 +243,7 @@ class ChapterMutation {
} to chapter } to chapter
} }
DeleteChapterMetaPayload(clientMutationId, meta, chapter) return DeleteChapterMetaPayload(clientMutationId, meta, chapter)
} }
data class SetChapterMetasItem( data class SetChapterMetasItem(
@@ -269,8 +263,7 @@ class ChapterMutation {
) )
@RequireAuth @RequireAuth
fun setChapterMetas(input: SetChapterMetasInput): DataFetcherResult<SetChapterMetasPayload> = fun setChapterMetas(input: SetChapterMetasInput): SetChapterMetasPayload? {
asDataFetcherResult {
val (clientMutationId, items) = input val (clientMutationId, items) = input
val metaByChapterId = val metaByChapterId =
@@ -304,7 +297,7 @@ class ChapterMutation {
updatedMetas to chapters updatedMetas to chapters
} }
SetChapterMetasPayload(clientMutationId, updatedMetas, chapters) return SetChapterMetasPayload(clientMutationId, updatedMetas, chapters)
} }
data class DeleteChapterMetasItem( data class DeleteChapterMetasItem(
@@ -325,8 +318,7 @@ class ChapterMutation {
) )
@RequireAuth @RequireAuth
fun deleteChapterMetas(input: DeleteChapterMetasInput): DataFetcherResult<DeleteChapterMetasPayload> = fun deleteChapterMetas(input: DeleteChapterMetasInput): DeleteChapterMetasPayload? {
asDataFetcherResult {
val (clientMutationId, items) = input val (clientMutationId, items) = input
items.forEach { item -> items.forEach { item ->
@@ -381,7 +373,7 @@ class ChapterMutation {
.distinctBy { it.id } .distinctBy { it.id }
} }
DeleteChapterMetasPayload(clientMutationId, allDeletedMetas, chapters) return DeleteChapterMetasPayload(clientMutationId, allDeletedMetas, chapters)
} }
data class FetchChapterPagesInput( data class FetchChapterPagesInput(
@@ -405,12 +397,11 @@ class ChapterMutation {
) )
@RequireAuth @RequireAuth
fun fetchChapterPages(input: FetchChapterPagesInput): CompletableFuture<DataFetcherResult<FetchChapterPagesPayload>> { fun fetchChapterPages(input: FetchChapterPagesInput): CompletableFuture<FetchChapterPagesPayload?> {
val (clientMutationId, chapterId) = input val (clientMutationId, chapterId) = input
val paramsMap = input.toParams() val paramsMap = input.toParams()
return future { return future {
asDataFetcherResult {
var chapter = getChapterDownloadReadyById(chapterId) var chapter = getChapterDownloadReadyById(chapterId)
val syncResult = KoreaderSyncService.checkAndPullProgress(chapter.id) val syncResult = KoreaderSyncService.checkAndPullProgress(chapter.id)
var syncConflictInfo: SyncConflictInfoType? = null var syncConflictInfo: SyncConflictInfoType? = null
@@ -467,5 +458,4 @@ class ChapterMutation {
) )
} }
} }
}
} }

View File

@@ -1,3 +1,5 @@
@file:Suppress("RedundantNullableReturnType", "unused")
package suwayomi.tachidesk.graphql.mutations package suwayomi.tachidesk.graphql.mutations
import graphql.execution.DataFetcherResult import graphql.execution.DataFetcherResult
@@ -5,7 +7,6 @@ import kotlinx.coroutines.flow.first
import kotlinx.coroutines.withTimeout import kotlinx.coroutines.withTimeout
import org.jetbrains.exposed.sql.selectAll import org.jetbrains.exposed.sql.selectAll
import org.jetbrains.exposed.sql.transactions.transaction import org.jetbrains.exposed.sql.transactions.transaction
import suwayomi.tachidesk.graphql.asDataFetcherResult
import suwayomi.tachidesk.graphql.directives.RequireAuth import suwayomi.tachidesk.graphql.directives.RequireAuth
import suwayomi.tachidesk.graphql.types.ChapterType import suwayomi.tachidesk.graphql.types.ChapterType
import suwayomi.tachidesk.graphql.types.DownloadStatus import suwayomi.tachidesk.graphql.types.DownloadStatus
@@ -30,13 +31,12 @@ class DownloadMutation {
) )
@RequireAuth @RequireAuth
fun deleteDownloadedChapters(input: DeleteDownloadedChaptersInput): DataFetcherResult<DeleteDownloadedChaptersPayload> { fun deleteDownloadedChapters(input: DeleteDownloadedChaptersInput): DeleteDownloadedChaptersPayload? {
val (clientMutationId, chapters) = input val (clientMutationId, chapters) = input
return asDataFetcherResult {
Chapter.deleteChapters(chapters) Chapter.deleteChapters(chapters)
DeleteDownloadedChaptersPayload( return DeleteDownloadedChaptersPayload(
clientMutationId = clientMutationId, clientMutationId = clientMutationId,
chapters = chapters =
transaction { transaction {
@@ -47,7 +47,6 @@ class DownloadMutation {
}, },
) )
} }
}
data class DeleteDownloadedChapterInput( data class DeleteDownloadedChapterInput(
val clientMutationId: String? = null, val clientMutationId: String? = null,
@@ -60,13 +59,12 @@ class DownloadMutation {
) )
@RequireAuth @RequireAuth
fun deleteDownloadedChapter(input: DeleteDownloadedChapterInput): DataFetcherResult<DeleteDownloadedChapterPayload> { fun deleteDownloadedChapter(input: DeleteDownloadedChapterInput): DeleteDownloadedChapterPayload? {
val (clientMutationId, chapter) = input val (clientMutationId, chapter) = input
return asDataFetcherResult {
Chapter.deleteChapters(listOf(chapter)) Chapter.deleteChapters(listOf(chapter))
DeleteDownloadedChapterPayload( return DeleteDownloadedChapterPayload(
clientMutationId = clientMutationId, clientMutationId = clientMutationId,
chapters = chapters =
transaction { transaction {
@@ -74,7 +72,6 @@ class DownloadMutation {
}, },
) )
} }
}
data class EnqueueChapterDownloadsInput( data class EnqueueChapterDownloadsInput(
val clientMutationId: String? = null, val clientMutationId: String? = null,
@@ -87,13 +84,10 @@ class DownloadMutation {
) )
@RequireAuth @RequireAuth
fun enqueueChapterDownloads( fun enqueueChapterDownloads(input: EnqueueChapterDownloadsInput): CompletableFuture<EnqueueChapterDownloadsPayload?> {
input: EnqueueChapterDownloadsInput,
): CompletableFuture<DataFetcherResult<EnqueueChapterDownloadsPayload>> {
val (clientMutationId, chapters) = input val (clientMutationId, chapters) = input
return future { return future {
asDataFetcherResult {
DownloadManager.enqueue(DownloadManager.EnqueueInput(chapters)) DownloadManager.enqueue(DownloadManager.EnqueueInput(chapters))
EnqueueChapterDownloadsPayload( EnqueueChapterDownloadsPayload(
@@ -110,7 +104,6 @@ class DownloadMutation {
) )
} }
} }
}
data class EnqueueChapterDownloadInput( data class EnqueueChapterDownloadInput(
val clientMutationId: String? = null, val clientMutationId: String? = null,
@@ -123,11 +116,10 @@ class DownloadMutation {
) )
@RequireAuth @RequireAuth
fun enqueueChapterDownload(input: EnqueueChapterDownloadInput): CompletableFuture<DataFetcherResult<EnqueueChapterDownloadPayload>> { fun enqueueChapterDownload(input: EnqueueChapterDownloadInput): CompletableFuture<EnqueueChapterDownloadPayload?> {
val (clientMutationId, chapter) = input val (clientMutationId, chapter) = input
return future { return future {
asDataFetcherResult {
DownloadManager.enqueue(DownloadManager.EnqueueInput(listOf(chapter))) DownloadManager.enqueue(DownloadManager.EnqueueInput(listOf(chapter)))
EnqueueChapterDownloadPayload( EnqueueChapterDownloadPayload(
@@ -143,7 +135,6 @@ class DownloadMutation {
) )
} }
} }
}
data class DequeueChapterDownloadsInput( data class DequeueChapterDownloadsInput(
val clientMutationId: String? = null, val clientMutationId: String? = null,
@@ -156,13 +147,10 @@ class DownloadMutation {
) )
@RequireAuth @RequireAuth
fun dequeueChapterDownloads( fun dequeueChapterDownloads(input: DequeueChapterDownloadsInput): CompletableFuture<DequeueChapterDownloadsPayload?> {
input: DequeueChapterDownloadsInput,
): CompletableFuture<DataFetcherResult<DequeueChapterDownloadsPayload>> {
val (clientMutationId, chapters) = input val (clientMutationId, chapters) = input
return future { return future {
asDataFetcherResult {
DownloadManager.dequeue(DownloadManager.EnqueueInput(chapters)) DownloadManager.dequeue(DownloadManager.EnqueueInput(chapters))
DequeueChapterDownloadsPayload( DequeueChapterDownloadsPayload(
@@ -181,7 +169,6 @@ class DownloadMutation {
) )
} }
} }
}
data class DequeueChapterDownloadInput( data class DequeueChapterDownloadInput(
val clientMutationId: String? = null, val clientMutationId: String? = null,
@@ -194,11 +181,10 @@ class DownloadMutation {
) )
@RequireAuth @RequireAuth
fun dequeueChapterDownload(input: DequeueChapterDownloadInput): CompletableFuture<DataFetcherResult<DequeueChapterDownloadPayload>> { fun dequeueChapterDownload(input: DequeueChapterDownloadInput): CompletableFuture<DequeueChapterDownloadPayload?> {
val (clientMutationId, chapter) = input val (clientMutationId, chapter) = input
return future { return future {
asDataFetcherResult {
DownloadManager.dequeue(DownloadManager.EnqueueInput(listOf(chapter))) DownloadManager.dequeue(DownloadManager.EnqueueInput(listOf(chapter)))
DequeueChapterDownloadPayload( DequeueChapterDownloadPayload(
@@ -217,7 +203,6 @@ class DownloadMutation {
) )
} }
} }
}
data class StartDownloaderInput( data class StartDownloaderInput(
val clientMutationId: String? = null, val clientMutationId: String? = null,
@@ -229,9 +214,8 @@ class DownloadMutation {
) )
@RequireAuth @RequireAuth
fun startDownloader(input: StartDownloaderInput): CompletableFuture<DataFetcherResult<StartDownloaderPayload>> = fun startDownloader(input: StartDownloaderInput): CompletableFuture<StartDownloaderPayload?> =
future { future {
asDataFetcherResult {
DownloadManager.start() DownloadManager.start()
StartDownloaderPayload( StartDownloaderPayload(
@@ -246,7 +230,6 @@ class DownloadMutation {
}, },
) )
} }
}
data class StopDownloaderInput( data class StopDownloaderInput(
val clientMutationId: String? = null, val clientMutationId: String? = null,
@@ -258,9 +241,8 @@ class DownloadMutation {
) )
@RequireAuth @RequireAuth
fun stopDownloader(input: StopDownloaderInput): CompletableFuture<DataFetcherResult<StopDownloaderPayload>> = fun stopDownloader(input: StopDownloaderInput): CompletableFuture<StopDownloaderPayload?> =
future { future {
asDataFetcherResult {
DownloadManager.stop() DownloadManager.stop()
StopDownloaderPayload( StopDownloaderPayload(
@@ -275,7 +257,6 @@ class DownloadMutation {
}, },
) )
} }
}
data class ClearDownloaderInput( data class ClearDownloaderInput(
val clientMutationId: String? = null, val clientMutationId: String? = null,
@@ -287,9 +268,8 @@ class DownloadMutation {
) )
@RequireAuth @RequireAuth
fun clearDownloader(input: ClearDownloaderInput): CompletableFuture<DataFetcherResult<ClearDownloaderPayload>> = fun clearDownloader(input: ClearDownloaderInput): CompletableFuture<ClearDownloaderPayload?> =
future { future {
asDataFetcherResult {
DownloadManager.clear() DownloadManager.clear()
ClearDownloaderPayload( ClearDownloaderPayload(
@@ -304,7 +284,6 @@ class DownloadMutation {
}, },
) )
} }
}
data class ReorderChapterDownloadInput( data class ReorderChapterDownloadInput(
val clientMutationId: String? = null, val clientMutationId: String? = null,
@@ -318,11 +297,10 @@ class DownloadMutation {
) )
@RequireAuth @RequireAuth
fun reorderChapterDownload(input: ReorderChapterDownloadInput): CompletableFuture<DataFetcherResult<ReorderChapterDownloadPayload>> { fun reorderChapterDownload(input: ReorderChapterDownloadInput): CompletableFuture<ReorderChapterDownloadPayload?> {
val (clientMutationId, chapter, to) = input val (clientMutationId, chapter, to) = input
return future { return future {
asDataFetcherResult {
DownloadManager.reorder(chapter, to) DownloadManager.reorder(chapter, to)
ReorderChapterDownloadPayload( ReorderChapterDownloadPayload(
@@ -338,5 +316,4 @@ class DownloadMutation {
) )
} }
} }
}
} }

View File

@@ -1,3 +1,5 @@
@file:Suppress("RedundantNullableReturnType", "unused")
package suwayomi.tachidesk.graphql.mutations package suwayomi.tachidesk.graphql.mutations
import eu.kanade.tachiyomi.source.local.LocalSource import eu.kanade.tachiyomi.source.local.LocalSource
@@ -5,7 +7,6 @@ import graphql.execution.DataFetcherResult
import io.javalin.http.UploadedFile import io.javalin.http.UploadedFile
import org.jetbrains.exposed.sql.selectAll import org.jetbrains.exposed.sql.selectAll
import org.jetbrains.exposed.sql.transactions.transaction import org.jetbrains.exposed.sql.transactions.transaction
import suwayomi.tachidesk.graphql.asDataFetcherResult
import suwayomi.tachidesk.graphql.directives.RequireAuth import suwayomi.tachidesk.graphql.directives.RequireAuth
import suwayomi.tachidesk.graphql.types.ExtensionType import suwayomi.tachidesk.graphql.types.ExtensionType
import suwayomi.tachidesk.manga.impl.extension.Extension import suwayomi.tachidesk.manga.impl.extension.Extension
@@ -75,11 +76,10 @@ class ExtensionMutation {
} }
@RequireAuth @RequireAuth
fun updateExtension(input: UpdateExtensionInput): CompletableFuture<DataFetcherResult<UpdateExtensionPayload>> { fun updateExtension(input: UpdateExtensionInput): CompletableFuture<UpdateExtensionPayload?> {
val (clientMutationId, id, patch) = input val (clientMutationId, id, patch) = input
return future { return future {
asDataFetcherResult {
updateExtensions(listOf(id), patch) updateExtensions(listOf(id), patch)
val extension = val extension =
@@ -97,14 +97,12 @@ class ExtensionMutation {
) )
} }
} }
}
@RequireAuth @RequireAuth
fun updateExtensions(input: UpdateExtensionsInput): CompletableFuture<DataFetcherResult<UpdateExtensionsPayload>> { fun updateExtensions(input: UpdateExtensionsInput): CompletableFuture<UpdateExtensionsPayload?> {
val (clientMutationId, ids, patch) = input val (clientMutationId, ids, patch) = input
return future { return future {
asDataFetcherResult {
updateExtensions(ids, patch) updateExtensions(ids, patch)
val extensions = val extensions =
@@ -121,7 +119,6 @@ class ExtensionMutation {
) )
} }
} }
}
data class FetchExtensionsInput( data class FetchExtensionsInput(
val clientMutationId: String? = null, val clientMutationId: String? = null,
@@ -133,11 +130,10 @@ class ExtensionMutation {
) )
@RequireAuth @RequireAuth
fun fetchExtensions(input: FetchExtensionsInput): CompletableFuture<DataFetcherResult<FetchExtensionsPayload>> { fun fetchExtensions(input: FetchExtensionsInput): CompletableFuture<FetchExtensionsPayload?> {
val (clientMutationId) = input val (clientMutationId) = input
return future { return future {
asDataFetcherResult {
ExtensionsList.fetchExtensions() ExtensionsList.fetchExtensions()
val extensions = val extensions =
@@ -154,7 +150,6 @@ class ExtensionMutation {
) )
} }
} }
}
data class InstallExternalExtensionInput( data class InstallExternalExtensionInput(
val clientMutationId: String? = null, val clientMutationId: String? = null,
@@ -167,13 +162,10 @@ class ExtensionMutation {
) )
@RequireAuth @RequireAuth
fun installExternalExtension( fun installExternalExtension(input: InstallExternalExtensionInput): CompletableFuture<InstallExternalExtensionPayload?> {
input: InstallExternalExtensionInput,
): CompletableFuture<DataFetcherResult<InstallExternalExtensionPayload>> {
val (clientMutationId, extensionFile) = input val (clientMutationId, extensionFile) = input
return future { return future {
asDataFetcherResult {
Extension.installExternalExtension(extensionFile.content(), extensionFile.filename()) Extension.installExternalExtension(extensionFile.content(), extensionFile.filename())
val dbExtension = val dbExtension =
@@ -185,5 +177,4 @@ class ExtensionMutation {
) )
} }
} }
}
} }

View File

@@ -1,3 +1,5 @@
@file:Suppress("RedundantNullableReturnType", "unused")
package suwayomi.tachidesk.graphql.mutations package suwayomi.tachidesk.graphql.mutations
import suwayomi.tachidesk.graphql.directives.RequireAuth import suwayomi.tachidesk.graphql.directives.RequireAuth

View File

@@ -1,9 +1,10 @@
@file:Suppress("RedundantNullableReturnType", "unused")
package suwayomi.tachidesk.graphql.mutations package suwayomi.tachidesk.graphql.mutations
import graphql.execution.DataFetcherResult import graphql.execution.DataFetcherResult
import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.first
import kotlinx.coroutines.withTimeout import kotlinx.coroutines.withTimeout
import suwayomi.tachidesk.graphql.asDataFetcherResult
import suwayomi.tachidesk.graphql.directives.RequireAuth import suwayomi.tachidesk.graphql.directives.RequireAuth
import suwayomi.tachidesk.graphql.types.UpdateState.DOWNLOADING import suwayomi.tachidesk.graphql.types.UpdateState.DOWNLOADING
import suwayomi.tachidesk.graphql.types.UpdateState.ERROR import suwayomi.tachidesk.graphql.types.UpdateState.ERROR
@@ -26,9 +27,8 @@ class InfoMutation {
) )
@RequireAuth @RequireAuth
fun updateWebUI(input: WebUIUpdateInput): CompletableFuture<DataFetcherResult<WebUIUpdatePayload>> { fun updateWebUI(input: WebUIUpdateInput): CompletableFuture<WebUIUpdatePayload?> {
return future { return future {
asDataFetcherResult {
withTimeout(30.seconds) { withTimeout(30.seconds) {
if (WebInterfaceManager.status.value.state === DOWNLOADING) { if (WebInterfaceManager.status.value.state === DOWNLOADING) {
return@withTimeout WebUIUpdatePayload(input.clientMutationId, WebInterfaceManager.status.value) return@withTimeout WebUIUpdatePayload(input.clientMutationId, WebInterfaceManager.status.value)
@@ -59,12 +59,10 @@ class InfoMutation {
} }
} }
} }
}
@RequireAuth @RequireAuth
fun resetWebUIUpdateStatus(): CompletableFuture<DataFetcherResult<WebUIUpdateStatus>> = fun resetWebUIUpdateStatus(): CompletableFuture<WebUIUpdateStatus?> =
future { future {
asDataFetcherResult {
withTimeout(30.seconds) { withTimeout(30.seconds) {
val isUpdateFinished = WebInterfaceManager.status.value.state != DOWNLOADING val isUpdateFinished = WebInterfaceManager.status.value.state != DOWNLOADING
if (!isUpdateFinished) { if (!isUpdateFinished) {
@@ -76,5 +74,4 @@ class InfoMutation {
WebInterfaceManager.status.first { it.state == IDLE } WebInterfaceManager.status.first { it.state == IDLE }
} }
} }
}
} }

View File

@@ -1,10 +1,11 @@
@file:Suppress("RedundantNullableReturnType", "unused")
package suwayomi.tachidesk.graphql.mutations package suwayomi.tachidesk.graphql.mutations
import graphql.execution.DataFetcherResult import graphql.execution.DataFetcherResult
import org.jetbrains.exposed.sql.selectAll import org.jetbrains.exposed.sql.selectAll
import org.jetbrains.exposed.sql.transactions.transaction import org.jetbrains.exposed.sql.transactions.transaction
import org.jetbrains.exposed.sql.update import org.jetbrains.exposed.sql.update
import suwayomi.tachidesk.graphql.asDataFetcherResult
import suwayomi.tachidesk.graphql.directives.RequireAuth import suwayomi.tachidesk.graphql.directives.RequireAuth
import suwayomi.tachidesk.graphql.types.ChapterType import suwayomi.tachidesk.graphql.types.ChapterType
import suwayomi.tachidesk.graphql.types.KoSyncConnectPayload import suwayomi.tachidesk.graphql.types.KoSyncConnectPayload
@@ -62,9 +63,8 @@ class KoreaderSyncMutation {
) )
@RequireAuth @RequireAuth
fun pushKoSyncProgress(input: PushKoSyncProgressInput): CompletableFuture<DataFetcherResult<PushKoSyncProgressPayload>> = fun pushKoSyncProgress(input: PushKoSyncProgressInput): CompletableFuture<PushKoSyncProgressPayload?> =
future { future {
asDataFetcherResult {
KoreaderSyncService.pushProgress(input.chapterId) KoreaderSyncService.pushProgress(input.chapterId)
val chapter = val chapter =
@@ -82,7 +82,6 @@ class KoreaderSyncMutation {
chapter = chapter, chapter = chapter,
) )
} }
}
data class PullKoSyncProgressInput( data class PullKoSyncProgressInput(
val clientMutationId: String? = null, val clientMutationId: String? = null,
@@ -96,9 +95,8 @@ class KoreaderSyncMutation {
) )
@RequireAuth @RequireAuth
fun pullKoSyncProgress(input: PullKoSyncProgressInput): CompletableFuture<DataFetcherResult<PullKoSyncProgressPayload>> = fun pullKoSyncProgress(input: PullKoSyncProgressInput): CompletableFuture<PullKoSyncProgressPayload?> =
future { future {
asDataFetcherResult {
val syncResult = KoreaderSyncService.checkAndPullProgress(input.chapterId) val syncResult = KoreaderSyncService.checkAndPullProgress(input.chapterId)
var syncConflictInfo: SyncConflictInfoType? = null var syncConflictInfo: SyncConflictInfoType? = null
@@ -136,5 +134,4 @@ class KoreaderSyncMutation {
syncConflict = syncConflictInfo, syncConflict = syncConflictInfo,
) )
} }
}
} }

View File

@@ -1,6 +1,7 @@
@file:Suppress("RedundantNullableReturnType", "unused")
package suwayomi.tachidesk.graphql.mutations package suwayomi.tachidesk.graphql.mutations
import graphql.execution.DataFetcherResult
import org.jetbrains.exposed.sql.LikePattern import org.jetbrains.exposed.sql.LikePattern
import org.jetbrains.exposed.sql.Op import org.jetbrains.exposed.sql.Op
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
@@ -12,7 +13,6 @@ import org.jetbrains.exposed.sql.or
import org.jetbrains.exposed.sql.selectAll import org.jetbrains.exposed.sql.selectAll
import org.jetbrains.exposed.sql.transactions.transaction import org.jetbrains.exposed.sql.transactions.transaction
import org.jetbrains.exposed.sql.update import org.jetbrains.exposed.sql.update
import suwayomi.tachidesk.graphql.asDataFetcherResult
import suwayomi.tachidesk.graphql.directives.RequireAuth import suwayomi.tachidesk.graphql.directives.RequireAuth
import suwayomi.tachidesk.graphql.types.MangaMetaType import suwayomi.tachidesk.graphql.types.MangaMetaType
import suwayomi.tachidesk.graphql.types.MangaType import suwayomi.tachidesk.graphql.types.MangaType
@@ -98,11 +98,10 @@ class MangaMutation {
} }
@RequireAuth @RequireAuth
fun updateManga(input: UpdateMangaInput): CompletableFuture<DataFetcherResult<UpdateMangaPayload>> { fun updateManga(input: UpdateMangaInput): CompletableFuture<UpdateMangaPayload?> {
val (clientMutationId, id, patch) = input val (clientMutationId, id, patch) = input
return future { return future {
asDataFetcherResult {
updateMangas(listOf(id), patch) updateMangas(listOf(id), patch)
val manga = val manga =
@@ -116,14 +115,12 @@ class MangaMutation {
) )
} }
} }
}
@RequireAuth @RequireAuth
fun updateMangas(input: UpdateMangasInput): CompletableFuture<DataFetcherResult<UpdateMangasPayload>> { fun updateMangas(input: UpdateMangasInput): CompletableFuture<UpdateMangasPayload?> {
val (clientMutationId, ids, patch) = input val (clientMutationId, ids, patch) = input
return future { return future {
asDataFetcherResult {
updateMangas(ids, patch) updateMangas(ids, patch)
val mangas = val mangas =
@@ -137,7 +134,6 @@ class MangaMutation {
) )
} }
} }
}
data class FetchMangaInput( data class FetchMangaInput(
val clientMutationId: String? = null, val clientMutationId: String? = null,
@@ -150,11 +146,10 @@ class MangaMutation {
) )
@RequireAuth @RequireAuth
fun fetchManga(input: FetchMangaInput): CompletableFuture<DataFetcherResult<FetchMangaPayload>> { fun fetchManga(input: FetchMangaInput): CompletableFuture<FetchMangaPayload?> {
val (clientMutationId, id) = input val (clientMutationId, id) = input
return future { return future {
asDataFetcherResult {
Manga.fetchManga(id) Manga.fetchManga(id)
val manga = val manga =
@@ -167,7 +162,6 @@ class MangaMutation {
) )
} }
} }
}
data class SetMangaMetaInput( data class SetMangaMetaInput(
val clientMutationId: String? = null, val clientMutationId: String? = null,
@@ -180,14 +174,12 @@ class MangaMutation {
) )
@RequireAuth @RequireAuth
fun setMangaMeta(input: SetMangaMetaInput): DataFetcherResult<SetMangaMetaPayload> { fun setMangaMeta(input: SetMangaMetaInput): SetMangaMetaPayload? {
val (clientMutationId, meta) = input val (clientMutationId, meta) = input
return asDataFetcherResult {
Manga.modifyMangaMeta(meta.mangaId, meta.key, meta.value) Manga.modifyMangaMeta(meta.mangaId, meta.key, meta.value)
SetMangaMetaPayload(clientMutationId, meta) return SetMangaMetaPayload(clientMutationId, meta)
}
} }
data class DeleteMangaMetaInput( data class DeleteMangaMetaInput(
@@ -203,10 +195,9 @@ class MangaMutation {
) )
@RequireAuth @RequireAuth
fun deleteMangaMeta(input: DeleteMangaMetaInput): DataFetcherResult<DeleteMangaMetaPayload> { fun deleteMangaMeta(input: DeleteMangaMetaInput): DeleteMangaMetaPayload? {
val (clientMutationId, mangaId, key) = input val (clientMutationId, mangaId, key) = input
return asDataFetcherResult {
val (meta, manga) = val (meta, manga) =
transaction { transaction {
val meta = val meta =
@@ -229,8 +220,7 @@ class MangaMutation {
} to manga } to manga
} }
DeleteMangaMetaPayload(clientMutationId, meta, manga) return DeleteMangaMetaPayload(clientMutationId, meta, manga)
}
} }
data class SetMangaMetasItem( data class SetMangaMetasItem(
@@ -250,10 +240,9 @@ class MangaMutation {
) )
@RequireAuth @RequireAuth
fun setMangaMetas(input: SetMangaMetasInput): DataFetcherResult<SetMangaMetasPayload> { fun setMangaMetas(input: SetMangaMetasInput): SetMangaMetasPayload? {
val (clientMutationId, items) = input val (clientMutationId, items) = input
return asDataFetcherResult {
val metaByMangaId = val metaByMangaId =
items items
.flatMap { item -> .flatMap { item ->
@@ -285,8 +274,7 @@ class MangaMutation {
updatedMetas to mangas updatedMetas to mangas
} }
SetMangaMetasPayload(clientMutationId, updatedMetas, mangas) return SetMangaMetasPayload(clientMutationId, updatedMetas, mangas)
}
} }
data class DeleteMangaMetasItem( data class DeleteMangaMetasItem(
@@ -307,10 +295,9 @@ class MangaMutation {
) )
@RequireAuth @RequireAuth
fun deleteMangaMetas(input: DeleteMangaMetasInput): DataFetcherResult<DeleteMangaMetasPayload> { fun deleteMangaMetas(input: DeleteMangaMetasInput): DeleteMangaMetasPayload? {
val (clientMutationId, items) = input val (clientMutationId, items) = input
return asDataFetcherResult {
items.forEach { item -> items.forEach { item ->
require(!item.keys.isNullOrEmpty() || !item.prefixes.isNullOrEmpty()) { require(!item.keys.isNullOrEmpty() || !item.prefixes.isNullOrEmpty()) {
"Either 'keys' or 'prefixes' must be provided for each item" "Either 'keys' or 'prefixes' must be provided for each item"
@@ -363,7 +350,6 @@ class MangaMutation {
.distinctBy { it.id } .distinctBy { it.id }
} }
DeleteMangaMetasPayload(clientMutationId, allDeletedMetas, mangas) return DeleteMangaMetasPayload(clientMutationId, allDeletedMetas, mangas)
}
} }
} }

View File

@@ -1,3 +1,5 @@
@file:Suppress("RedundantNullableReturnType", "unused")
package suwayomi.tachidesk.graphql.mutations package suwayomi.tachidesk.graphql.mutations
import graphql.execution.DataFetcherResult import graphql.execution.DataFetcherResult
@@ -12,7 +14,6 @@ import org.jetbrains.exposed.sql.selectAll
import org.jetbrains.exposed.sql.transactions.transaction import org.jetbrains.exposed.sql.transactions.transaction
import suwayomi.tachidesk.global.impl.GlobalMeta import suwayomi.tachidesk.global.impl.GlobalMeta
import suwayomi.tachidesk.global.model.table.GlobalMetaTable import suwayomi.tachidesk.global.model.table.GlobalMetaTable
import suwayomi.tachidesk.graphql.asDataFetcherResult
import suwayomi.tachidesk.graphql.directives.RequireAuth import suwayomi.tachidesk.graphql.directives.RequireAuth
import suwayomi.tachidesk.graphql.types.GlobalMetaType import suwayomi.tachidesk.graphql.types.GlobalMetaType
import suwayomi.tachidesk.graphql.types.MetaInput import suwayomi.tachidesk.graphql.types.MetaInput
@@ -29,14 +30,12 @@ class MetaMutation {
) )
@RequireAuth @RequireAuth
fun setGlobalMeta(input: SetGlobalMetaInput): DataFetcherResult<SetGlobalMetaPayload> { fun setGlobalMeta(input: SetGlobalMetaInput): SetGlobalMetaPayload? {
val (clientMutationId, meta) = input val (clientMutationId, meta) = input
return asDataFetcherResult {
GlobalMeta.modifyMeta(meta.key, meta.value) GlobalMeta.modifyMeta(meta.key, meta.value)
SetGlobalMetaPayload(clientMutationId, meta) return SetGlobalMetaPayload(clientMutationId, meta)
}
} }
data class DeleteGlobalMetaInput( data class DeleteGlobalMetaInput(
@@ -50,10 +49,9 @@ class MetaMutation {
) )
@RequireAuth @RequireAuth
fun deleteGlobalMeta(input: DeleteGlobalMetaInput): DataFetcherResult<DeleteGlobalMetaPayload> { fun deleteGlobalMeta(input: DeleteGlobalMetaInput): DeleteGlobalMetaPayload? {
val (clientMutationId, key) = input val (clientMutationId, key) = input
return asDataFetcherResult {
val meta = val meta =
transaction { transaction {
val meta = val meta =
@@ -71,8 +69,7 @@ class MetaMutation {
} }
} }
DeleteGlobalMetaPayload(clientMutationId, meta) return DeleteGlobalMetaPayload(clientMutationId, meta)
}
} }
data class SetGlobalMetasInput( data class SetGlobalMetasInput(
@@ -86,10 +83,9 @@ class MetaMutation {
) )
@RequireAuth @RequireAuth
fun setGlobalMetas(input: SetGlobalMetasInput): DataFetcherResult<SetGlobalMetasPayload> { fun setGlobalMetas(input: SetGlobalMetasInput): SetGlobalMetasPayload? {
val (clientMutationId, metas) = input val (clientMutationId, metas) = input
return asDataFetcherResult {
val metaMap = metas.associate { it.key to it.value } val metaMap = metas.associate { it.key to it.value }
GlobalMeta.modifyMetas(metaMap) GlobalMeta.modifyMetas(metaMap)
@@ -101,8 +97,7 @@ class MetaMutation {
.map { GlobalMetaType(it) } .map { GlobalMetaType(it) }
} }
SetGlobalMetasPayload(clientMutationId, updatedMetas) return SetGlobalMetasPayload(clientMutationId, updatedMetas)
}
} }
data class DeleteGlobalMetasInput( data class DeleteGlobalMetasInput(
@@ -117,10 +112,9 @@ class MetaMutation {
) )
@RequireAuth @RequireAuth
fun deleteGlobalMetas(input: DeleteGlobalMetasInput): DataFetcherResult<DeleteGlobalMetasPayload> { fun deleteGlobalMetas(input: DeleteGlobalMetasInput): DeleteGlobalMetasPayload? {
val (clientMutationId, keys, prefixes) = input val (clientMutationId, keys, prefixes) = input
return asDataFetcherResult {
require(!keys.isNullOrEmpty() || !prefixes.isNullOrEmpty()) { require(!keys.isNullOrEmpty() || !prefixes.isNullOrEmpty()) {
"Either 'keys' or 'prefixes' must be provided" "Either 'keys' or 'prefixes' must be provided"
} }
@@ -153,7 +147,6 @@ class MetaMutation {
metas metas
} }
DeleteGlobalMetasPayload(clientMutationId, metas) return DeleteGlobalMetasPayload(clientMutationId, metas)
}
} }
} }

View File

@@ -1,3 +1,5 @@
@file:Suppress("RedundantNullableReturnType", "unused")
package suwayomi.tachidesk.graphql.mutations package suwayomi.tachidesk.graphql.mutations
import com.expediagroup.graphql.generator.annotations.GraphQLIgnore import com.expediagroup.graphql.generator.annotations.GraphQLIgnore

View File

@@ -1,3 +1,5 @@
@file:Suppress("RedundantNullableReturnType", "unused")
package suwayomi.tachidesk.graphql.mutations package suwayomi.tachidesk.graphql.mutations
import androidx.preference.CheckBoxPreference import androidx.preference.CheckBoxPreference
@@ -5,7 +7,6 @@ import androidx.preference.EditTextPreference
import androidx.preference.ListPreference import androidx.preference.ListPreference
import androidx.preference.MultiSelectListPreference import androidx.preference.MultiSelectListPreference
import androidx.preference.SwitchPreferenceCompat import androidx.preference.SwitchPreferenceCompat
import graphql.execution.DataFetcherResult
import org.jetbrains.exposed.sql.LikePattern import org.jetbrains.exposed.sql.LikePattern
import org.jetbrains.exposed.sql.Op import org.jetbrains.exposed.sql.Op
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
@@ -16,7 +17,6 @@ import org.jetbrains.exposed.sql.deleteWhere
import org.jetbrains.exposed.sql.or import org.jetbrains.exposed.sql.or
import org.jetbrains.exposed.sql.selectAll import org.jetbrains.exposed.sql.selectAll
import org.jetbrains.exposed.sql.transactions.transaction import org.jetbrains.exposed.sql.transactions.transaction
import suwayomi.tachidesk.graphql.asDataFetcherResult
import suwayomi.tachidesk.graphql.directives.RequireAuth import suwayomi.tachidesk.graphql.directives.RequireAuth
import suwayomi.tachidesk.graphql.types.FilterChange import suwayomi.tachidesk.graphql.types.FilterChange
import suwayomi.tachidesk.graphql.types.MangaType import suwayomi.tachidesk.graphql.types.MangaType
@@ -47,14 +47,12 @@ class SourceMutation {
) )
@RequireAuth @RequireAuth
fun setSourceMeta(input: SetSourceMetaInput): DataFetcherResult<SetSourceMetaPayload> { fun setSourceMeta(input: SetSourceMetaInput): SetSourceMetaPayload? {
val (clientMutationId, meta) = input val (clientMutationId, meta) = input
return asDataFetcherResult {
Source.modifyMeta(meta.sourceId, meta.key, meta.value) Source.modifyMeta(meta.sourceId, meta.key, meta.value)
SetSourceMetaPayload(clientMutationId, meta) return SetSourceMetaPayload(clientMutationId, meta)
}
} }
data class DeleteSourceMetaInput( data class DeleteSourceMetaInput(
@@ -70,10 +68,9 @@ class SourceMutation {
) )
@RequireAuth @RequireAuth
fun deleteSourceMeta(input: DeleteSourceMetaInput): DataFetcherResult<DeleteSourceMetaPayload> { fun deleteSourceMeta(input: DeleteSourceMetaInput): DeleteSourceMetaPayload? {
val (clientMutationId, sourceId, key) = input val (clientMutationId, sourceId, key) = input
return asDataFetcherResult {
val (meta, source) = val (meta, source) =
transaction { transaction {
val meta = val meta =
@@ -100,8 +97,7 @@ class SourceMutation {
} to source } to source
} }
DeleteSourceMetaPayload(clientMutationId, meta, source) return DeleteSourceMetaPayload(clientMutationId, meta, source)
}
} }
data class SetSourceMetasItem( data class SetSourceMetasItem(
@@ -121,10 +117,9 @@ class SourceMutation {
) )
@RequireAuth @RequireAuth
fun setSourceMetas(input: SetSourceMetasInput): DataFetcherResult<SetSourceMetasPayload> { fun setSourceMetas(input: SetSourceMetasInput): SetSourceMetasPayload? {
val (clientMutationId, items) = input val (clientMutationId, items) = input
return asDataFetcherResult {
val metaBySourceId = val metaBySourceId =
items items
.flatMap { item -> .flatMap { item ->
@@ -156,8 +151,7 @@ class SourceMutation {
updatedMetas to sources updatedMetas to sources
} }
SetSourceMetasPayload(clientMutationId, updatedMetas, sources) return SetSourceMetasPayload(clientMutationId, updatedMetas, sources)
}
} }
data class DeleteSourceMetasItem( data class DeleteSourceMetasItem(
@@ -178,10 +172,9 @@ class SourceMutation {
) )
@RequireAuth @RequireAuth
fun deleteSourceMetas(input: DeleteSourceMetasInput): DataFetcherResult<DeleteSourceMetasPayload> { fun deleteSourceMetas(input: DeleteSourceMetasInput): DeleteSourceMetasPayload? {
val (clientMutationId, items) = input val (clientMutationId, items) = input
return asDataFetcherResult {
items.forEach { item -> items.forEach { item ->
require(!item.keys.isNullOrEmpty() || !item.prefixes.isNullOrEmpty()) { require(!item.keys.isNullOrEmpty() || !item.prefixes.isNullOrEmpty()) {
"Either 'keys' or 'prefixes' must be provided for each item" "Either 'keys' or 'prefixes' must be provided for each item"
@@ -234,8 +227,7 @@ class SourceMutation {
.distinctBy { it.id } .distinctBy { it.id }
} }
DeleteSourceMetasPayload(clientMutationId, allDeletedMetas, sources) return DeleteSourceMetasPayload(clientMutationId, allDeletedMetas, sources)
}
} }
enum class FetchSourceMangaType { enum class FetchSourceMangaType {
@@ -260,11 +252,10 @@ class SourceMutation {
) )
@RequireAuth @RequireAuth
fun fetchSourceManga(input: FetchSourceMangaInput): CompletableFuture<DataFetcherResult<FetchSourceMangaPayload>> { fun fetchSourceManga(input: FetchSourceMangaInput): CompletableFuture<FetchSourceMangaPayload?> {
val (clientMutationId, sourceId, type, page, query, filters) = input val (clientMutationId, sourceId, type, page, query, filters) = input
return future { return future {
asDataFetcherResult {
val source = GetCatalogueSource.getCatalogueSourceOrNull(sourceId)!! val source = GetCatalogueSource.getCatalogueSourceOrNull(sourceId)!!
val mangasPage = val mangasPage =
when (type) { when (type) {
@@ -305,7 +296,6 @@ class SourceMutation {
) )
} }
} }
}
data class SourcePreferenceChange( data class SourcePreferenceChange(
val position: Int, val position: Int,
@@ -329,10 +319,9 @@ class SourceMutation {
) )
@RequireAuth @RequireAuth
fun updateSourcePreference(input: UpdateSourcePreferenceInput): DataFetcherResult<UpdateSourcePreferencePayload> { fun updateSourcePreference(input: UpdateSourcePreferenceInput): UpdateSourcePreferencePayload? {
val (clientMutationId, sourceId, change) = input val (clientMutationId, sourceId, change) = input
return asDataFetcherResult {
Source.setSourcePreference(sourceId, change.position, "") { preference -> Source.setSourcePreference(sourceId, change.position, "") { preference ->
when (preference) { when (preference) {
is SwitchPreferenceCompat -> change.switchState is SwitchPreferenceCompat -> change.switchState
@@ -344,7 +333,7 @@ class SourceMutation {
} ?: throw Exception("Expected change to ${preference::class.simpleName}") } ?: throw Exception("Expected change to ${preference::class.simpleName}")
} }
UpdateSourcePreferencePayload( return UpdateSourcePreferencePayload(
clientMutationId = clientMutationId, clientMutationId = clientMutationId,
preferences = Source.getSourcePreferencesRaw(sourceId).map { preferenceOf(it) }, preferences = Source.getSourcePreferencesRaw(sourceId).map { preferenceOf(it) },
source = source =
@@ -353,5 +342,4 @@ class SourceMutation {
}, },
) )
} }
}
} }

View File

@@ -1,3 +1,5 @@
@file:Suppress("RedundantNullableReturnType", "unused")
package suwayomi.tachidesk.graphql.mutations package suwayomi.tachidesk.graphql.mutations
import com.expediagroup.graphql.generator.annotations.GraphQLDeprecated import com.expediagroup.graphql.generator.annotations.GraphQLDeprecated
@@ -6,7 +8,6 @@ import graphql.execution.DataFetcherResult
import org.jetbrains.exposed.sql.and import org.jetbrains.exposed.sql.and
import org.jetbrains.exposed.sql.selectAll import org.jetbrains.exposed.sql.selectAll
import org.jetbrains.exposed.sql.transactions.transaction import org.jetbrains.exposed.sql.transactions.transaction
import suwayomi.tachidesk.graphql.asDataFetcherResult
import suwayomi.tachidesk.graphql.directives.RequireAuth import suwayomi.tachidesk.graphql.directives.RequireAuth
import suwayomi.tachidesk.graphql.types.TrackRecordType import suwayomi.tachidesk.graphql.types.TrackRecordType
import suwayomi.tachidesk.graphql.types.TrackerType import suwayomi.tachidesk.graphql.types.TrackerType
@@ -222,11 +223,10 @@ class TrackMutation {
) )
@RequireAuth @RequireAuth
fun trackProgress(input: TrackProgressInput): CompletableFuture<DataFetcherResult<TrackProgressPayload>> { fun trackProgress(input: TrackProgressInput): CompletableFuture<TrackProgressPayload?> {
val (clientMutationId, mangaId) = input val (clientMutationId, mangaId) = input
return future { return future {
asDataFetcherResult {
Track.trackChapter(mangaId) Track.trackChapter(mangaId)
val trackRecords = val trackRecords =
transaction { transaction {
@@ -241,7 +241,6 @@ class TrackMutation {
) )
} }
} }
}
data class UpdateTrackInput( data class UpdateTrackInput(
val clientMutationId: String? = null, val clientMutationId: String? = null,

View File

@@ -1,9 +1,10 @@
@file:Suppress("RedundantNullableReturnType", "unused")
package suwayomi.tachidesk.graphql.mutations package suwayomi.tachidesk.graphql.mutations
import graphql.execution.DataFetcherResult import graphql.execution.DataFetcherResult
import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.first
import kotlinx.coroutines.withTimeout import kotlinx.coroutines.withTimeout
import suwayomi.tachidesk.graphql.asDataFetcherResult
import suwayomi.tachidesk.graphql.directives.RequireAuth import suwayomi.tachidesk.graphql.directives.RequireAuth
import suwayomi.tachidesk.graphql.types.LibraryUpdateStatus import suwayomi.tachidesk.graphql.types.LibraryUpdateStatus
import suwayomi.tachidesk.graphql.types.UpdateStatus import suwayomi.tachidesk.graphql.types.UpdateStatus
@@ -28,7 +29,7 @@ class UpdateMutation {
) )
@RequireAuth @RequireAuth
fun updateLibrary(input: UpdateLibraryInput): CompletableFuture<DataFetcherResult<UpdateLibraryPayload>> { fun updateLibrary(input: UpdateLibraryInput): CompletableFuture<UpdateLibraryPayload?> {
updater.addCategoriesToUpdateQueue( updater.addCategoriesToUpdateQueue(
Category.getCategoryList().filter { input.categories?.contains(it.id) ?: true }, Category.getCategoryList().filter { input.categories?.contains(it.id) ?: true },
clear = true, clear = true,
@@ -36,7 +37,6 @@ class UpdateMutation {
) )
return future { return future {
asDataFetcherResult {
UpdateLibraryPayload( UpdateLibraryPayload(
input.clientMutationId, input.clientMutationId,
updateStatus = updateStatus =
@@ -48,7 +48,6 @@ class UpdateMutation {
) )
} }
} }
}
data class UpdateLibraryMangaInput( data class UpdateLibraryMangaInput(
val clientMutationId: String? = null, val clientMutationId: String? = null,
@@ -60,7 +59,7 @@ class UpdateMutation {
) )
@RequireAuth @RequireAuth
fun updateLibraryManga(input: UpdateLibraryMangaInput): CompletableFuture<DataFetcherResult<UpdateLibraryMangaPayload>> { fun updateLibraryManga(input: UpdateLibraryMangaInput): CompletableFuture<UpdateLibraryMangaPayload?> {
updateLibrary( updateLibrary(
UpdateLibraryInput( UpdateLibraryInput(
clientMutationId = input.clientMutationId, clientMutationId = input.clientMutationId,
@@ -69,7 +68,6 @@ class UpdateMutation {
) )
return future { return future {
asDataFetcherResult {
UpdateLibraryMangaPayload( UpdateLibraryMangaPayload(
input.clientMutationId, input.clientMutationId,
updateStatus = updateStatus =
@@ -79,7 +77,6 @@ class UpdateMutation {
) )
} }
} }
}
data class UpdateCategoryMangaInput( data class UpdateCategoryMangaInput(
val clientMutationId: String? = null, val clientMutationId: String? = null,
@@ -92,7 +89,7 @@ class UpdateMutation {
) )
@RequireAuth @RequireAuth
fun updateCategoryManga(input: UpdateCategoryMangaInput): CompletableFuture<DataFetcherResult<UpdateCategoryMangaPayload>> { fun updateCategoryManga(input: UpdateCategoryMangaInput): CompletableFuture<UpdateCategoryMangaPayload?> {
updateLibrary( updateLibrary(
UpdateLibraryInput( UpdateLibraryInput(
clientMutationId = input.clientMutationId, clientMutationId = input.clientMutationId,
@@ -101,7 +98,6 @@ class UpdateMutation {
) )
return future { return future {
asDataFetcherResult {
UpdateCategoryMangaPayload( UpdateCategoryMangaPayload(
input.clientMutationId, input.clientMutationId,
updateStatus = updateStatus =
@@ -111,7 +107,6 @@ class UpdateMutation {
) )
} }
} }
}
data class UpdateStopInput( data class UpdateStopInput(
val clientMutationId: String? = null, val clientMutationId: String? = null,

View File

@@ -1,3 +1,5 @@
@file:Suppress("RedundantNullableReturnType", "unused")
package suwayomi.tachidesk.graphql.mutations package suwayomi.tachidesk.graphql.mutations
import graphql.schema.DataFetchingEnvironment import graphql.schema.DataFetchingEnvironment