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

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

View File

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

View File

@@ -3,12 +3,8 @@ package suwayomi.tachidesk.graphql.cache
import org.dataloader.CacheMap
import java.util.concurrent.CompletableFuture
class CustomCacheMap<K, V> : CacheMap<K, V> {
private val cache: MutableMap<K, CompletableFuture<V>>
init {
cache = HashMap()
}
class CustomCacheMap<K : Any, V : Any> : CacheMap<K, V> {
private val cache: MutableMap<K, CompletableFuture<V>> = HashMap()
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 set(
override fun putIfAbsentAtomically(
key: K,
value: CompletableFuture<V>,
): CacheMap<K, V> {
): CompletableFuture<V> {
cache[key] = value
return this
return value
}
override fun delete(key: K): CacheMap<K, V> {
@@ -35,4 +31,8 @@ class CustomCacheMap<K, V> : CacheMap<K, V> {
cache.clear()
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.server.JavalinSetup.future
class ChapterDataLoader : KotlinDataLoader<Int, ChapterType?> {
class ChapterDataLoader : KotlinDataLoader<Int, ChapterType> {
override val dataLoaderName = "ChapterDataLoader"
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, ChapterType?> =
DataLoaderFactory.newDataLoader<Int, ChapterType> { ids ->
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, ChapterType> =
DataLoaderFactory.newDataLoader { ids ->
future {
transaction {
addLogger(Slf4jSqlDebugLogger)
@@ -48,7 +48,7 @@ class ChaptersForMangaDataLoader : KotlinDataLoader<Int, ChapterNodeList> {
override val dataLoaderName = "ChaptersForMangaDataLoader"
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, ChapterNodeList> =
DataLoaderFactory.newDataLoader<Int, ChapterNodeList> { ids ->
DataLoaderFactory.newDataLoader { ids ->
future {
transaction {
addLogger(Slf4jSqlDebugLogger)
@@ -68,7 +68,7 @@ class DownloadedChapterCountForMangaDataLoader : KotlinDataLoader<Int, Int> {
override val dataLoaderName = "DownloadedChapterCountForMangaDataLoader"
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, Int> =
DataLoaderFactory.newDataLoader<Int, Int> { ids ->
DataLoaderFactory.newDataLoader { ids ->
future {
transaction {
addLogger(Slf4jSqlDebugLogger)
@@ -90,7 +90,7 @@ class UnreadChapterCountForMangaDataLoader : KotlinDataLoader<Int, Int> {
override val dataLoaderName = "UnreadChapterCountForMangaDataLoader"
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, Int> =
DataLoaderFactory.newDataLoader<Int, Int> { ids ->
DataLoaderFactory.newDataLoader { ids ->
future {
transaction {
addLogger(Slf4jSqlDebugLogger)
@@ -112,7 +112,7 @@ class BookmarkedChapterCountForMangaDataLoader : KotlinDataLoader<Int, Int> {
override val dataLoaderName = "BookmarkedChapterCountForMangaDataLoader"
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, Int> =
DataLoaderFactory.newDataLoader<Int, Int> { ids ->
DataLoaderFactory.newDataLoader { ids ->
future {
transaction {
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 fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, ChapterType?> =
DataLoaderFactory.newDataLoader<Int, ChapterType?> { ids ->
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, ChapterType> =
DataLoaderFactory.newDataLoader { ids ->
future {
transaction {
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 fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, ChapterType?> =
DataLoaderFactory.newDataLoader<Int, ChapterType?> { ids ->
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, ChapterType> =
DataLoaderFactory.newDataLoader { ids ->
future {
transaction {
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 fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, ChapterType?> =
DataLoaderFactory.newDataLoader<Int, ChapterType?> { ids ->
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, ChapterType> =
DataLoaderFactory.newDataLoader { ids ->
future {
transaction {
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 fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, ChapterType?> =
DataLoaderFactory.newDataLoader<Int, ChapterType?> { ids ->
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, ChapterType> =
DataLoaderFactory.newDataLoader { ids ->
future {
transaction {
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 fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, ChapterType?> =
DataLoaderFactory.newDataLoader<Int, ChapterType?> { ids ->
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, ChapterType> =
DataLoaderFactory.newDataLoader { ids ->
future {
transaction {
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 fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, ChapterType?> =
DataLoaderFactory.newDataLoader<Int, ChapterType?> { ids ->
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, ChapterType> =
DataLoaderFactory.newDataLoader { ids ->
future {
transaction {
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.server.JavalinSetup.future
class ExtensionDataLoader : KotlinDataLoader<String, ExtensionType?> {
class ExtensionDataLoader : KotlinDataLoader<String, ExtensionType> {
override val dataLoaderName = "ExtensionDataLoader"
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<String, ExtensionType?> =
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<String, ExtensionType> =
DataLoaderFactory.newDataLoader { ids ->
future {
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 fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Long, ExtensionType?> =
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Long, ExtensionType> =
DataLoaderFactory.newDataLoader { ids ->
future {
transaction {

View File

@@ -25,10 +25,10 @@ import suwayomi.tachidesk.manga.model.table.CategoryMangaTable
import suwayomi.tachidesk.manga.model.table.MangaTable
import suwayomi.tachidesk.server.JavalinSetup.future
class MangaDataLoader : KotlinDataLoader<Int, MangaType?> {
class MangaDataLoader : KotlinDataLoader<Int, MangaType> {
override val dataLoaderName = "MangaDataLoader"
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, MangaType?> =
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Int, MangaType> =
DataLoaderFactory.newDataLoader { ids ->
future {
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.server.JavalinSetup.future
class GlobalMetaDataLoader : KotlinDataLoader<String, GlobalMetaType?> {
class GlobalMetaDataLoader : KotlinDataLoader<String, GlobalMetaType> {
override val dataLoaderName = "GlobalMetaDataLoader"
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<String, GlobalMetaType?> =
DataLoaderFactory.newDataLoader<String, GlobalMetaType?> { ids ->
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<String, GlobalMetaType> =
DataLoaderFactory.newDataLoader<String, GlobalMetaType> { ids ->
future {
transaction {
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.server.JavalinSetup.future
class SourceDataLoader : KotlinDataLoader<Long, SourceType?> {
class SourceDataLoader : KotlinDataLoader<Long, SourceType> {
override val dataLoaderName = "SourceDataLoader"
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Long, SourceType?> =
override fun getDataLoader(graphQLContext: GraphQLContext): DataLoader<Long, SourceType> =
DataLoaderFactory.newDataLoader { ids ->
future {
transaction {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -28,7 +28,7 @@ class UpdateMutation {
)
@RequireAuth
fun updateLibrary(input: UpdateLibraryInput): CompletableFuture<DataFetcherResult<UpdateLibraryPayload?>> {
fun updateLibrary(input: UpdateLibraryInput): CompletableFuture<DataFetcherResult<UpdateLibraryPayload>> {
updater.addCategoriesToUpdateQueue(
Category.getCategoryList().filter { input.categories?.contains(it.id) ?: true },
clear = true,
@@ -60,7 +60,7 @@ class UpdateMutation {
)
@RequireAuth
fun updateLibraryManga(input: UpdateLibraryMangaInput): CompletableFuture<DataFetcherResult<UpdateLibraryMangaPayload?>> {
fun updateLibraryManga(input: UpdateLibraryMangaInput): CompletableFuture<DataFetcherResult<UpdateLibraryMangaPayload>> {
updateLibrary(
UpdateLibraryInput(
clientMutationId = input.clientMutationId,
@@ -92,7 +92,7 @@ class UpdateMutation {
)
@RequireAuth
fun updateCategoryManga(input: UpdateCategoryMangaInput): CompletableFuture<DataFetcherResult<UpdateCategoryMangaPayload?>> {
fun updateCategoryManga(input: UpdateCategoryMangaInput): CompletableFuture<DataFetcherResult<UpdateCategoryMangaPayload>> {
updateLibrary(
UpdateLibraryInput(
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.GraphQLRequest
import com.expediagroup.graphql.server.types.GraphQLServerRequest
import io.github.oshai.kotlinlogging.KotlinLogging
import io.javalin.http.Context
import io.javalin.http.UploadedFile
import io.javalin.json.JavalinJackson
@@ -19,11 +20,12 @@ import io.javalin.json.fromJsonString
import java.io.IOException
class JavalinGraphQLRequestParser : GraphQLRequestParser<Context> {
val jsonMapper = JavalinJackson()
private val logger = KotlinLogging.logger {}
@Suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE")
override suspend fun parseRequest(context: Context): GraphQLServerRequest? {
return try {
val jsonMapper = context.jsonMapper()
val contentType = context.contentType()
val formParam =
if (
@@ -77,7 +79,8 @@ class JavalinGraphQLRequestParser : GraphQLRequestParser<Context> {
)
}
}
} catch (_: IOException) {
} catch (e: IOException) {
logger.error(e) { "Error when parsing request" }
null
}
}

View File

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

View File

@@ -71,7 +71,7 @@ private class GraphqlDurationAsStringCoercing : Coercing<Duration, String> {
)
}
return try {
Duration.parse(input.value)
Duration.parse(input.value!!)
} catch (e: IllegalArgumentException) {
throw CoercingParseLiteralException(
"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()

View File

@@ -9,9 +9,6 @@ package suwayomi.tachidesk.graphql.server.subscriptions
import com.expediagroup.graphql.server.execution.GraphQLRequestHandler
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.javalin.http.Header
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.user.UserType
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