diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/mutations/ChapterMutation.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/mutations/ChapterMutation.kt index 9e75b86e4..808f41881 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/mutations/ChapterMutation.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/mutations/ChapterMutation.kt @@ -28,7 +28,7 @@ class ChapterMutation { val chapter: ChapterType ) data class UpdateChapterInput( - val clientMutationId: String?, + val clientMutationId: String? = null, val id: Int, val patch: UpdateChapterPatch ) @@ -38,7 +38,7 @@ class ChapterMutation { val chapters: List ) data class UpdateChaptersInput( - val clientMutationId: String?, + val clientMutationId: String? = null, val ids: List, val patch: UpdateChapterPatch ) diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/mutations/MangaMutation.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/mutations/MangaMutation.kt new file mode 100644 index 000000000..86612e149 --- /dev/null +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/mutations/MangaMutation.kt @@ -0,0 +1,84 @@ +package suwayomi.tachidesk.graphql.mutations + +import com.expediagroup.graphql.server.extensions.getValueFromDataLoader +import com.expediagroup.graphql.server.extensions.getValuesFromDataLoader +import graphql.schema.DataFetchingEnvironment +import org.jetbrains.exposed.sql.transactions.transaction +import org.jetbrains.exposed.sql.update +import suwayomi.tachidesk.graphql.types.MangaType +import suwayomi.tachidesk.manga.model.table.MangaTable +import java.util.concurrent.CompletableFuture + +/** + * TODO Mutations + * - Add to category + * - Remove from category + * - Check for updates + * - Download x(all = -1) chapters + * - Delete read/all downloaded chapters + * - Add/update meta + * - Delete meta + */ +class MangaMutation { + data class UpdateMangaPatch( + val inLibrary: Boolean? = null + ) + + data class UpdateMangaPayload( + val clientMutationId: String?, + val manga: MangaType + ) + data class UpdateMangaInput( + val clientMutationId: String? = null, + val id: Int, + val patch: UpdateMangaPatch + ) + + data class UpdateMangasPayload( + val clientMutationId: String?, + val mangas: List + ) + data class UpdateMangasInput( + val clientMutationId: String?? = null, + val ids: List, + val patch: UpdateMangaPatch + ) + + private fun updateMangas(ids: List, patch: UpdateMangaPatch) { + transaction { + if (patch.inLibrary != null) { + MangaTable.update({ MangaTable.id inList ids }) { update -> + patch.inLibrary.also { + update[inLibrary] = it + } + } + } + } + } + + fun updateManga(dataFetchingEnvironment: DataFetchingEnvironment, input: UpdateMangaInput): CompletableFuture { + val (clientMutationId, id, patch) = input + + updateMangas(listOf(id), patch) + + return dataFetchingEnvironment.getValueFromDataLoader("MangaDataLoader", id).thenApply { manga -> + UpdateMangaPayload( + clientMutationId = clientMutationId, + manga = manga + ) + } + } + + fun updateMangas(dataFetchingEnvironment: DataFetchingEnvironment, input: UpdateMangasInput): CompletableFuture { + val (clientMutationId, ids, patch) = input + + updateMangas(ids, patch) + + return dataFetchingEnvironment.getValuesFromDataLoader("MangaDataLoader", ids).thenApply { mangas -> + UpdateMangasPayload( + clientMutationId = clientMutationId, + mangas = mangas + ) + } + } +} diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/queries/MangaQuery.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/queries/MangaQuery.kt index b8375037b..b8bf61405 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/queries/MangaQuery.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/queries/MangaQuery.kt @@ -45,17 +45,6 @@ import java.util.concurrent.CompletableFuture /** * TODO Queries - * - * TODO Mutations - * - Favorite - * - Unfavorite - * - Add to category - * - Remove from category - * - Check for updates - * - Download x(all = -1) chapters - * - Delete read/all downloaded chapters - * - Add/update meta - * - Delete meta */ class MangaQuery { fun manga(dataFetchingEnvironment: DataFetchingEnvironment, id: Int): CompletableFuture { 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 dbefa8513..b8e1cb3eb 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/server/TachideskGraphQLSchema.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/server/TachideskGraphQLSchema.kt @@ -13,6 +13,7 @@ import com.expediagroup.graphql.generator.hooks.FlowSubscriptionSchemaGeneratorH import com.expediagroup.graphql.generator.toSchema import graphql.schema.GraphQLType import suwayomi.tachidesk.graphql.mutations.ChapterMutation +import suwayomi.tachidesk.graphql.mutations.MangaMutation import suwayomi.tachidesk.graphql.queries.CategoryQuery import suwayomi.tachidesk.graphql.queries.ChapterQuery import suwayomi.tachidesk.graphql.queries.ExtensionQuery @@ -49,7 +50,8 @@ val schema = toSchema( TopLevelObject(MetaQuery()) ), mutations = listOf( - TopLevelObject(ChapterMutation()) + TopLevelObject(ChapterMutation()), + TopLevelObject(MangaMutation()) ), subscriptions = listOf( TopLevelObject(DownloadSubscription())