Update to the v10 alpha due to nullability issues in v9

This commit is contained in:
Syer10
2026-05-09 15:29:34 -04:00
parent 193dd1ee84
commit b40447c4f9
26 changed files with 122 additions and 119 deletions

View File

@@ -12,7 +12,7 @@ dex2jar = "2.4.36"
polyglot = "25.0.3" polyglot = "25.0.3"
settings = "1.3.0" settings = "1.3.0"
twelvemonkeys = "3.13.1" twelvemonkeys = "3.13.1"
graphqlkotlin = "9.2.0" graphqlkotlin = "10.0.0-alpha.3"
xmlserialization = "0.91.3" xmlserialization = "0.91.3"
ktlint = "1.8.0" ktlint = "1.8.0"
koin = "4.2.1" koin = "4.2.1"

View File

@@ -43,7 +43,7 @@ dependencies {
// Javalin api // Javalin api
implementation(libs.bundles.javalin) implementation(libs.bundles.javalin)
implementation(libs.bundles.jackson) //implementation(libs.bundles.jackson)
// GraphQL // GraphQL
implementation(libs.graphql.kotlin.server) implementation(libs.graphql.kotlin.server)

View File

@@ -6,7 +6,7 @@ import io.github.oshai.kotlinlogging.KotlinLogging
val logger = KotlinLogging.logger { } val logger = KotlinLogging.logger { }
inline fun <T> asDataFetcherResult(block: () -> T): DataFetcherResult<T?> { inline fun <T : Any> asDataFetcherResult(block: () -> T): DataFetcherResult<T> {
val result = val result =
runCatching { runCatching {
block() block()
@@ -15,13 +15,13 @@ inline fun <T> asDataFetcherResult(block: () -> T): DataFetcherResult<T?> {
if (result.isFailure) { if (result.isFailure) {
logger.error(result.exceptionOrNull()) { "asDataFetcherResult: failed due to" } logger.error(result.exceptionOrNull()) { "asDataFetcherResult: failed due to" }
return DataFetcherResult return DataFetcherResult
.newResult<T?>() .newResult<T>()
.error(result.exceptionOrNull()?.toGraphQLError()) .error(result.exceptionOrNull()!!.toGraphQLError())
.build() .build()
} }
return DataFetcherResult return DataFetcherResult
.newResult<T?>() .newResult<T>()
.data(result.getOrNull()) .data(result.getOrNull())
.build() .build()
} }

View File

@@ -3,12 +3,8 @@ package suwayomi.tachidesk.graphql.cache
import org.dataloader.CacheMap import org.dataloader.CacheMap
import java.util.concurrent.CompletableFuture import java.util.concurrent.CompletableFuture
class CustomCacheMap<K, V> : CacheMap<K, V> { class CustomCacheMap<K : Any, V : Any> : CacheMap<K, V> {
private val cache: MutableMap<K, CompletableFuture<V>> private val cache: MutableMap<K, CompletableFuture<V>> = HashMap()
init {
cache = HashMap()
}
override fun containsKey(key: K): Boolean = cache.containsKey(key) override fun containsKey(key: K): Boolean = cache.containsKey(key)
@@ -18,12 +14,12 @@ class CustomCacheMap<K, V> : CacheMap<K, V> {
override fun getAll(): Collection<CompletableFuture<V>> = cache.values override fun getAll(): Collection<CompletableFuture<V>> = cache.values
override fun set( override fun putIfAbsentAtomically(
key: K, key: K,
value: CompletableFuture<V>, value: CompletableFuture<V>,
): CacheMap<K, V> { ): CompletableFuture<V> {
cache[key] = value cache[key] = value
return this return value
} }
override fun delete(key: K): CacheMap<K, V> { override fun delete(key: K): CacheMap<K, V> {
@@ -35,4 +31,8 @@ class CustomCacheMap<K, V> : CacheMap<K, V> {
cache.clear() cache.clear()
return this return this
} }
override fun size(): Int {
return cache.size
}
} }

View File

@@ -24,11 +24,11 @@ import suwayomi.tachidesk.graphql.types.ChapterType
import suwayomi.tachidesk.manga.model.table.ChapterTable import suwayomi.tachidesk.manga.model.table.ChapterTable
import suwayomi.tachidesk.server.JavalinSetup.future import suwayomi.tachidesk.server.JavalinSetup.future
class ChapterDataLoader : KotlinDataLoader<Int, ChapterType?> { class ChapterDataLoader : KotlinDataLoader<Int, ChapterType> {
override val dataLoaderName = "ChapterDataLoader" override val dataLoaderName = "ChapterDataLoader"
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, ChapterType?> = override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, ChapterType> =
DataLoaderFactory.newDataLoader<Int, ChapterType> { ids -> DataLoaderFactory.newDataLoader { ids ->
future { future {
transaction { transaction {
addLogger(Slf4jSqlDebugLogger) addLogger(Slf4jSqlDebugLogger)
@@ -48,7 +48,7 @@ class ChaptersForMangaDataLoader : KotlinDataLoader<Int, ChapterNodeList> {
override val dataLoaderName = "ChaptersForMangaDataLoader" override val dataLoaderName = "ChaptersForMangaDataLoader"
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, ChapterNodeList> = override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, ChapterNodeList> =
DataLoaderFactory.newDataLoader<Int, ChapterNodeList> { ids -> DataLoaderFactory.newDataLoader { ids ->
future { future {
transaction { transaction {
addLogger(Slf4jSqlDebugLogger) addLogger(Slf4jSqlDebugLogger)
@@ -68,7 +68,7 @@ class DownloadedChapterCountForMangaDataLoader : KotlinDataLoader<Int, Int> {
override val dataLoaderName = "DownloadedChapterCountForMangaDataLoader" override val dataLoaderName = "DownloadedChapterCountForMangaDataLoader"
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, Int> = override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, Int> =
DataLoaderFactory.newDataLoader<Int, Int> { ids -> DataLoaderFactory.newDataLoader { ids ->
future { future {
transaction { transaction {
addLogger(Slf4jSqlDebugLogger) addLogger(Slf4jSqlDebugLogger)
@@ -90,7 +90,7 @@ class UnreadChapterCountForMangaDataLoader : KotlinDataLoader<Int, Int> {
override val dataLoaderName = "UnreadChapterCountForMangaDataLoader" override val dataLoaderName = "UnreadChapterCountForMangaDataLoader"
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, Int> = override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, Int> =
DataLoaderFactory.newDataLoader<Int, Int> { ids -> DataLoaderFactory.newDataLoader { ids ->
future { future {
transaction { transaction {
addLogger(Slf4jSqlDebugLogger) addLogger(Slf4jSqlDebugLogger)
@@ -112,7 +112,7 @@ class BookmarkedChapterCountForMangaDataLoader : KotlinDataLoader<Int, Int> {
override val dataLoaderName = "BookmarkedChapterCountForMangaDataLoader" override val dataLoaderName = "BookmarkedChapterCountForMangaDataLoader"
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, Int> = override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, Int> =
DataLoaderFactory.newDataLoader<Int, Int> { ids -> DataLoaderFactory.newDataLoader { ids ->
future { future {
transaction { transaction {
addLogger(Slf4jSqlDebugLogger) addLogger(Slf4jSqlDebugLogger)
@@ -157,11 +157,11 @@ class HasDuplicateChaptersForMangaDataLoader : KotlinDataLoader<Int, Boolean> {
} }
} }
class LastReadChapterForMangaDataLoader : KotlinDataLoader<Int, ChapterType?> { class LastReadChapterForMangaDataLoader : KotlinDataLoader<Int, ChapterType> {
override val dataLoaderName = "LastReadChapterForMangaDataLoader" override val dataLoaderName = "LastReadChapterForMangaDataLoader"
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, ChapterType?> = override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, ChapterType> =
DataLoaderFactory.newDataLoader<Int, ChapterType?> { ids -> DataLoaderFactory.newDataLoader { ids ->
future { future {
transaction { transaction {
addLogger(Slf4jSqlDebugLogger) addLogger(Slf4jSqlDebugLogger)
@@ -177,11 +177,11 @@ class LastReadChapterForMangaDataLoader : KotlinDataLoader<Int, ChapterType?> {
} }
} }
class LatestReadChapterForMangaDataLoader : KotlinDataLoader<Int, ChapterType?> { class LatestReadChapterForMangaDataLoader : KotlinDataLoader<Int, ChapterType> {
override val dataLoaderName = "LatestReadChapterForMangaDataLoader" override val dataLoaderName = "LatestReadChapterForMangaDataLoader"
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, ChapterType?> = override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, ChapterType> =
DataLoaderFactory.newDataLoader<Int, ChapterType?> { ids -> DataLoaderFactory.newDataLoader { ids ->
future { future {
transaction { transaction {
addLogger(Slf4jSqlDebugLogger) addLogger(Slf4jSqlDebugLogger)
@@ -197,11 +197,11 @@ class LatestReadChapterForMangaDataLoader : KotlinDataLoader<Int, ChapterType?>
} }
} }
class LatestFetchedChapterForMangaDataLoader : KotlinDataLoader<Int, ChapterType?> { class LatestFetchedChapterForMangaDataLoader : KotlinDataLoader<Int, ChapterType> {
override val dataLoaderName = "LatestFetchedChapterForMangaDataLoader" override val dataLoaderName = "LatestFetchedChapterForMangaDataLoader"
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, ChapterType?> = override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, ChapterType> =
DataLoaderFactory.newDataLoader<Int, ChapterType?> { ids -> DataLoaderFactory.newDataLoader { ids ->
future { future {
transaction { transaction {
addLogger(Slf4jSqlDebugLogger) addLogger(Slf4jSqlDebugLogger)
@@ -217,11 +217,11 @@ class LatestFetchedChapterForMangaDataLoader : KotlinDataLoader<Int, ChapterType
} }
} }
class LatestUploadedChapterForMangaDataLoader : KotlinDataLoader<Int, ChapterType?> { class LatestUploadedChapterForMangaDataLoader : KotlinDataLoader<Int, ChapterType> {
override val dataLoaderName = "LatestUploadedChapterForMangaDataLoader" override val dataLoaderName = "LatestUploadedChapterForMangaDataLoader"
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, ChapterType?> = override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, ChapterType> =
DataLoaderFactory.newDataLoader<Int, ChapterType?> { ids -> DataLoaderFactory.newDataLoader { ids ->
future { future {
transaction { transaction {
addLogger(Slf4jSqlDebugLogger) addLogger(Slf4jSqlDebugLogger)
@@ -237,11 +237,11 @@ class LatestUploadedChapterForMangaDataLoader : KotlinDataLoader<Int, ChapterTyp
} }
} }
class FirstUnreadChapterForMangaDataLoader : KotlinDataLoader<Int, ChapterType?> { class FirstUnreadChapterForMangaDataLoader : KotlinDataLoader<Int, ChapterType> {
override val dataLoaderName = "FirstUnreadChapterForMangaDataLoader" override val dataLoaderName = "FirstUnreadChapterForMangaDataLoader"
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, ChapterType?> = override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, ChapterType> =
DataLoaderFactory.newDataLoader<Int, ChapterType?> { ids -> DataLoaderFactory.newDataLoader { ids ->
future { future {
transaction { transaction {
addLogger(Slf4jSqlDebugLogger) addLogger(Slf4jSqlDebugLogger)
@@ -257,11 +257,11 @@ class FirstUnreadChapterForMangaDataLoader : KotlinDataLoader<Int, ChapterType?>
} }
} }
class HighestNumberedChapterForMangaDataLoader : KotlinDataLoader<Int, ChapterType?> { class HighestNumberedChapterForMangaDataLoader : KotlinDataLoader<Int, ChapterType> {
override val dataLoaderName = "HighestNumberedChapterForMangaDataLoader" override val dataLoaderName = "HighestNumberedChapterForMangaDataLoader"
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, ChapterType?> = override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, ChapterType> =
DataLoaderFactory.newDataLoader<Int, ChapterType?> { ids -> DataLoaderFactory.newDataLoader { ids ->
future { future {
transaction { transaction {
addLogger(Slf4jSqlDebugLogger) addLogger(Slf4jSqlDebugLogger)

View File

@@ -20,10 +20,10 @@ import suwayomi.tachidesk.manga.model.table.ExtensionTable
import suwayomi.tachidesk.manga.model.table.SourceTable import suwayomi.tachidesk.manga.model.table.SourceTable
import suwayomi.tachidesk.server.JavalinSetup.future import suwayomi.tachidesk.server.JavalinSetup.future
class ExtensionDataLoader : KotlinDataLoader<String, ExtensionType?> { class ExtensionDataLoader : KotlinDataLoader<String, ExtensionType> {
override val dataLoaderName = "ExtensionDataLoader" override val dataLoaderName = "ExtensionDataLoader"
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<String, ExtensionType?> = override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<String, ExtensionType> =
DataLoaderFactory.newDataLoader { ids -> DataLoaderFactory.newDataLoader { ids ->
future { future {
transaction { transaction {
@@ -40,10 +40,10 @@ class ExtensionDataLoader : KotlinDataLoader<String, ExtensionType?> {
} }
} }
class ExtensionForSourceDataLoader : KotlinDataLoader<Long, ExtensionType?> { class ExtensionForSourceDataLoader : KotlinDataLoader<Long, ExtensionType> {
override val dataLoaderName = "ExtensionForSourceDataLoader" override val dataLoaderName = "ExtensionForSourceDataLoader"
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Long, ExtensionType?> = override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Long, ExtensionType> =
DataLoaderFactory.newDataLoader { ids -> DataLoaderFactory.newDataLoader { ids ->
future { future {
transaction { transaction {

View File

@@ -25,10 +25,10 @@ import suwayomi.tachidesk.manga.model.table.CategoryMangaTable
import suwayomi.tachidesk.manga.model.table.MangaTable import suwayomi.tachidesk.manga.model.table.MangaTable
import suwayomi.tachidesk.server.JavalinSetup.future import suwayomi.tachidesk.server.JavalinSetup.future
class MangaDataLoader : KotlinDataLoader<Int, MangaType?> { class MangaDataLoader : KotlinDataLoader<Int, MangaType> {
override val dataLoaderName = "MangaDataLoader" override val dataLoaderName = "MangaDataLoader"
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, MangaType?> = override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, MangaType> =
DataLoaderFactory.newDataLoader { ids -> DataLoaderFactory.newDataLoader { ids ->
future { future {
transaction { transaction {
@@ -122,6 +122,6 @@ class MangaForIdsDataLoader : KotlinDataLoader<List<Int>, MangaNodeList> {
} }
} }
}, },
DataLoaderOptions.newOptions().setCacheMap(CustomCacheMap<List<Int>, MangaNodeList>()), DataLoaderOptions.newOptions().setCacheMap(CustomCacheMap<List<Int>, MangaNodeList>()).build(),
) )
} }

View File

@@ -20,11 +20,11 @@ import suwayomi.tachidesk.manga.model.table.MangaMetaTable
import suwayomi.tachidesk.manga.model.table.SourceMetaTable import suwayomi.tachidesk.manga.model.table.SourceMetaTable
import suwayomi.tachidesk.server.JavalinSetup.future import suwayomi.tachidesk.server.JavalinSetup.future
class GlobalMetaDataLoader : KotlinDataLoader<String, GlobalMetaType?> { class GlobalMetaDataLoader : KotlinDataLoader<String, GlobalMetaType> {
override val dataLoaderName = "GlobalMetaDataLoader" override val dataLoaderName = "GlobalMetaDataLoader"
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<String, GlobalMetaType?> = override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<String, GlobalMetaType> =
DataLoaderFactory.newDataLoader<String, GlobalMetaType?> { ids -> DataLoaderFactory.newDataLoader<String, GlobalMetaType> { ids ->
future { future {
transaction { transaction {
addLogger(Slf4jSqlDebugLogger) addLogger(Slf4jSqlDebugLogger)

View File

@@ -22,10 +22,10 @@ import suwayomi.tachidesk.manga.model.table.ExtensionTable
import suwayomi.tachidesk.manga.model.table.SourceTable import suwayomi.tachidesk.manga.model.table.SourceTable
import suwayomi.tachidesk.server.JavalinSetup.future import suwayomi.tachidesk.server.JavalinSetup.future
class SourceDataLoader : KotlinDataLoader<Long, SourceType?> { class SourceDataLoader : KotlinDataLoader<Long, SourceType> {
override val dataLoaderName = "SourceDataLoader" override val dataLoaderName = "SourceDataLoader"
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Long, SourceType?> = override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Long, SourceType> =
DataLoaderFactory.newDataLoader { ids -> DataLoaderFactory.newDataLoader { ids ->
future { future {
transaction { transaction {

View File

@@ -42,7 +42,7 @@ class CategoryMutation {
) )
@RequireAuth @RequireAuth
fun setCategoryMeta(input: SetCategoryMetaInput): DataFetcherResult<SetCategoryMetaPayload?> = fun setCategoryMeta(input: SetCategoryMetaInput): DataFetcherResult<SetCategoryMetaPayload> =
asDataFetcherResult { asDataFetcherResult {
val (clientMutationId, meta) = input val (clientMutationId, meta) = input
@@ -64,7 +64,7 @@ class CategoryMutation {
) )
@RequireAuth @RequireAuth
fun deleteCategoryMeta(input: DeleteCategoryMetaInput): DataFetcherResult<DeleteCategoryMetaPayload?> = fun deleteCategoryMeta(input: DeleteCategoryMetaInput): DataFetcherResult<DeleteCategoryMetaPayload> =
asDataFetcherResult { asDataFetcherResult {
val (clientMutationId, categoryId, key) = input val (clientMutationId, categoryId, key) = input
@@ -110,7 +110,7 @@ class CategoryMutation {
) )
@RequireAuth @RequireAuth
fun setCategoryMetas(input: SetCategoryMetasInput): DataFetcherResult<SetCategoryMetasPayload?> = fun setCategoryMetas(input: SetCategoryMetasInput): DataFetcherResult<SetCategoryMetasPayload> =
asDataFetcherResult { asDataFetcherResult {
val (clientMutationId, items) = input val (clientMutationId, items) = input
@@ -166,7 +166,7 @@ class CategoryMutation {
) )
@RequireAuth @RequireAuth
fun deleteCategoryMetas(input: DeleteCategoryMetasInput): DataFetcherResult<DeleteCategoryMetasPayload?> = fun deleteCategoryMetas(input: DeleteCategoryMetasInput): DataFetcherResult<DeleteCategoryMetasPayload> =
asDataFetcherResult { asDataFetcherResult {
val (clientMutationId, items) = input val (clientMutationId, items) = input
@@ -291,7 +291,7 @@ class CategoryMutation {
} }
@RequireAuth @RequireAuth
fun updateCategory(input: UpdateCategoryInput): DataFetcherResult<UpdateCategoryPayload?> = fun updateCategory(input: UpdateCategoryInput): DataFetcherResult<UpdateCategoryPayload> =
asDataFetcherResult { asDataFetcherResult {
val (clientMutationId, id, patch) = input val (clientMutationId, id, patch) = input
@@ -309,7 +309,7 @@ class CategoryMutation {
} }
@RequireAuth @RequireAuth
fun updateCategories(input: UpdateCategoriesInput): DataFetcherResult<UpdateCategoriesPayload?> = fun updateCategories(input: UpdateCategoriesInput): DataFetcherResult<UpdateCategoriesPayload> =
asDataFetcherResult { asDataFetcherResult {
val (clientMutationId, ids, patch) = input val (clientMutationId, ids, patch) = input
@@ -338,7 +338,7 @@ class CategoryMutation {
) )
@RequireAuth @RequireAuth
fun updateCategoryOrder(input: UpdateCategoryOrderInput): DataFetcherResult<UpdateCategoryOrderPayload?> = fun updateCategoryOrder(input: UpdateCategoryOrderInput): DataFetcherResult<UpdateCategoryOrderPayload> =
asDataFetcherResult { asDataFetcherResult {
val (clientMutationId, categoryId, position) = input val (clientMutationId, categoryId, position) = input
require(position > 0) { require(position > 0) {
@@ -397,7 +397,7 @@ class CategoryMutation {
) )
@RequireAuth @RequireAuth
fun createCategory(input: CreateCategoryInput): DataFetcherResult<CreateCategoryPayload?> = fun createCategory(input: CreateCategoryInput): DataFetcherResult<CreateCategoryPayload> =
asDataFetcherResult { asDataFetcherResult {
val (clientMutationId, name, order, default, includeInUpdate, includeInDownload) = input val (clientMutationId, name, order, default, includeInUpdate, includeInDownload) = input
transaction { transaction {
@@ -457,7 +457,7 @@ class CategoryMutation {
) )
@RequireAuth @RequireAuth
fun deleteCategory(input: DeleteCategoryInput): DataFetcherResult<DeleteCategoryPayload?> { fun deleteCategory(input: DeleteCategoryInput): DataFetcherResult<DeleteCategoryPayload> {
return asDataFetcherResult { 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
@@ -547,7 +547,7 @@ class CategoryMutation {
} }
@RequireAuth @RequireAuth
fun updateMangaCategories(input: UpdateMangaCategoriesInput): DataFetcherResult<UpdateMangaCategoriesPayload?> = fun updateMangaCategories(input: UpdateMangaCategoriesInput): DataFetcherResult<UpdateMangaCategoriesPayload> =
asDataFetcherResult { asDataFetcherResult {
val (clientMutationId, id, patch) = input val (clientMutationId, id, patch) = input
@@ -565,7 +565,7 @@ class CategoryMutation {
} }
@RequireAuth @RequireAuth
fun updateMangasCategories(input: UpdateMangasCategoriesInput): DataFetcherResult<UpdateMangasCategoriesPayload?> = fun updateMangasCategories(input: UpdateMangasCategoriesInput): DataFetcherResult<UpdateMangasCategoriesPayload> =
asDataFetcherResult { asDataFetcherResult {
val (clientMutationId, ids, patch) = input val (clientMutationId, ids, patch) = input

View File

@@ -120,7 +120,7 @@ class ChapterMutation {
} }
@RequireAuth @RequireAuth
fun updateChapter(input: UpdateChapterInput): DataFetcherResult<UpdateChapterPayload?> = fun updateChapter(input: UpdateChapterInput): DataFetcherResult<UpdateChapterPayload> =
asDataFetcherResult { asDataFetcherResult {
val (clientMutationId, id, patch) = input val (clientMutationId, id, patch) = input
@@ -138,7 +138,7 @@ class ChapterMutation {
} }
@RequireAuth @RequireAuth
fun updateChapters(input: UpdateChaptersInput): DataFetcherResult<UpdateChaptersPayload?> = fun updateChapters(input: UpdateChaptersInput): DataFetcherResult<UpdateChaptersPayload> =
asDataFetcherResult { asDataFetcherResult {
val (clientMutationId, ids, patch) = input val (clientMutationId, ids, patch) = input
@@ -166,7 +166,7 @@ class ChapterMutation {
) )
@RequireAuth @RequireAuth
fun fetchChapters(input: FetchChaptersInput): CompletableFuture<DataFetcherResult<FetchChaptersPayload?>> { fun fetchChapters(input: FetchChaptersInput): CompletableFuture<DataFetcherResult<FetchChaptersPayload>> {
val (clientMutationId, mangaId) = input val (clientMutationId, mangaId) = input
return future { return future {
@@ -201,7 +201,7 @@ class ChapterMutation {
) )
@RequireAuth @RequireAuth
fun setChapterMeta(input: SetChapterMetaInput): DataFetcherResult<SetChapterMetaPayload?> = fun setChapterMeta(input: SetChapterMetaInput): DataFetcherResult<SetChapterMetaPayload> =
asDataFetcherResult { asDataFetcherResult {
val (clientMutationId, meta) = input val (clientMutationId, meta) = input
@@ -223,7 +223,7 @@ class ChapterMutation {
) )
@RequireAuth @RequireAuth
fun deleteChapterMeta(input: DeleteChapterMetaInput): DataFetcherResult<DeleteChapterMetaPayload?> = fun deleteChapterMeta(input: DeleteChapterMetaInput): DataFetcherResult<DeleteChapterMetaPayload> =
asDataFetcherResult { asDataFetcherResult {
val (clientMutationId, chapterId, key) = input val (clientMutationId, chapterId, key) = input
@@ -269,7 +269,7 @@ class ChapterMutation {
) )
@RequireAuth @RequireAuth
fun setChapterMetas(input: SetChapterMetasInput): DataFetcherResult<SetChapterMetasPayload?> = fun setChapterMetas(input: SetChapterMetasInput): DataFetcherResult<SetChapterMetasPayload> =
asDataFetcherResult { asDataFetcherResult {
val (clientMutationId, items) = input val (clientMutationId, items) = input
@@ -325,7 +325,7 @@ class ChapterMutation {
) )
@RequireAuth @RequireAuth
fun deleteChapterMetas(input: DeleteChapterMetasInput): DataFetcherResult<DeleteChapterMetasPayload?> = fun deleteChapterMetas(input: DeleteChapterMetasInput): DataFetcherResult<DeleteChapterMetasPayload> =
asDataFetcherResult { asDataFetcherResult {
val (clientMutationId, items) = input val (clientMutationId, items) = input
@@ -405,7 +405,7 @@ class ChapterMutation {
) )
@RequireAuth @RequireAuth
fun fetchChapterPages(input: FetchChapterPagesInput): CompletableFuture<DataFetcherResult<FetchChapterPagesPayload?>> { fun fetchChapterPages(input: FetchChapterPagesInput): CompletableFuture<DataFetcherResult<FetchChapterPagesPayload>> {
val (clientMutationId, chapterId) = input val (clientMutationId, chapterId) = input
val paramsMap = input.toParams() val paramsMap = input.toParams()

View File

@@ -30,7 +30,7 @@ class DownloadMutation {
) )
@RequireAuth @RequireAuth
fun deleteDownloadedChapters(input: DeleteDownloadedChaptersInput): DataFetcherResult<DeleteDownloadedChaptersPayload?> { fun deleteDownloadedChapters(input: DeleteDownloadedChaptersInput): DataFetcherResult<DeleteDownloadedChaptersPayload> {
val (clientMutationId, chapters) = input val (clientMutationId, chapters) = input
return asDataFetcherResult { return asDataFetcherResult {
@@ -60,7 +60,7 @@ class DownloadMutation {
) )
@RequireAuth @RequireAuth
fun deleteDownloadedChapter(input: DeleteDownloadedChapterInput): DataFetcherResult<DeleteDownloadedChapterPayload?> { fun deleteDownloadedChapter(input: DeleteDownloadedChapterInput): DataFetcherResult<DeleteDownloadedChapterPayload> {
val (clientMutationId, chapter) = input val (clientMutationId, chapter) = input
return asDataFetcherResult { return asDataFetcherResult {
@@ -89,7 +89,7 @@ class DownloadMutation {
@RequireAuth @RequireAuth
fun enqueueChapterDownloads( fun enqueueChapterDownloads(
input: EnqueueChapterDownloadsInput, input: EnqueueChapterDownloadsInput,
): CompletableFuture<DataFetcherResult<EnqueueChapterDownloadsPayload?>> { ): CompletableFuture<DataFetcherResult<EnqueueChapterDownloadsPayload>> {
val (clientMutationId, chapters) = input val (clientMutationId, chapters) = input
return future { return future {
@@ -123,7 +123,7 @@ class DownloadMutation {
) )
@RequireAuth @RequireAuth
fun enqueueChapterDownload(input: EnqueueChapterDownloadInput): CompletableFuture<DataFetcherResult<EnqueueChapterDownloadPayload?>> { fun enqueueChapterDownload(input: EnqueueChapterDownloadInput): CompletableFuture<DataFetcherResult<EnqueueChapterDownloadPayload>> {
val (clientMutationId, chapter) = input val (clientMutationId, chapter) = input
return future { return future {
@@ -158,7 +158,7 @@ class DownloadMutation {
@RequireAuth @RequireAuth
fun dequeueChapterDownloads( fun dequeueChapterDownloads(
input: DequeueChapterDownloadsInput, input: DequeueChapterDownloadsInput,
): CompletableFuture<DataFetcherResult<DequeueChapterDownloadsPayload?>> { ): CompletableFuture<DataFetcherResult<DequeueChapterDownloadsPayload>> {
val (clientMutationId, chapters) = input val (clientMutationId, chapters) = input
return future { return future {
@@ -194,7 +194,7 @@ class DownloadMutation {
) )
@RequireAuth @RequireAuth
fun dequeueChapterDownload(input: DequeueChapterDownloadInput): CompletableFuture<DataFetcherResult<DequeueChapterDownloadPayload?>> { fun dequeueChapterDownload(input: DequeueChapterDownloadInput): CompletableFuture<DataFetcherResult<DequeueChapterDownloadPayload>> {
val (clientMutationId, chapter) = input val (clientMutationId, chapter) = input
return future { return future {
@@ -229,7 +229,7 @@ class DownloadMutation {
) )
@RequireAuth @RequireAuth
fun startDownloader(input: StartDownloaderInput): CompletableFuture<DataFetcherResult<StartDownloaderPayload?>> = fun startDownloader(input: StartDownloaderInput): CompletableFuture<DataFetcherResult<StartDownloaderPayload>> =
future { future {
asDataFetcherResult { asDataFetcherResult {
DownloadManager.start() DownloadManager.start()
@@ -258,7 +258,7 @@ class DownloadMutation {
) )
@RequireAuth @RequireAuth
fun stopDownloader(input: StopDownloaderInput): CompletableFuture<DataFetcherResult<StopDownloaderPayload?>> = fun stopDownloader(input: StopDownloaderInput): CompletableFuture<DataFetcherResult<StopDownloaderPayload>> =
future { future {
asDataFetcherResult { asDataFetcherResult {
DownloadManager.stop() DownloadManager.stop()
@@ -287,7 +287,7 @@ class DownloadMutation {
) )
@RequireAuth @RequireAuth
fun clearDownloader(input: ClearDownloaderInput): CompletableFuture<DataFetcherResult<ClearDownloaderPayload?>> = fun clearDownloader(input: ClearDownloaderInput): CompletableFuture<DataFetcherResult<ClearDownloaderPayload>> =
future { future {
asDataFetcherResult { asDataFetcherResult {
DownloadManager.clear() DownloadManager.clear()
@@ -318,7 +318,7 @@ class DownloadMutation {
) )
@RequireAuth @RequireAuth
fun reorderChapterDownload(input: ReorderChapterDownloadInput): CompletableFuture<DataFetcherResult<ReorderChapterDownloadPayload?>> { fun reorderChapterDownload(input: ReorderChapterDownloadInput): CompletableFuture<DataFetcherResult<ReorderChapterDownloadPayload>> {
val (clientMutationId, chapter, to) = input val (clientMutationId, chapter, to) = input
return future { return future {

View File

@@ -75,7 +75,7 @@ class ExtensionMutation {
} }
@RequireAuth @RequireAuth
fun updateExtension(input: UpdateExtensionInput): CompletableFuture<DataFetcherResult<UpdateExtensionPayload?>> { fun updateExtension(input: UpdateExtensionInput): CompletableFuture<DataFetcherResult<UpdateExtensionPayload>> {
val (clientMutationId, id, patch) = input val (clientMutationId, id, patch) = input
return future { return future {
@@ -100,7 +100,7 @@ class ExtensionMutation {
} }
@RequireAuth @RequireAuth
fun updateExtensions(input: UpdateExtensionsInput): CompletableFuture<DataFetcherResult<UpdateExtensionsPayload?>> { fun updateExtensions(input: UpdateExtensionsInput): CompletableFuture<DataFetcherResult<UpdateExtensionsPayload>> {
val (clientMutationId, ids, patch) = input val (clientMutationId, ids, patch) = input
return future { return future {
@@ -133,7 +133,7 @@ class ExtensionMutation {
) )
@RequireAuth @RequireAuth
fun fetchExtensions(input: FetchExtensionsInput): CompletableFuture<DataFetcherResult<FetchExtensionsPayload?>> { fun fetchExtensions(input: FetchExtensionsInput): CompletableFuture<DataFetcherResult<FetchExtensionsPayload>> {
val (clientMutationId) = input val (clientMutationId) = input
return future { return future {
@@ -169,7 +169,7 @@ class ExtensionMutation {
@RequireAuth @RequireAuth
fun installExternalExtension( fun installExternalExtension(
input: InstallExternalExtensionInput, input: InstallExternalExtensionInput,
): CompletableFuture<DataFetcherResult<InstallExternalExtensionPayload?>> { ): CompletableFuture<DataFetcherResult<InstallExternalExtensionPayload>> {
val (clientMutationId, extensionFile) = input val (clientMutationId, extensionFile) = input
return future { return future {

View File

@@ -26,7 +26,7 @@ class InfoMutation {
) )
@RequireAuth @RequireAuth
fun updateWebUI(input: WebUIUpdateInput): CompletableFuture<DataFetcherResult<WebUIUpdatePayload?>> { fun updateWebUI(input: WebUIUpdateInput): CompletableFuture<DataFetcherResult<WebUIUpdatePayload>> {
return future { return future {
asDataFetcherResult { asDataFetcherResult {
withTimeout(30.seconds) { withTimeout(30.seconds) {
@@ -62,7 +62,7 @@ class InfoMutation {
} }
@RequireAuth @RequireAuth
fun resetWebUIUpdateStatus(): CompletableFuture<DataFetcherResult<WebUIUpdateStatus?>> = fun resetWebUIUpdateStatus(): CompletableFuture<DataFetcherResult<WebUIUpdateStatus>> =
future { future {
asDataFetcherResult { asDataFetcherResult {
withTimeout(30.seconds) { withTimeout(30.seconds) {

View File

@@ -62,7 +62,7 @@ class KoreaderSyncMutation {
) )
@RequireAuth @RequireAuth
fun pushKoSyncProgress(input: PushKoSyncProgressInput): CompletableFuture<DataFetcherResult<PushKoSyncProgressPayload?>> = fun pushKoSyncProgress(input: PushKoSyncProgressInput): CompletableFuture<DataFetcherResult<PushKoSyncProgressPayload>> =
future { future {
asDataFetcherResult { asDataFetcherResult {
KoreaderSyncService.pushProgress(input.chapterId) KoreaderSyncService.pushProgress(input.chapterId)
@@ -96,7 +96,7 @@ class KoreaderSyncMutation {
) )
@RequireAuth @RequireAuth
fun pullKoSyncProgress(input: PullKoSyncProgressInput): CompletableFuture<DataFetcherResult<PullKoSyncProgressPayload?>> = fun pullKoSyncProgress(input: PullKoSyncProgressInput): CompletableFuture<DataFetcherResult<PullKoSyncProgressPayload>> =
future { future {
asDataFetcherResult { asDataFetcherResult {
val syncResult = KoreaderSyncService.checkAndPullProgress(input.chapterId) val syncResult = KoreaderSyncService.checkAndPullProgress(input.chapterId)

View File

@@ -98,7 +98,7 @@ class MangaMutation {
} }
@RequireAuth @RequireAuth
fun updateManga(input: UpdateMangaInput): CompletableFuture<DataFetcherResult<UpdateMangaPayload?>> { fun updateManga(input: UpdateMangaInput): CompletableFuture<DataFetcherResult<UpdateMangaPayload>> {
val (clientMutationId, id, patch) = input val (clientMutationId, id, patch) = input
return future { return future {
@@ -119,7 +119,7 @@ class MangaMutation {
} }
@RequireAuth @RequireAuth
fun updateMangas(input: UpdateMangasInput): CompletableFuture<DataFetcherResult<UpdateMangasPayload?>> { fun updateMangas(input: UpdateMangasInput): CompletableFuture<DataFetcherResult<UpdateMangasPayload>> {
val (clientMutationId, ids, patch) = input val (clientMutationId, ids, patch) = input
return future { return future {
@@ -150,7 +150,7 @@ class MangaMutation {
) )
@RequireAuth @RequireAuth
fun fetchManga(input: FetchMangaInput): CompletableFuture<DataFetcherResult<FetchMangaPayload?>> { fun fetchManga(input: FetchMangaInput): CompletableFuture<DataFetcherResult<FetchMangaPayload>> {
val (clientMutationId, id) = input val (clientMutationId, id) = input
return future { return future {
@@ -180,7 +180,7 @@ class MangaMutation {
) )
@RequireAuth @RequireAuth
fun setMangaMeta(input: SetMangaMetaInput): DataFetcherResult<SetMangaMetaPayload?> { fun setMangaMeta(input: SetMangaMetaInput): DataFetcherResult<SetMangaMetaPayload> {
val (clientMutationId, meta) = input val (clientMutationId, meta) = input
return asDataFetcherResult { return asDataFetcherResult {
@@ -203,7 +203,7 @@ class MangaMutation {
) )
@RequireAuth @RequireAuth
fun deleteMangaMeta(input: DeleteMangaMetaInput): DataFetcherResult<DeleteMangaMetaPayload?> { fun deleteMangaMeta(input: DeleteMangaMetaInput): DataFetcherResult<DeleteMangaMetaPayload> {
val (clientMutationId, mangaId, key) = input val (clientMutationId, mangaId, key) = input
return asDataFetcherResult { return asDataFetcherResult {
@@ -250,7 +250,7 @@ class MangaMutation {
) )
@RequireAuth @RequireAuth
fun setMangaMetas(input: SetMangaMetasInput): DataFetcherResult<SetMangaMetasPayload?> { fun setMangaMetas(input: SetMangaMetasInput): DataFetcherResult<SetMangaMetasPayload> {
val (clientMutationId, items) = input val (clientMutationId, items) = input
return asDataFetcherResult { return asDataFetcherResult {
@@ -307,7 +307,7 @@ class MangaMutation {
) )
@RequireAuth @RequireAuth
fun deleteMangaMetas(input: DeleteMangaMetasInput): DataFetcherResult<DeleteMangaMetasPayload?> { fun deleteMangaMetas(input: DeleteMangaMetasInput): DataFetcherResult<DeleteMangaMetasPayload> {
val (clientMutationId, items) = input val (clientMutationId, items) = input
return asDataFetcherResult { return asDataFetcherResult {

View File

@@ -29,7 +29,7 @@ class MetaMutation {
) )
@RequireAuth @RequireAuth
fun setGlobalMeta(input: SetGlobalMetaInput): DataFetcherResult<SetGlobalMetaPayload?> { fun setGlobalMeta(input: SetGlobalMetaInput): DataFetcherResult<SetGlobalMetaPayload> {
val (clientMutationId, meta) = input val (clientMutationId, meta) = input
return asDataFetcherResult { return asDataFetcherResult {
@@ -50,7 +50,7 @@ class MetaMutation {
) )
@RequireAuth @RequireAuth
fun deleteGlobalMeta(input: DeleteGlobalMetaInput): DataFetcherResult<DeleteGlobalMetaPayload?> { fun deleteGlobalMeta(input: DeleteGlobalMetaInput): DataFetcherResult<DeleteGlobalMetaPayload> {
val (clientMutationId, key) = input val (clientMutationId, key) = input
return asDataFetcherResult { return asDataFetcherResult {
@@ -86,7 +86,7 @@ class MetaMutation {
) )
@RequireAuth @RequireAuth
fun setGlobalMetas(input: SetGlobalMetasInput): DataFetcherResult<SetGlobalMetasPayload?> { fun setGlobalMetas(input: SetGlobalMetasInput): DataFetcherResult<SetGlobalMetasPayload> {
val (clientMutationId, metas) = input val (clientMutationId, metas) = input
return asDataFetcherResult { return asDataFetcherResult {
@@ -117,7 +117,7 @@ class MetaMutation {
) )
@RequireAuth @RequireAuth
fun deleteGlobalMetas(input: DeleteGlobalMetasInput): DataFetcherResult<DeleteGlobalMetasPayload?> { fun deleteGlobalMetas(input: DeleteGlobalMetasInput): DataFetcherResult<DeleteGlobalMetasPayload> {
val (clientMutationId, keys, prefixes) = input val (clientMutationId, keys, prefixes) = input
return asDataFetcherResult { return asDataFetcherResult {

View File

@@ -47,7 +47,7 @@ class SourceMutation {
) )
@RequireAuth @RequireAuth
fun setSourceMeta(input: SetSourceMetaInput): DataFetcherResult<SetSourceMetaPayload?> { fun setSourceMeta(input: SetSourceMetaInput): DataFetcherResult<SetSourceMetaPayload> {
val (clientMutationId, meta) = input val (clientMutationId, meta) = input
return asDataFetcherResult { return asDataFetcherResult {
@@ -70,7 +70,7 @@ class SourceMutation {
) )
@RequireAuth @RequireAuth
fun deleteSourceMeta(input: DeleteSourceMetaInput): DataFetcherResult<DeleteSourceMetaPayload?> { fun deleteSourceMeta(input: DeleteSourceMetaInput): DataFetcherResult<DeleteSourceMetaPayload> {
val (clientMutationId, sourceId, key) = input val (clientMutationId, sourceId, key) = input
return asDataFetcherResult { return asDataFetcherResult {
@@ -121,7 +121,7 @@ class SourceMutation {
) )
@RequireAuth @RequireAuth
fun setSourceMetas(input: SetSourceMetasInput): DataFetcherResult<SetSourceMetasPayload?> { fun setSourceMetas(input: SetSourceMetasInput): DataFetcherResult<SetSourceMetasPayload> {
val (clientMutationId, items) = input val (clientMutationId, items) = input
return asDataFetcherResult { return asDataFetcherResult {
@@ -178,7 +178,7 @@ class SourceMutation {
) )
@RequireAuth @RequireAuth
fun deleteSourceMetas(input: DeleteSourceMetasInput): DataFetcherResult<DeleteSourceMetasPayload?> { fun deleteSourceMetas(input: DeleteSourceMetasInput): DataFetcherResult<DeleteSourceMetasPayload> {
val (clientMutationId, items) = input val (clientMutationId, items) = input
return asDataFetcherResult { return asDataFetcherResult {
@@ -260,7 +260,7 @@ class SourceMutation {
) )
@RequireAuth @RequireAuth
fun fetchSourceManga(input: FetchSourceMangaInput): CompletableFuture<DataFetcherResult<FetchSourceMangaPayload?>> { fun fetchSourceManga(input: FetchSourceMangaInput): CompletableFuture<DataFetcherResult<FetchSourceMangaPayload>> {
val (clientMutationId, sourceId, type, page, query, filters) = input val (clientMutationId, sourceId, type, page, query, filters) = input
return future { return future {
@@ -329,7 +329,7 @@ class SourceMutation {
) )
@RequireAuth @RequireAuth
fun updateSourcePreference(input: UpdateSourcePreferenceInput): DataFetcherResult<UpdateSourcePreferencePayload?> { fun updateSourcePreference(input: UpdateSourcePreferenceInput): DataFetcherResult<UpdateSourcePreferencePayload> {
val (clientMutationId, sourceId, change) = input val (clientMutationId, sourceId, change) = input
return asDataFetcherResult { return asDataFetcherResult {

View File

@@ -222,7 +222,7 @@ class TrackMutation {
) )
@RequireAuth @RequireAuth
fun trackProgress(input: TrackProgressInput): CompletableFuture<DataFetcherResult<TrackProgressPayload?>> { fun trackProgress(input: TrackProgressInput): CompletableFuture<DataFetcherResult<TrackProgressPayload>> {
val (clientMutationId, mangaId) = input val (clientMutationId, mangaId) = input
return future { return future {

View File

@@ -28,7 +28,7 @@ class UpdateMutation {
) )
@RequireAuth @RequireAuth
fun updateLibrary(input: UpdateLibraryInput): CompletableFuture<DataFetcherResult<UpdateLibraryPayload?>> { fun updateLibrary(input: UpdateLibraryInput): CompletableFuture<DataFetcherResult<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,
@@ -60,7 +60,7 @@ class UpdateMutation {
) )
@RequireAuth @RequireAuth
fun updateLibraryManga(input: UpdateLibraryMangaInput): CompletableFuture<DataFetcherResult<UpdateLibraryMangaPayload?>> { fun updateLibraryManga(input: UpdateLibraryMangaInput): CompletableFuture<DataFetcherResult<UpdateLibraryMangaPayload>> {
updateLibrary( updateLibrary(
UpdateLibraryInput( UpdateLibraryInput(
clientMutationId = input.clientMutationId, clientMutationId = input.clientMutationId,
@@ -92,7 +92,7 @@ class UpdateMutation {
) )
@RequireAuth @RequireAuth
fun updateCategoryManga(input: UpdateCategoryMangaInput): CompletableFuture<DataFetcherResult<UpdateCategoryMangaPayload?>> { fun updateCategoryManga(input: UpdateCategoryMangaInput): CompletableFuture<DataFetcherResult<UpdateCategoryMangaPayload>> {
updateLibrary( updateLibrary(
UpdateLibraryInput( UpdateLibraryInput(
clientMutationId = input.clientMutationId, clientMutationId = input.clientMutationId,

View File

@@ -11,6 +11,7 @@ import com.expediagroup.graphql.server.execution.GraphQLRequestParser
import com.expediagroup.graphql.server.types.GraphQLBatchRequest import com.expediagroup.graphql.server.types.GraphQLBatchRequest
import com.expediagroup.graphql.server.types.GraphQLRequest import com.expediagroup.graphql.server.types.GraphQLRequest
import com.expediagroup.graphql.server.types.GraphQLServerRequest import com.expediagroup.graphql.server.types.GraphQLServerRequest
import io.github.oshai.kotlinlogging.KotlinLogging
import io.javalin.http.Context import io.javalin.http.Context
import io.javalin.http.UploadedFile import io.javalin.http.UploadedFile
import io.javalin.json.JavalinJackson import io.javalin.json.JavalinJackson
@@ -19,11 +20,12 @@ import io.javalin.json.fromJsonString
import java.io.IOException import java.io.IOException
class JavalinGraphQLRequestParser : GraphQLRequestParser<Context> { class JavalinGraphQLRequestParser : GraphQLRequestParser<Context> {
val jsonMapper = JavalinJackson() private val logger = KotlinLogging.logger {}
@Suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE") @Suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE")
override suspend fun parseRequest(context: Context): GraphQLServerRequest? { override suspend fun parseRequest(context: Context): GraphQLServerRequest? {
return try { return try {
val jsonMapper = context.jsonMapper()
val contentType = context.contentType() val contentType = context.contentType()
val formParam = val formParam =
if ( if (
@@ -77,7 +79,8 @@ class JavalinGraphQLRequestParser : GraphQLRequestParser<Context> {
) )
} }
} }
} catch (_: IOException) { } catch (e: IOException) {
logger.error(e) { "Error when parsing request" }
null null
} }
} }

View File

@@ -10,7 +10,6 @@ package suwayomi.tachidesk.graphql.server
import com.expediagroup.graphql.generator.execution.FlowSubscriptionExecutionStrategy import com.expediagroup.graphql.generator.execution.FlowSubscriptionExecutionStrategy
import com.expediagroup.graphql.server.execution.GraphQLRequestHandler import com.expediagroup.graphql.server.execution.GraphQLRequestHandler
import com.expediagroup.graphql.server.execution.GraphQLServer import com.expediagroup.graphql.server.execution.GraphQLServer
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import graphql.ExceptionWhileDataFetching import graphql.ExceptionWhileDataFetching
import graphql.GraphQL import graphql.GraphQL
import graphql.execution.AsyncExecutionStrategy import graphql.execution.AsyncExecutionStrategy
@@ -27,6 +26,7 @@ import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
import suwayomi.tachidesk.graphql.server.subscriptions.ApolloSubscriptionProtocolHandler import suwayomi.tachidesk.graphql.server.subscriptions.ApolloSubscriptionProtocolHandler
import suwayomi.tachidesk.server.JavalinSetup.future import suwayomi.tachidesk.server.JavalinSetup.future
import tools.jackson.module.kotlin.jacksonObjectMapper
class TachideskGraphQLServer( class TachideskGraphQLServer(
requestParser: JavalinGraphQLRequestParser, requestParser: JavalinGraphQLRequestParser,

View File

@@ -58,7 +58,7 @@ private class GraphqlCursorCoercing : Coercing<Cursor, String> {
), ),
) )
} }
return Cursor(input.value) return Cursor(input.value!!)
} }
private fun valueToLiteralImpl(input: Any): StringValue = StringValue.newStringValue(input.toString()).build() private fun valueToLiteralImpl(input: Any): StringValue = StringValue.newStringValue(input.toString()).build()

View File

@@ -71,7 +71,7 @@ private class GraphqlDurationAsStringCoercing : Coercing<Duration, String> {
) )
} }
return try { return try {
Duration.parse(input.value) Duration.parse(input.value!!)
} catch (e: IllegalArgumentException) { } catch (e: IllegalArgumentException) {
throw CoercingParseLiteralException( throw CoercingParseLiteralException(
"Invalid duration format: ${input.value}. Expected ISO-8601 duration string (e.g., 'PT30M', 'P1D')", "Invalid duration format: ${input.value}. Expected ISO-8601 duration string (e.g., 'PT30M', 'P1D')",

View File

@@ -53,7 +53,7 @@ private class GraphqlLongAsStringCoercing : Coercing<Long, String> {
), ),
) )
} }
return input.value.toLong() return input.value!!.toLong()
} }
private fun valueToLiteralImpl(input: Any): StringValue = StringValue.newStringValue(input.toString()).build() private fun valueToLiteralImpl(input: Any): StringValue = StringValue.newStringValue(input.toString()).build()

View File

@@ -9,9 +9,6 @@ package suwayomi.tachidesk.graphql.server.subscriptions
import com.expediagroup.graphql.server.execution.GraphQLRequestHandler import com.expediagroup.graphql.server.execution.GraphQLRequestHandler
import com.expediagroup.graphql.server.types.GraphQLRequest import com.expediagroup.graphql.server.types.GraphQLRequest
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.kotlin.convertValue
import com.fasterxml.jackson.module.kotlin.readValue
import io.github.oshai.kotlinlogging.KotlinLogging import io.github.oshai.kotlinlogging.KotlinLogging
import io.javalin.http.Header import io.javalin.http.Header
import io.javalin.websocket.WsContext import io.javalin.websocket.WsContext
@@ -41,6 +38,9 @@ import suwayomi.tachidesk.server.JavalinSetup.Attribute
import suwayomi.tachidesk.server.JavalinSetup.getAttributeOrSet import suwayomi.tachidesk.server.JavalinSetup.getAttributeOrSet
import suwayomi.tachidesk.server.user.UserType import suwayomi.tachidesk.server.user.UserType
import suwayomi.tachidesk.server.user.getUserFromToken import suwayomi.tachidesk.server.user.getUserFromToken
import tools.jackson.databind.ObjectMapper
import tools.jackson.module.kotlin.convertValue
import tools.jackson.module.kotlin.readValue
/** /**
* Implementation of the `graphql-transport-ws` protocol defined by Denis Badurina * Implementation of the `graphql-transport-ws` protocol defined by Denis Badurina