Compare commits
21 Commits
master
...
private/master
| Author | SHA1 | Date | |
|---|---|---|---|
| e7c368ad7e | |||
| 16a14e6ac2 | |||
| a2f29ec9dc | |||
| 82df985201 | |||
| 740db4f1ab | |||
| c4711dec00 | |||
| 75d8d172aa | |||
| 81fb8c395d | |||
| e93efa9627 | |||
| 03a95e6652 | |||
| c117d380a3 | |||
| 5bdb945406 | |||
| 3064f51d25 | |||
| edf376e3dd | |||
| fd54dc1356 | |||
| 84af8bb285 | |||
| e50a62d915 | |||
| ad5a575732 | |||
| dff66547b4 | |||
| 6fef27bb56 | |||
| 505e966653 |
@@ -67,7 +67,7 @@ jobs:
|
|||||||
export LD_PRELOAD="$(pwd)/scripts/resources/catch_abort.so"
|
export LD_PRELOAD="$(pwd)/scripts/resources/catch_abort.so"
|
||||||
JAR=$(ls ./server/build/*.jar| head -1)
|
JAR=$(ls ./server/build/*.jar| head -1)
|
||||||
set +e
|
set +e
|
||||||
timeout 30s java -DcrashOnFailedMigration=true \
|
timeout 30s java \
|
||||||
-Dsuwayomi.tachidesk.config.server.systemTrayEnabled=false \
|
-Dsuwayomi.tachidesk.config.server.systemTrayEnabled=false \
|
||||||
-Dsuwayomi.tachidesk.config.server.initialOpenInBrowserEnabled=false \
|
-Dsuwayomi.tachidesk.config.server.initialOpenInBrowserEnabled=false \
|
||||||
-Dsuwayomi.tachidesk.config.server.databaseType=POSTGRESQL \
|
-Dsuwayomi.tachidesk.config.server.databaseType=POSTGRESQL \
|
||||||
@@ -83,7 +83,7 @@ jobs:
|
|||||||
exit "$ecode"
|
exit "$ecode"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
timeout 30s java -DcrashOnFailedMigration=true \
|
timeout 30s java \
|
||||||
-Dsuwayomi.tachidesk.config.server.systemTrayEnabled=false \
|
-Dsuwayomi.tachidesk.config.server.systemTrayEnabled=false \
|
||||||
-Dsuwayomi.tachidesk.config.server.initialOpenInBrowserEnabled=false \
|
-Dsuwayomi.tachidesk.config.server.initialOpenInBrowserEnabled=false \
|
||||||
-jar "$JAR"
|
-jar "$JAR"
|
||||||
|
|||||||
@@ -9,6 +9,9 @@ package xyz.nulldev.androidcompat.util
|
|||||||
|
|
||||||
// adopted from: https://github.com/tachiyomiorg/tachiyomi/blob/4cefbce7c34e724b409b6ba127f3c6c5c346ad8d/app/src/main/java/eu/kanade/tachiyomi/util/storage/DiskUtil.kt
|
// adopted from: https://github.com/tachiyomiorg/tachiyomi/blob/4cefbce7c34e724b409b6ba127f3c6c5c346ad8d/app/src/main/java/eu/kanade/tachiyomi/util/storage/DiskUtil.kt
|
||||||
object SafePath {
|
object SafePath {
|
||||||
|
private const val MAX_FILENAME_CHARS = 240
|
||||||
|
private const val MAX_FILENAME_UTF8_BYTES = 240
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Mutate the given filename to make it valid for a FAT filesystem,
|
* Mutate the given filename to make it valid for a FAT filesystem,
|
||||||
* replacing any invalid characters with "_". This method doesn't allow hidden files (starting
|
* replacing any invalid characters with "_". This method doesn't allow hidden files (starting
|
||||||
@@ -27,9 +30,39 @@ object SafePath {
|
|||||||
sb.append('_')
|
sb.append('_')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Even though vfat allows 255 UCS-2 chars, we might eventually write to
|
|
||||||
// ext4 through a FUSE layer, so use that limit minus 15 reserved characters.
|
return truncateFilename(sb.toString())
|
||||||
return sb.toString().take(240)
|
}
|
||||||
|
|
||||||
|
private fun truncateFilename(filename: String): String {
|
||||||
|
// Keep a safety margin under common filesystem limits and satisfy both
|
||||||
|
// character count and UTF-8 byte-length constraints.
|
||||||
|
val output = StringBuilder(minOf(filename.length, MAX_FILENAME_CHARS))
|
||||||
|
var usedBytes = 0
|
||||||
|
var index = 0
|
||||||
|
|
||||||
|
while (index < filename.length && output.length < MAX_FILENAME_CHARS) {
|
||||||
|
val codePoint = Character.codePointAt(filename, index)
|
||||||
|
val codePointBytes = utf8ByteCount(codePoint)
|
||||||
|
|
||||||
|
if (usedBytes + codePointBytes > MAX_FILENAME_UTF8_BYTES) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
output.appendCodePoint(codePoint)
|
||||||
|
usedBytes += codePointBytes
|
||||||
|
index += Character.charCount(codePoint)
|
||||||
|
}
|
||||||
|
|
||||||
|
return output.toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun utf8ByteCount(codePoint: Int): Int =
|
||||||
|
when {
|
||||||
|
codePoint <= 0x7f -> 1
|
||||||
|
codePoint <= 0x7ff -> 2
|
||||||
|
codePoint <= 0xffff -> 3
|
||||||
|
else -> 4
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -55,7 +55,6 @@ import dev.datlag.kcef.KCEF
|
|||||||
import dev.datlag.kcef.KCEFBrowser
|
import dev.datlag.kcef.KCEFBrowser
|
||||||
import dev.datlag.kcef.KCEFClient
|
import dev.datlag.kcef.KCEFClient
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
import kotlinx.serialization.decodeFromString
|
|
||||||
import kotlinx.serialization.json.Json
|
import kotlinx.serialization.json.Json
|
||||||
import org.cef.CefSettings
|
import org.cef.CefSettings
|
||||||
import org.cef.browser.CefBrowser
|
import org.cef.browser.CefBrowser
|
||||||
@@ -88,7 +87,6 @@ import java.io.BufferedWriter
|
|||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
import java.util.concurrent.Executor
|
import java.util.concurrent.Executor
|
||||||
import kotlin.collections.Map
|
|
||||||
import kotlin.reflect.KClass
|
import kotlin.reflect.KClass
|
||||||
import kotlin.reflect.KFunction
|
import kotlin.reflect.KFunction
|
||||||
import kotlin.reflect.full.declaredMemberFunctions
|
import kotlin.reflect.full.declaredMemberFunctions
|
||||||
|
|||||||
+6
-1
@@ -10,10 +10,15 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|||||||
- .
|
- .
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
- .
|
- (Database/H2) Use the latest H2 database engine
|
||||||
|
- (Startup) Crash on startup if an unrecoverable error happens
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
- (CloudFlareInterceptor) Don't send the `cf_clearance` cookie back to Flaresolverr
|
||||||
- (WebUI) Handle serving non-default webui with "bundled"
|
- (WebUI) Handle serving non-default webui with "bundled"
|
||||||
|
- (WebUI) Wait until WebUI is ready to open in browser
|
||||||
|
- (Downloads) Truncate filenames by byte length to prevent "File name too long" IO errors
|
||||||
|
- (Extension) Do not indicate an update is available when the extension is not installed
|
||||||
|
|
||||||
## [v2.2.2100] + [WebUI: v20260508.01] - 2026-05-08
|
## [v2.2.2100] + [WebUI: v20260508.01] - 2026-05-08
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -18,7 +18,7 @@ RUN if [ -n "$TACHIDESK_ABORT_HANDLER_DOWNLOAD_URL" ]; then \
|
|||||||
# Build the server jar from source
|
# Build the server jar from source
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY . .
|
COPY . .
|
||||||
RUN GRADLE_OPTS="-Xmx4g" ./gradlew :server:shadowJar --no-daemon -x test
|
RUN ./gradlew :server:shadowJar --no-daemon -x test
|
||||||
|
|
||||||
FROM eclipse-temurin:25.0.3_9-jre-noble
|
FROM eclipse-temurin:25.0.3_9-jre-noble
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
---
|
---
|
||||||
services:
|
services:
|
||||||
suwayomi:
|
suwayomi:
|
||||||
build: .
|
build:
|
||||||
|
context: .
|
||||||
|
args:
|
||||||
|
TACHIDESK_KCEF: "y"
|
||||||
|
TARGETPLATFORM: linux/amd64
|
||||||
platform: linux/amd64
|
platform: linux/amd64
|
||||||
image: registry.achmad.dev/suwayomi-server:latest
|
image: registry.achmad.dev/suwayomi-server:latest
|
||||||
# user: 1000:1000
|
# user: 1000:1000
|
||||||
|
|||||||
+5
-1
@@ -1,7 +1,11 @@
|
|||||||
---
|
---
|
||||||
services:
|
services:
|
||||||
suwayomi:
|
suwayomi:
|
||||||
build: .
|
build:
|
||||||
|
context: .
|
||||||
|
args:
|
||||||
|
TACHIDESK_KCEF: "y"
|
||||||
|
TARGETPLATFORM: linux/amd64
|
||||||
platform: linux/amd64
|
platform: linux/amd64
|
||||||
image: registry.achmad.dev/suwayomi-server:latest
|
image: registry.achmad.dev/suwayomi-server:latest
|
||||||
# user: 1000:1000
|
# user: 1000:1000
|
||||||
|
|||||||
@@ -4,15 +4,15 @@ coroutines = "1.11.0"
|
|||||||
serialization = "1.11.0"
|
serialization = "1.11.0"
|
||||||
jvmTarget = "21"
|
jvmTarget = "21"
|
||||||
okhttp = "5.3.2" # Major version is locked by Tachiyomi extensions
|
okhttp = "5.3.2" # Major version is locked by Tachiyomi extensions
|
||||||
javalin = "7.2.0"
|
javalin = "7.2.2"
|
||||||
jte = "3.2.4"
|
jte = "3.2.4"
|
||||||
jackson = "3.1.2" # jackson version locked by javalin, ref: `io.javalin.core.util.OptionalDependency`
|
jackson = "3.1.3" # jackson version locked by javalin, ref: `io.javalin.core.util.OptionalDependency`
|
||||||
exposed = "0.61.0"
|
exposed = "1.2.0"
|
||||||
dex2jar = "2.4.36"
|
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 = "8.9.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"
|
||||||
@@ -37,7 +37,7 @@ serialization-xml-core = { module = "io.github.pdvrieze.xmlutil:core", version.r
|
|||||||
serialization-xml = { module = "io.github.pdvrieze.xmlutil:serialization-jvm", version.ref = "xmlserialization" }
|
serialization-xml = { module = "io.github.pdvrieze.xmlutil:serialization-jvm", version.ref = "xmlserialization" }
|
||||||
|
|
||||||
# Logging
|
# Logging
|
||||||
slf4japi = "org.slf4j:slf4j-api:2.0.17"
|
slf4japi = "org.slf4j:slf4j-api:2.0.18"
|
||||||
logback = "ch.qos.logback:logback-classic:1.5.32"
|
logback = "ch.qos.logback:logback-classic:1.5.32"
|
||||||
kotlinlogging = "io.github.oshai:kotlin-logging-jvm:8.0.02"
|
kotlinlogging = "io.github.oshai:kotlin-logging-jvm:8.0.02"
|
||||||
|
|
||||||
@@ -54,7 +54,7 @@ javalin-openapi = { module = "io.javalin:javalin-openapi", version.ref = "javali
|
|||||||
javalin-rendering = { module = "io.javalin:javalin-rendering-jte", version.ref = "javalin" }
|
javalin-rendering = { module = "io.javalin:javalin-rendering-jte", version.ref = "javalin" }
|
||||||
jackson-databind = { module = "tools.jackson.core:jackson-databind", version.ref = "jackson" }
|
jackson-databind = { module = "tools.jackson.core:jackson-databind", version.ref = "jackson" }
|
||||||
jackson-kotlin = { module = "tools.jackson.module:jackson-module-kotlin", version.ref = "jackson" }
|
jackson-kotlin = { module = "tools.jackson.module:jackson-module-kotlin", version.ref = "jackson" }
|
||||||
jackson-annotations = "com.fasterxml.jackson.core:jackson-annotations:2.20"
|
jackson-annotations = "com.fasterxml.jackson.core:jackson-annotations:2.21"
|
||||||
jte = { module = "gg.jte:jte", version.ref = "jte" }
|
jte = { module = "gg.jte:jte", version.ref = "jte" }
|
||||||
kte = { module = "gg.jte:jte-kotlin", version.ref = "jte" }
|
kte = { module = "gg.jte:jte-kotlin", version.ref = "jte" }
|
||||||
|
|
||||||
@@ -68,12 +68,13 @@ exposed-core = { module = "org.jetbrains.exposed:exposed-core", version.ref = "e
|
|||||||
exposed-dao = { module = "org.jetbrains.exposed:exposed-dao", version.ref = "exposed" }
|
exposed-dao = { module = "org.jetbrains.exposed:exposed-dao", version.ref = "exposed" }
|
||||||
exposed-jdbc = { module = "org.jetbrains.exposed:exposed-jdbc", version.ref = "exposed" }
|
exposed-jdbc = { module = "org.jetbrains.exposed:exposed-jdbc", version.ref = "exposed" }
|
||||||
exposed-javatime = { module = "org.jetbrains.exposed:exposed-java-time", version.ref = "exposed" }
|
exposed-javatime = { module = "org.jetbrains.exposed:exposed-java-time", version.ref = "exposed" }
|
||||||
|
exposed-kotlintime = { module = "org.jetbrains.exposed:exposed-kotlin-datetime", version.ref = "exposed" }
|
||||||
postgres = "org.postgresql:postgresql:42.7.11"
|
postgres = "org.postgresql:postgresql:42.7.11"
|
||||||
h2 = "com.h2database:h2:1.4.200" # current database driver, can't update to h2 v2 without sql migration
|
h2 = "com.h2database:h2:2.4.240"
|
||||||
hikaricp = "com.zaxxer:HikariCP:7.0.2"
|
hikaricp = "com.zaxxer:HikariCP:7.0.2"
|
||||||
|
|
||||||
# Exposed Migrations
|
# Exposed Migrations
|
||||||
exposed-migrations = "com.github.Suwayomi:exposed-migrations:3.8.0"
|
exposed-migrations = "com.github.Suwayomi:exposed-migrations:3.10.1"
|
||||||
|
|
||||||
# Dependency Injection
|
# Dependency Injection
|
||||||
koin-core = { module = "io.insert-koin:koin-core", version.ref = "koin" }
|
koin-core = { module = "io.insert-koin:koin-core", version.ref = "koin" }
|
||||||
@@ -115,7 +116,7 @@ appdirs = "ca.gosyer:kotlin-multiplatform-appdirs:2.0.0"
|
|||||||
cache4k = "io.github.reactivecircus.cache4k:cache4k:0.14.0"
|
cache4k = "io.github.reactivecircus.cache4k:cache4k:0.14.0"
|
||||||
zip4j = "net.lingala.zip4j:zip4j:2.11.6"
|
zip4j = "net.lingala.zip4j:zip4j:2.11.6"
|
||||||
commonscompress = "org.apache.commons:commons-compress:1.28.0"
|
commonscompress = "org.apache.commons:commons-compress:1.28.0"
|
||||||
junrar = "com.github.junrar:junrar:7.5.10"
|
junrar = "com.github.junrar:junrar:7.6.0"
|
||||||
|
|
||||||
# AES/CBC/PKCS7Padding Cypher provider
|
# AES/CBC/PKCS7Padding Cypher provider
|
||||||
bouncycastle = "org.bouncycastle:bcprov-jdk18on:1.84"
|
bouncycastle = "org.bouncycastle:bcprov-jdk18on:1.84"
|
||||||
@@ -242,6 +243,7 @@ exposed = [
|
|||||||
"exposed-dao",
|
"exposed-dao",
|
||||||
"exposed-jdbc",
|
"exposed-jdbc",
|
||||||
"exposed-javatime",
|
"exposed-javatime",
|
||||||
|
"exposed-kotlintime",
|
||||||
]
|
]
|
||||||
systemtray = [
|
systemtray = [
|
||||||
"systemtray-core",
|
"systemtray-core",
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.0-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.1-bin.zip
|
||||||
networkTimeout=10000
|
networkTimeout=10000
|
||||||
retries=0
|
retries=0
|
||||||
retryBackOffMs=500
|
retryBackOffMs=500
|
||||||
|
|||||||
@@ -171,6 +171,7 @@ tasks {
|
|||||||
"Implementation-Vendor" to "The Suwayomi Project",
|
"Implementation-Vendor" to "The Suwayomi Project",
|
||||||
"Specification-Version" to getTachideskVersion(),
|
"Specification-Version" to getTachideskVersion(),
|
||||||
"Implementation-Version" to getTachideskRevision(),
|
"Implementation-Version" to getTachideskRevision(),
|
||||||
|
"Multi-Release" to true, // needed for polyglot
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
archiveBaseName.set(rootProject.name)
|
archiveBaseName.set(rootProject.name)
|
||||||
|
|||||||
-1
@@ -2,7 +2,6 @@ package suwayomi.tachidesk.server.settings.generation
|
|||||||
|
|
||||||
import suwayomi.tachidesk.server.settings.SettingsRegistry
|
import suwayomi.tachidesk.server.settings.SettingsRegistry
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import kotlin.text.appendLine
|
|
||||||
|
|
||||||
object SettingsBackupServerSettingsGenerator {
|
object SettingsBackupServerSettingsGenerator {
|
||||||
fun generate(
|
fun generate(
|
||||||
|
|||||||
-1
@@ -2,7 +2,6 @@ package suwayomi.tachidesk.server.settings.generation
|
|||||||
|
|
||||||
import suwayomi.tachidesk.server.settings.SettingsRegistry
|
import suwayomi.tachidesk.server.settings.SettingsRegistry
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import kotlin.text.appendLine
|
|
||||||
|
|
||||||
object SettingsBackupSettingsHandlerGenerator {
|
object SettingsBackupSettingsHandlerGenerator {
|
||||||
fun generate(
|
fun generate(
|
||||||
|
|||||||
-1
@@ -2,7 +2,6 @@ package suwayomi.tachidesk.server.settings.generation
|
|||||||
|
|
||||||
import suwayomi.tachidesk.server.settings.SettingsRegistry
|
import suwayomi.tachidesk.server.settings.SettingsRegistry
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import kotlin.text.appendLine
|
|
||||||
|
|
||||||
object SettingsGraphqlTypeGenerator {
|
object SettingsGraphqlTypeGenerator {
|
||||||
fun generate(
|
fun generate(
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ import kotlinx.coroutines.flow.drop
|
|||||||
import kotlinx.coroutines.flow.launchIn
|
import kotlinx.coroutines.flow.launchIn
|
||||||
import kotlinx.coroutines.flow.mapLatest
|
import kotlinx.coroutines.flow.mapLatest
|
||||||
import kotlinx.coroutines.flow.onEach
|
import kotlinx.coroutines.flow.onEach
|
||||||
import org.jetbrains.exposed.sql.SortOrder
|
import org.jetbrains.exposed.v1.core.SortOrder
|
||||||
import suwayomi.tachidesk.graphql.types.AuthMode
|
import suwayomi.tachidesk.graphql.types.AuthMode
|
||||||
import suwayomi.tachidesk.graphql.types.CbzMediaType
|
import suwayomi.tachidesk.graphql.types.CbzMediaType
|
||||||
import suwayomi.tachidesk.graphql.types.DatabaseType
|
import suwayomi.tachidesk.graphql.types.DatabaseType
|
||||||
@@ -56,16 +56,14 @@ import suwayomi.tachidesk.server.settings.PathSetting
|
|||||||
import suwayomi.tachidesk.server.settings.SettingGroup
|
import suwayomi.tachidesk.server.settings.SettingGroup
|
||||||
import suwayomi.tachidesk.server.settings.SettingsRegistry
|
import suwayomi.tachidesk.server.settings.SettingsRegistry
|
||||||
import suwayomi.tachidesk.server.settings.StringSetting
|
import suwayomi.tachidesk.server.settings.StringSetting
|
||||||
|
import uy.kohesive.injekt.injectLazy
|
||||||
import xyz.nulldev.ts.config.GlobalConfigManager
|
import xyz.nulldev.ts.config.GlobalConfigManager
|
||||||
import xyz.nulldev.ts.config.SystemPropertyOverridableConfigModule
|
import xyz.nulldev.ts.config.SystemPropertyOverridableConfigModule
|
||||||
import kotlin.collections.associate
|
|
||||||
import kotlin.getValue
|
|
||||||
import kotlin.time.Duration
|
import kotlin.time.Duration
|
||||||
import kotlin.time.Duration.Companion.days
|
import kotlin.time.Duration.Companion.days
|
||||||
import kotlin.time.Duration.Companion.hours
|
import kotlin.time.Duration.Companion.hours
|
||||||
import kotlin.time.Duration.Companion.minutes
|
import kotlin.time.Duration.Companion.minutes
|
||||||
import kotlin.time.Duration.Companion.seconds
|
import kotlin.time.Duration.Companion.seconds
|
||||||
import uy.kohesive.injekt.injectLazy
|
|
||||||
|
|
||||||
val mutableConfigValueScope = CoroutineScope(SupervisorJob() + Dispatchers.Default)
|
val mutableConfigValueScope = CoroutineScope(SupervisorJob() + Dispatchers.Default)
|
||||||
|
|
||||||
@@ -582,7 +580,7 @@ class ServerConfig(
|
|||||||
privacySafe = true,
|
privacySafe = true,
|
||||||
defaultValue = SortOrder.DESC,
|
defaultValue = SortOrder.DESC,
|
||||||
enumClass = SortOrder::class,
|
enumClass = SortOrder::class,
|
||||||
typeInfo = SettingsRegistry.PartialTypeInfo(imports = listOf("org.jetbrains.exposed.sql.SortOrder")),
|
typeInfo = SettingsRegistry.PartialTypeInfo(imports = listOf("org.jetbrains.exposed.v1.core.SortOrder")),
|
||||||
)
|
)
|
||||||
|
|
||||||
val authMode: MutableStateFlow<AuthMode> by EnumSetting(
|
val authMode: MutableStateFlow<AuthMode> by EnumSetting(
|
||||||
|
|||||||
-1
@@ -2,7 +2,6 @@ package suwayomi.tachidesk.server.settings
|
|||||||
|
|
||||||
import com.typesafe.config.ConfigValue
|
import com.typesafe.config.ConfigValue
|
||||||
import com.typesafe.config.parser.ConfigDocument
|
import com.typesafe.config.parser.ConfigDocument
|
||||||
import kotlin.collections.find
|
|
||||||
import kotlin.reflect.KClass
|
import kotlin.reflect.KClass
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package eu.kanade.tachiyomi.network
|
|||||||
|
|
||||||
import kotlinx.coroutines.suspendCancellableCoroutine
|
import kotlinx.coroutines.suspendCancellableCoroutine
|
||||||
import kotlinx.serialization.DeserializationStrategy
|
import kotlinx.serialization.DeserializationStrategy
|
||||||
import kotlinx.serialization.ExperimentalSerializationApi
|
|
||||||
import kotlinx.serialization.json.Json
|
import kotlinx.serialization.json.Json
|
||||||
import kotlinx.serialization.json.okio.decodeFromBufferedSource
|
import kotlinx.serialization.json.okio.decodeFromBufferedSource
|
||||||
import kotlinx.serialization.serializer
|
import kotlinx.serialization.serializer
|
||||||
|
|||||||
+6
-3
@@ -103,7 +103,7 @@ class CloudflareInterceptor(
|
|||||||
companion object {
|
companion object {
|
||||||
private val ERROR_CODES = listOf(403, 503)
|
private val ERROR_CODES = listOf(403, 503)
|
||||||
private val SERVER_CHECK = arrayOf("cloudflare-nginx", "cloudflare")
|
private val SERVER_CHECK = arrayOf("cloudflare-nginx", "cloudflare")
|
||||||
private val COOKIE_NAMES = listOf("cf_clearance")
|
val COOKIE_NAMES = listOf("cf_clearance")
|
||||||
private val CHROME_IMAGE_TEMPLATE_REGEX = Regex("""<title>(.*?) \(\d+×\d+\)</title>""")
|
private val CHROME_IMAGE_TEMPLATE_REGEX = Regex("""<title>(.*?) \(\d+×\d+\)</title>""")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -205,8 +205,11 @@ object CFClearance {
|
|||||||
session = serverConfig.flareSolverrSessionName.value,
|
session = serverConfig.flareSolverrSessionName.value,
|
||||||
sessionTtlMinutes = serverConfig.flareSolverrSessionTtl.value,
|
sessionTtlMinutes = serverConfig.flareSolverrSessionTtl.value,
|
||||||
cookies =
|
cookies =
|
||||||
network.cookieStore.get(originalRequest.url).map {
|
network.cookieStore
|
||||||
FlareSolverCookie(it.name, it.value)
|
.get(originalRequest.url)
|
||||||
|
.filter { it.name !in CloudflareInterceptor.COOKIE_NAMES }
|
||||||
|
.map { cookie ->
|
||||||
|
FlareSolverCookie(cookie.name, cookie.value)
|
||||||
},
|
},
|
||||||
returnOnlyCookies = onlyCookies,
|
returnOnlyCookies = onlyCookies,
|
||||||
maxTimeout = timeout.inWholeMilliseconds.toInt(),
|
maxTimeout = timeout.inWholeMilliseconds.toInt(),
|
||||||
|
|||||||
@@ -36,10 +36,11 @@ import nl.adaptivity.xmlutil.ExperimentalXmlUtilApi
|
|||||||
import nl.adaptivity.xmlutil.core.KtXmlReader
|
import nl.adaptivity.xmlutil.core.KtXmlReader
|
||||||
import nl.adaptivity.xmlutil.serialization.XML
|
import nl.adaptivity.xmlutil.serialization.XML
|
||||||
import org.apache.commons.compress.archivers.zip.ZipFile
|
import org.apache.commons.compress.archivers.zip.ZipFile
|
||||||
import org.jetbrains.exposed.sql.insert
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.insertAndGetId
|
import org.jetbrains.exposed.v1.jdbc.insert
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.jdbc.insertAndGetId
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
import suwayomi.tachidesk.manga.impl.util.source.GetCatalogueSource.registerCatalogueSource
|
import suwayomi.tachidesk.manga.impl.util.source.GetCatalogueSource.registerCatalogueSource
|
||||||
import suwayomi.tachidesk.manga.impl.util.storage.ImageUtil
|
import suwayomi.tachidesk.manga.impl.util.storage.ImageUtil
|
||||||
import suwayomi.tachidesk.manga.model.table.ExtensionTable
|
import suwayomi.tachidesk.manga.model.table.ExtensionTable
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
package suwayomi.tachidesk.global.impl
|
package suwayomi.tachidesk.global.impl
|
||||||
|
|
||||||
import org.jetbrains.exposed.dao.id.EntityID
|
import org.jetbrains.exposed.v1.core.dao.id.EntityID
|
||||||
import org.jetbrains.exposed.sql.batchInsert
|
import org.jetbrains.exposed.v1.core.inList
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.core.statements.BatchUpdateStatement
|
||||||
import org.jetbrains.exposed.sql.statements.BatchUpdateStatement
|
import org.jetbrains.exposed.v1.jdbc.batchInsert
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.statements.toExecutable
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
import suwayomi.tachidesk.global.model.table.GlobalMetaTable
|
import suwayomi.tachidesk.global.model.table.GlobalMetaTable
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -32,13 +34,14 @@ object GlobalMeta {
|
|||||||
val (existingMeta, newMeta) = meta.toList().partition { (key) -> key in dbMetaMap.keys }
|
val (existingMeta, newMeta) = meta.toList().partition { (key) -> key in dbMetaMap.keys }
|
||||||
|
|
||||||
if (existingMeta.isNotEmpty()) {
|
if (existingMeta.isNotEmpty()) {
|
||||||
BatchUpdateStatement(GlobalMetaTable).apply {
|
BatchUpdateStatement(GlobalMetaTable)
|
||||||
|
.apply {
|
||||||
existingMeta.forEach { (key, value) ->
|
existingMeta.forEach { (key, value) ->
|
||||||
addBatch(EntityID(dbMetaMap[key]!![GlobalMetaTable.id].value, GlobalMetaTable))
|
addBatch(EntityID(dbMetaMap[key]!![GlobalMetaTable.id].value, GlobalMetaTable))
|
||||||
this[GlobalMetaTable.value] = value
|
this[GlobalMetaTable.value] = value
|
||||||
}
|
}
|
||||||
execute(this@transaction)
|
}.toExecutable()
|
||||||
}
|
.execute(this@transaction)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (newMeta.isNotEmpty()) {
|
if (newMeta.isNotEmpty()) {
|
||||||
|
|||||||
@@ -7,12 +7,12 @@ package suwayomi.tachidesk.global.model.table
|
|||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
import org.jetbrains.exposed.dao.id.IntIdTable
|
import org.jetbrains.exposed.v1.core.dao.id.IntIdTable
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Metadata storage for clients, server/global level.
|
* Metadata storage for clients, server/global level.
|
||||||
*/
|
*/
|
||||||
object GlobalMetaTable : IntIdTable() {
|
object GlobalMetaTable : IntIdTable() {
|
||||||
val key = varchar("key", 256)
|
val key = varchar("meta_key", 256)
|
||||||
val value = varchar("value", 4096)
|
val value = varchar("value", 4096)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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> 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()
|
|
||||||
}
|
|
||||||
@@ -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,6 @@ class CustomCacheMap<K, V> : CacheMap<K, V> {
|
|||||||
cache.clear()
|
cache.clear()
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun size(): Int = cache.size
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,10 +11,10 @@ import com.expediagroup.graphql.dataloader.KotlinDataLoader
|
|||||||
import graphql.GraphQLContext
|
import graphql.GraphQLContext
|
||||||
import org.dataloader.DataLoader
|
import org.dataloader.DataLoader
|
||||||
import org.dataloader.DataLoaderFactory
|
import org.dataloader.DataLoaderFactory
|
||||||
import org.jetbrains.exposed.sql.Slf4jSqlDebugLogger
|
import org.jetbrains.exposed.v1.core.Slf4jSqlDebugLogger
|
||||||
import org.jetbrains.exposed.sql.addLogger
|
import org.jetbrains.exposed.v1.core.inList
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
import suwayomi.tachidesk.graphql.types.CategoryNodeList
|
import suwayomi.tachidesk.graphql.types.CategoryNodeList
|
||||||
import suwayomi.tachidesk.graphql.types.CategoryNodeList.Companion.toNodeList
|
import suwayomi.tachidesk.graphql.types.CategoryNodeList.Companion.toNodeList
|
||||||
import suwayomi.tachidesk.graphql.types.CategoryType
|
import suwayomi.tachidesk.graphql.types.CategoryType
|
||||||
|
|||||||
+36
-32
@@ -11,24 +11,28 @@ import com.expediagroup.graphql.dataloader.KotlinDataLoader
|
|||||||
import graphql.GraphQLContext
|
import graphql.GraphQLContext
|
||||||
import org.dataloader.DataLoader
|
import org.dataloader.DataLoader
|
||||||
import org.dataloader.DataLoaderFactory
|
import org.dataloader.DataLoaderFactory
|
||||||
import org.jetbrains.exposed.sql.Slf4jSqlDebugLogger
|
import org.jetbrains.exposed.v1.core.Slf4jSqlDebugLogger
|
||||||
import org.jetbrains.exposed.sql.SortOrder
|
import org.jetbrains.exposed.v1.core.SortOrder
|
||||||
import org.jetbrains.exposed.sql.addLogger
|
import org.jetbrains.exposed.v1.core.and
|
||||||
import org.jetbrains.exposed.sql.and
|
import org.jetbrains.exposed.v1.core.count
|
||||||
import org.jetbrains.exposed.sql.count
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.core.greater
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.core.greaterEq
|
||||||
|
import org.jetbrains.exposed.v1.core.inList
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.select
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
import suwayomi.tachidesk.graphql.types.ChapterNodeList
|
import suwayomi.tachidesk.graphql.types.ChapterNodeList
|
||||||
import suwayomi.tachidesk.graphql.types.ChapterNodeList.Companion.toNodeList
|
import suwayomi.tachidesk.graphql.types.ChapterNodeList.Companion.toNodeList
|
||||||
import suwayomi.tachidesk.graphql.types.ChapterType
|
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 +52,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 +72,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 +94,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 +116,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 +161,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 +181,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 +201,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 +221,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 +241,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 +261,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)
|
||||||
|
|||||||
+8
-8
@@ -11,19 +11,19 @@ import com.expediagroup.graphql.dataloader.KotlinDataLoader
|
|||||||
import graphql.GraphQLContext
|
import graphql.GraphQLContext
|
||||||
import org.dataloader.DataLoader
|
import org.dataloader.DataLoader
|
||||||
import org.dataloader.DataLoaderFactory
|
import org.dataloader.DataLoaderFactory
|
||||||
import org.jetbrains.exposed.sql.Slf4jSqlDebugLogger
|
import org.jetbrains.exposed.v1.core.Slf4jSqlDebugLogger
|
||||||
import org.jetbrains.exposed.sql.addLogger
|
import org.jetbrains.exposed.v1.core.inList
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
import suwayomi.tachidesk.graphql.types.ExtensionType
|
import suwayomi.tachidesk.graphql.types.ExtensionType
|
||||||
import suwayomi.tachidesk.manga.model.table.ExtensionTable
|
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 {
|
||||||
|
|||||||
@@ -12,11 +12,13 @@ import graphql.GraphQLContext
|
|||||||
import org.dataloader.DataLoader
|
import org.dataloader.DataLoader
|
||||||
import org.dataloader.DataLoaderFactory
|
import org.dataloader.DataLoaderFactory
|
||||||
import org.dataloader.DataLoaderOptions
|
import org.dataloader.DataLoaderOptions
|
||||||
import org.jetbrains.exposed.sql.Slf4jSqlDebugLogger
|
import org.jetbrains.exposed.v1.core.Slf4jSqlDebugLogger
|
||||||
import org.jetbrains.exposed.sql.addLogger
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.andWhere
|
import org.jetbrains.exposed.v1.core.inList
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.core.isNull
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.andWhere
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
import suwayomi.tachidesk.graphql.cache.CustomCacheMap
|
import suwayomi.tachidesk.graphql.cache.CustomCacheMap
|
||||||
import suwayomi.tachidesk.graphql.types.MangaNodeList
|
import suwayomi.tachidesk.graphql.types.MangaNodeList
|
||||||
import suwayomi.tachidesk.graphql.types.MangaNodeList.Companion.toNodeList
|
import suwayomi.tachidesk.graphql.types.MangaNodeList.Companion.toNodeList
|
||||||
@@ -25,10 +27,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 +124,6 @@ class MangaForIdsDataLoader : KotlinDataLoader<List<Int>, MangaNodeList> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
DataLoaderOptions.newOptions().setCacheMap(CustomCacheMap<List<Int>, MangaNodeList>()),
|
DataLoaderOptions.newOptions().setCacheMap(CustomCacheMap<List<Int>, MangaNodeList>()).build(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,10 +4,10 @@ import com.expediagroup.graphql.dataloader.KotlinDataLoader
|
|||||||
import graphql.GraphQLContext
|
import graphql.GraphQLContext
|
||||||
import org.dataloader.DataLoader
|
import org.dataloader.DataLoader
|
||||||
import org.dataloader.DataLoaderFactory
|
import org.dataloader.DataLoaderFactory
|
||||||
import org.jetbrains.exposed.sql.Slf4jSqlDebugLogger
|
import org.jetbrains.exposed.v1.core.Slf4jSqlDebugLogger
|
||||||
import org.jetbrains.exposed.sql.addLogger
|
import org.jetbrains.exposed.v1.core.inList
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
import suwayomi.tachidesk.global.model.table.GlobalMetaTable
|
import suwayomi.tachidesk.global.model.table.GlobalMetaTable
|
||||||
import suwayomi.tachidesk.graphql.types.CategoryMetaType
|
import suwayomi.tachidesk.graphql.types.CategoryMetaType
|
||||||
import suwayomi.tachidesk.graphql.types.ChapterMetaType
|
import suwayomi.tachidesk.graphql.types.ChapterMetaType
|
||||||
@@ -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)
|
||||||
|
|||||||
@@ -11,10 +11,10 @@ import com.expediagroup.graphql.dataloader.KotlinDataLoader
|
|||||||
import graphql.GraphQLContext
|
import graphql.GraphQLContext
|
||||||
import org.dataloader.DataLoader
|
import org.dataloader.DataLoader
|
||||||
import org.dataloader.DataLoaderFactory
|
import org.dataloader.DataLoaderFactory
|
||||||
import org.jetbrains.exposed.sql.Slf4jSqlDebugLogger
|
import org.jetbrains.exposed.v1.core.Slf4jSqlDebugLogger
|
||||||
import org.jetbrains.exposed.sql.addLogger
|
import org.jetbrains.exposed.v1.core.inList
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
import suwayomi.tachidesk.graphql.types.SourceNodeList
|
import suwayomi.tachidesk.graphql.types.SourceNodeList
|
||||||
import suwayomi.tachidesk.graphql.types.SourceNodeList.Companion.toNodeList
|
import suwayomi.tachidesk.graphql.types.SourceNodeList.Companion.toNodeList
|
||||||
import suwayomi.tachidesk.graphql.types.SourceType
|
import suwayomi.tachidesk.graphql.types.SourceType
|
||||||
@@ -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 {
|
||||||
|
|||||||
@@ -11,10 +11,10 @@ import com.expediagroup.graphql.dataloader.KotlinDataLoader
|
|||||||
import graphql.GraphQLContext
|
import graphql.GraphQLContext
|
||||||
import org.dataloader.DataLoader
|
import org.dataloader.DataLoader
|
||||||
import org.dataloader.DataLoaderFactory
|
import org.dataloader.DataLoaderFactory
|
||||||
import org.jetbrains.exposed.sql.Slf4jSqlDebugLogger
|
import org.jetbrains.exposed.v1.core.Slf4jSqlDebugLogger
|
||||||
import org.jetbrains.exposed.sql.addLogger
|
import org.jetbrains.exposed.v1.core.inList
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
import suwayomi.tachidesk.graphql.types.TrackRecordNodeList
|
import suwayomi.tachidesk.graphql.types.TrackRecordNodeList
|
||||||
import suwayomi.tachidesk.graphql.types.TrackRecordNodeList.Companion.toNodeList
|
import suwayomi.tachidesk.graphql.types.TrackRecordNodeList.Companion.toNodeList
|
||||||
import suwayomi.tachidesk.graphql.types.TrackRecordType
|
import suwayomi.tachidesk.graphql.types.TrackRecordType
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -1,21 +1,23 @@
|
|||||||
|
@file:Suppress("RedundantNullableReturnType", "unused")
|
||||||
|
|
||||||
package suwayomi.tachidesk.graphql.mutations
|
package suwayomi.tachidesk.graphql.mutations
|
||||||
|
|
||||||
import graphql.execution.DataFetcherResult
|
import org.jetbrains.exposed.v1.core.LikePattern
|
||||||
import org.jetbrains.exposed.sql.LikePattern
|
import org.jetbrains.exposed.v1.core.Op
|
||||||
import org.jetbrains.exposed.sql.Op
|
import org.jetbrains.exposed.v1.core.and
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.inList
|
import org.jetbrains.exposed.v1.core.greaterEq
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.like
|
import org.jetbrains.exposed.v1.core.inList
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.minus
|
import org.jetbrains.exposed.v1.core.lessEq
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.plus
|
import org.jetbrains.exposed.v1.core.like
|
||||||
import org.jetbrains.exposed.sql.and
|
import org.jetbrains.exposed.v1.core.minus
|
||||||
import org.jetbrains.exposed.sql.deleteWhere
|
import org.jetbrains.exposed.v1.core.or
|
||||||
import org.jetbrains.exposed.sql.insertAndGetId
|
import org.jetbrains.exposed.v1.core.plus
|
||||||
import org.jetbrains.exposed.sql.or
|
import org.jetbrains.exposed.v1.jdbc.deleteWhere
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.jdbc.insertAndGetId
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
import org.jetbrains.exposed.sql.update
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
import suwayomi.tachidesk.graphql.asDataFetcherResult
|
import org.jetbrains.exposed.v1.jdbc.update
|
||||||
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 +44,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 +65,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 +90,7 @@ class CategoryMutation {
|
|||||||
} to category
|
} to category
|
||||||
}
|
}
|
||||||
|
|
||||||
DeleteCategoryMetaPayload(clientMutationId, meta, category)
|
return DeleteCategoryMetaPayload(clientMutationId, meta, category)
|
||||||
}
|
}
|
||||||
|
|
||||||
data class SetCategoryMetasItem(
|
data class SetCategoryMetasItem(
|
||||||
@@ -110,8 +110,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 +144,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 +165,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 +220,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 +289,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 +299,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 +316,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 +334,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 +371,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 +392,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 +436,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 +451,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 +489,7 @@ class CategoryMutation {
|
|||||||
} to mangas
|
} to mangas
|
||||||
}
|
}
|
||||||
|
|
||||||
DeleteCategoryPayload(clientMutationId, category, mangas)
|
return DeleteCategoryPayload(clientMutationId, category, mangas)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
data class UpdateMangaCategoriesPatch(
|
data class UpdateMangaCategoriesPatch(
|
||||||
@@ -547,8 +539,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 +549,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 +566,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,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,22 +1,24 @@
|
|||||||
|
@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.v1.core.LikePattern
|
||||||
import org.jetbrains.exposed.sql.LikePattern
|
import org.jetbrains.exposed.v1.core.Op
|
||||||
import org.jetbrains.exposed.sql.Op
|
import org.jetbrains.exposed.v1.core.and
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
|
import org.jetbrains.exposed.v1.core.dao.id.EntityID
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.inList
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.like
|
import org.jetbrains.exposed.v1.core.inList
|
||||||
import org.jetbrains.exposed.sql.and
|
import org.jetbrains.exposed.v1.core.like
|
||||||
import org.jetbrains.exposed.sql.deleteWhere
|
import org.jetbrains.exposed.v1.core.or
|
||||||
import org.jetbrains.exposed.sql.or
|
import org.jetbrains.exposed.v1.core.statements.BatchUpdateStatement
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.jdbc.deleteWhere
|
||||||
import org.jetbrains.exposed.sql.statements.BatchUpdateStatement
|
import org.jetbrains.exposed.v1.jdbc.select
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
import org.jetbrains.exposed.sql.update
|
import org.jetbrains.exposed.v1.jdbc.statements.toExecutable
|
||||||
import suwayomi.tachidesk.graphql.asDataFetcherResult
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.update
|
||||||
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
|
||||||
@@ -90,7 +92,8 @@ class ChapterMutation {
|
|||||||
if (patch.isRead != null || patch.isBookmarked != null || patch.lastPageRead != null) {
|
if (patch.isRead != null || patch.isBookmarked != null || patch.lastPageRead != null) {
|
||||||
val now = Instant.now().epochSecond
|
val now = Instant.now().epochSecond
|
||||||
|
|
||||||
BatchUpdateStatement(ChapterTable).apply {
|
BatchUpdateStatement(ChapterTable)
|
||||||
|
.apply {
|
||||||
ids.forEach { chapterId ->
|
ids.forEach { chapterId ->
|
||||||
addBatch(EntityID(chapterId, ChapterTable))
|
addBatch(EntityID(chapterId, ChapterTable))
|
||||||
patch.isRead?.also {
|
patch.isRead?.also {
|
||||||
@@ -104,8 +107,8 @@ class ChapterMutation {
|
|||||||
this[ChapterTable.lastReadAt] = now
|
this[ChapterTable.lastReadAt] = now
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
execute(this@transaction)
|
}.toExecutable()
|
||||||
}
|
.execute(this@transaction)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -120,8 +123,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 +133,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 +150,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 +167,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 +188,6 @@ class ChapterMutation {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
data class SetChapterMetaInput(
|
data class SetChapterMetaInput(
|
||||||
val clientMutationId: String? = null,
|
val clientMutationId: String? = null,
|
||||||
@@ -201,13 +200,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 +221,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 +246,7 @@ class ChapterMutation {
|
|||||||
} to chapter
|
} to chapter
|
||||||
}
|
}
|
||||||
|
|
||||||
DeleteChapterMetaPayload(clientMutationId, meta, chapter)
|
return DeleteChapterMetaPayload(clientMutationId, meta, chapter)
|
||||||
}
|
}
|
||||||
|
|
||||||
data class SetChapterMetasItem(
|
data class SetChapterMetasItem(
|
||||||
@@ -269,8 +266,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 +300,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 +321,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 +376,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 +400,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
|
||||||
@@ -468,4 +462,3 @@ class ChapterMutation {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
|
@file:Suppress("RedundantNullableReturnType", "unused")
|
||||||
|
|
||||||
package suwayomi.tachidesk.graphql.mutations
|
package suwayomi.tachidesk.graphql.mutations
|
||||||
|
|
||||||
import graphql.execution.DataFetcherResult
|
|
||||||
import kotlinx.coroutines.flow.first
|
import kotlinx.coroutines.flow.first
|
||||||
import kotlinx.coroutines.withTimeout
|
import kotlinx.coroutines.withTimeout
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.core.inList
|
||||||
import suwayomi.tachidesk.graphql.asDataFetcherResult
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
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 +32,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 +48,6 @@ class DownloadMutation {
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
data class DeleteDownloadedChapterInput(
|
data class DeleteDownloadedChapterInput(
|
||||||
val clientMutationId: String? = null,
|
val clientMutationId: String? = null,
|
||||||
@@ -60,13 +60,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 +73,6 @@ class DownloadMutation {
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
data class EnqueueChapterDownloadsInput(
|
data class EnqueueChapterDownloadsInput(
|
||||||
val clientMutationId: String? = null,
|
val clientMutationId: String? = null,
|
||||||
@@ -87,13 +85,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 +105,6 @@ class DownloadMutation {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
data class EnqueueChapterDownloadInput(
|
data class EnqueueChapterDownloadInput(
|
||||||
val clientMutationId: String? = null,
|
val clientMutationId: String? = null,
|
||||||
@@ -123,11 +117,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 +136,6 @@ class DownloadMutation {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
data class DequeueChapterDownloadsInput(
|
data class DequeueChapterDownloadsInput(
|
||||||
val clientMutationId: String? = null,
|
val clientMutationId: String? = null,
|
||||||
@@ -156,13 +148,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 +170,6 @@ class DownloadMutation {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
data class DequeueChapterDownloadInput(
|
data class DequeueChapterDownloadInput(
|
||||||
val clientMutationId: String? = null,
|
val clientMutationId: String? = null,
|
||||||
@@ -194,11 +182,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 +204,6 @@ class DownloadMutation {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
data class StartDownloaderInput(
|
data class StartDownloaderInput(
|
||||||
val clientMutationId: String? = null,
|
val clientMutationId: String? = null,
|
||||||
@@ -229,9 +215,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 +231,6 @@ class DownloadMutation {
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
data class StopDownloaderInput(
|
data class StopDownloaderInput(
|
||||||
val clientMutationId: String? = null,
|
val clientMutationId: String? = null,
|
||||||
@@ -258,9 +242,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 +258,6 @@ class DownloadMutation {
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
data class ClearDownloaderInput(
|
data class ClearDownloaderInput(
|
||||||
val clientMutationId: String? = null,
|
val clientMutationId: String? = null,
|
||||||
@@ -287,9 +269,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 +285,6 @@ class DownloadMutation {
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
data class ReorderChapterDownloadInput(
|
data class ReorderChapterDownloadInput(
|
||||||
val clientMutationId: String? = null,
|
val clientMutationId: String? = null,
|
||||||
@@ -318,11 +298,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(
|
||||||
@@ -339,4 +318,3 @@ class DownloadMutation {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,11 +1,14 @@
|
|||||||
|
@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
|
||||||
import graphql.execution.DataFetcherResult
|
|
||||||
import io.javalin.http.UploadedFile
|
import io.javalin.http.UploadedFile
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.core.inList
|
||||||
import suwayomi.tachidesk.graphql.asDataFetcherResult
|
import org.jetbrains.exposed.v1.core.neq
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
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 +78,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 +99,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 +121,6 @@ class ExtensionMutation {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
data class FetchExtensionsInput(
|
data class FetchExtensionsInput(
|
||||||
val clientMutationId: String? = null,
|
val clientMutationId: String? = null,
|
||||||
@@ -133,11 +132,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 +152,6 @@ class ExtensionMutation {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
data class InstallExternalExtensionInput(
|
data class InstallExternalExtensionInput(
|
||||||
val clientMutationId: String? = null,
|
val clientMutationId: String? = null,
|
||||||
@@ -167,13 +164,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 =
|
||||||
@@ -186,4 +180,3 @@ class ExtensionMutation {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
|
@file:Suppress("RedundantNullableReturnType", "unused")
|
||||||
|
|
||||||
package suwayomi.tachidesk.graphql.mutations
|
package suwayomi.tachidesk.graphql.mutations
|
||||||
|
|
||||||
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 +26,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 +58,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) {
|
||||||
@@ -77,4 +74,3 @@ class InfoMutation {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
+8
-11
@@ -1,10 +1,11 @@
|
|||||||
|
@file:Suppress("RedundantNullableReturnType", "unused")
|
||||||
|
|
||||||
package suwayomi.tachidesk.graphql.mutations
|
package suwayomi.tachidesk.graphql.mutations
|
||||||
|
|
||||||
import graphql.execution.DataFetcherResult
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
import org.jetbrains.exposed.sql.update
|
import org.jetbrains.exposed.v1.jdbc.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
|
||||||
|
|
||||||
@@ -137,4 +135,3 @@ class KoreaderSyncMutation {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,18 +1,18 @@
|
|||||||
|
@file:Suppress("RedundantNullableReturnType", "unused")
|
||||||
|
|
||||||
package suwayomi.tachidesk.graphql.mutations
|
package suwayomi.tachidesk.graphql.mutations
|
||||||
|
|
||||||
import graphql.execution.DataFetcherResult
|
import org.jetbrains.exposed.v1.core.LikePattern
|
||||||
import org.jetbrains.exposed.sql.LikePattern
|
import org.jetbrains.exposed.v1.core.Op
|
||||||
import org.jetbrains.exposed.sql.Op
|
import org.jetbrains.exposed.v1.core.and
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.inList
|
import org.jetbrains.exposed.v1.core.inList
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.like
|
import org.jetbrains.exposed.v1.core.like
|
||||||
import org.jetbrains.exposed.sql.and
|
import org.jetbrains.exposed.v1.core.or
|
||||||
import org.jetbrains.exposed.sql.deleteWhere
|
import org.jetbrains.exposed.v1.jdbc.deleteWhere
|
||||||
import org.jetbrains.exposed.sql.or
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.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)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,18 +1,18 @@
|
|||||||
|
@file:Suppress("RedundantNullableReturnType", "unused")
|
||||||
|
|
||||||
package suwayomi.tachidesk.graphql.mutations
|
package suwayomi.tachidesk.graphql.mutations
|
||||||
|
|
||||||
import graphql.execution.DataFetcherResult
|
import org.jetbrains.exposed.v1.core.LikePattern
|
||||||
import org.jetbrains.exposed.sql.LikePattern
|
import org.jetbrains.exposed.v1.core.Op
|
||||||
import org.jetbrains.exposed.sql.Op
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
|
import org.jetbrains.exposed.v1.core.inList
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.inList
|
import org.jetbrains.exposed.v1.core.like
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.like
|
import org.jetbrains.exposed.v1.core.or
|
||||||
import org.jetbrains.exposed.sql.deleteWhere
|
import org.jetbrains.exposed.v1.jdbc.deleteWhere
|
||||||
import org.jetbrains.exposed.sql.or
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.jdbc.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 +29,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 +48,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 +68,7 @@ class MetaMutation {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DeleteGlobalMetaPayload(clientMutationId, meta)
|
return DeleteGlobalMetaPayload(clientMutationId, meta)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
data class SetGlobalMetasInput(
|
data class SetGlobalMetasInput(
|
||||||
@@ -86,10 +82,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 +96,7 @@ class MetaMutation {
|
|||||||
.map { GlobalMetaType(it) }
|
.map { GlobalMetaType(it) }
|
||||||
}
|
}
|
||||||
|
|
||||||
SetGlobalMetasPayload(clientMutationId, updatedMetas)
|
return SetGlobalMetasPayload(clientMutationId, updatedMetas)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
data class DeleteGlobalMetasInput(
|
data class DeleteGlobalMetasInput(
|
||||||
@@ -117,10 +111,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 +146,6 @@ class MetaMutation {
|
|||||||
metas
|
metas
|
||||||
}
|
}
|
||||||
|
|
||||||
DeleteGlobalMetasPayload(clientMutationId, metas)
|
return DeleteGlobalMetasPayload(clientMutationId, metas)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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,18 +7,16 @@ 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.v1.core.LikePattern
|
||||||
import org.jetbrains.exposed.sql.LikePattern
|
import org.jetbrains.exposed.v1.core.Op
|
||||||
import org.jetbrains.exposed.sql.Op
|
import org.jetbrains.exposed.v1.core.and
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.inList
|
import org.jetbrains.exposed.v1.core.inList
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.like
|
import org.jetbrains.exposed.v1.core.like
|
||||||
import org.jetbrains.exposed.sql.and
|
import org.jetbrains.exposed.v1.core.or
|
||||||
import org.jetbrains.exposed.sql.deleteWhere
|
import org.jetbrains.exposed.v1.jdbc.deleteWhere
|
||||||
import org.jetbrains.exposed.sql.or
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.jdbc.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 =
|
||||||
@@ -354,4 +343,3 @@ class SourceMutation {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
|
@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
|
||||||
import com.expediagroup.graphql.generator.annotations.GraphQLDescription
|
import com.expediagroup.graphql.generator.annotations.GraphQLDescription
|
||||||
import graphql.execution.DataFetcherResult
|
import org.jetbrains.exposed.v1.core.and
|
||||||
import org.jetbrains.exposed.sql.and
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.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,
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
|
@file:Suppress("RedundantNullableReturnType", "unused")
|
||||||
|
|
||||||
package suwayomi.tachidesk.graphql.mutations
|
package suwayomi.tachidesk.graphql.mutations
|
||||||
|
|
||||||
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 +28,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 +36,6 @@ class UpdateMutation {
|
|||||||
)
|
)
|
||||||
|
|
||||||
return future {
|
return future {
|
||||||
asDataFetcherResult {
|
|
||||||
UpdateLibraryPayload(
|
UpdateLibraryPayload(
|
||||||
input.clientMutationId,
|
input.clientMutationId,
|
||||||
updateStatus =
|
updateStatus =
|
||||||
@@ -48,7 +47,6 @@ class UpdateMutation {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
data class UpdateLibraryMangaInput(
|
data class UpdateLibraryMangaInput(
|
||||||
val clientMutationId: String? = null,
|
val clientMutationId: String? = null,
|
||||||
@@ -60,7 +58,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 +67,6 @@ class UpdateMutation {
|
|||||||
)
|
)
|
||||||
|
|
||||||
return future {
|
return future {
|
||||||
asDataFetcherResult {
|
|
||||||
UpdateLibraryMangaPayload(
|
UpdateLibraryMangaPayload(
|
||||||
input.clientMutationId,
|
input.clientMutationId,
|
||||||
updateStatus =
|
updateStatus =
|
||||||
@@ -79,7 +76,6 @@ class UpdateMutation {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
data class UpdateCategoryMangaInput(
|
data class UpdateCategoryMangaInput(
|
||||||
val clientMutationId: String? = null,
|
val clientMutationId: String? = null,
|
||||||
@@ -92,7 +88,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 +97,6 @@ class UpdateMutation {
|
|||||||
)
|
)
|
||||||
|
|
||||||
return future {
|
return future {
|
||||||
asDataFetcherResult {
|
|
||||||
UpdateCategoryMangaPayload(
|
UpdateCategoryMangaPayload(
|
||||||
input.clientMutationId,
|
input.clientMutationId,
|
||||||
updateStatus =
|
updateStatus =
|
||||||
@@ -111,7 +106,6 @@ class UpdateMutation {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
data class UpdateStopInput(
|
data class UpdateStopInput(
|
||||||
val clientMutationId: String? = null,
|
val clientMutationId: String? = null,
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
|
@file:Suppress("RedundantNullableReturnType", "unused")
|
||||||
|
|
||||||
package suwayomi.tachidesk.graphql.mutations
|
package suwayomi.tachidesk.graphql.mutations
|
||||||
|
|
||||||
import graphql.schema.DataFetchingEnvironment
|
import graphql.schema.DataFetchingEnvironment
|
||||||
import suwayomi.tachidesk.global.impl.util.Jwt
|
import suwayomi.tachidesk.global.impl.util.Jwt
|
||||||
import suwayomi.tachidesk.graphql.directives.RequireAuth
|
|
||||||
import suwayomi.tachidesk.graphql.server.getAttribute
|
import suwayomi.tachidesk.graphql.server.getAttribute
|
||||||
import suwayomi.tachidesk.server.JavalinSetup.Attribute
|
import suwayomi.tachidesk.server.JavalinSetup.Attribute
|
||||||
import suwayomi.tachidesk.server.serverConfig
|
import suwayomi.tachidesk.server.serverConfig
|
||||||
|
|||||||
@@ -10,13 +10,13 @@ package suwayomi.tachidesk.graphql.queries
|
|||||||
import com.expediagroup.graphql.generator.annotations.GraphQLDeprecated
|
import com.expediagroup.graphql.generator.annotations.GraphQLDeprecated
|
||||||
import com.expediagroup.graphql.server.extensions.getValueFromDataLoader
|
import com.expediagroup.graphql.server.extensions.getValueFromDataLoader
|
||||||
import graphql.schema.DataFetchingEnvironment
|
import graphql.schema.DataFetchingEnvironment
|
||||||
import org.jetbrains.exposed.sql.Column
|
import org.jetbrains.exposed.v1.core.Column
|
||||||
import org.jetbrains.exposed.sql.Op
|
import org.jetbrains.exposed.v1.core.Op
|
||||||
import org.jetbrains.exposed.sql.SortOrder
|
import org.jetbrains.exposed.v1.core.SortOrder
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.greater
|
import org.jetbrains.exposed.v1.core.greater
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.less
|
import org.jetbrains.exposed.v1.core.less
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
import suwayomi.tachidesk.graphql.directives.RequireAuth
|
import suwayomi.tachidesk.graphql.directives.RequireAuth
|
||||||
import suwayomi.tachidesk.graphql.queries.filter.BooleanFilter
|
import suwayomi.tachidesk.graphql.queries.filter.BooleanFilter
|
||||||
import suwayomi.tachidesk.graphql.queries.filter.Filter
|
import suwayomi.tachidesk.graphql.queries.filter.Filter
|
||||||
|
|||||||
@@ -10,14 +10,14 @@ package suwayomi.tachidesk.graphql.queries
|
|||||||
import com.expediagroup.graphql.generator.annotations.GraphQLDeprecated
|
import com.expediagroup.graphql.generator.annotations.GraphQLDeprecated
|
||||||
import com.expediagroup.graphql.server.extensions.getValueFromDataLoader
|
import com.expediagroup.graphql.server.extensions.getValueFromDataLoader
|
||||||
import graphql.schema.DataFetchingEnvironment
|
import graphql.schema.DataFetchingEnvironment
|
||||||
import org.jetbrains.exposed.sql.Column
|
import org.jetbrains.exposed.v1.core.Column
|
||||||
import org.jetbrains.exposed.sql.Op
|
import org.jetbrains.exposed.v1.core.Op
|
||||||
import org.jetbrains.exposed.sql.SortOrder
|
import org.jetbrains.exposed.v1.core.SortOrder
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.greater
|
import org.jetbrains.exposed.v1.core.greater
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.less
|
import org.jetbrains.exposed.v1.core.less
|
||||||
import org.jetbrains.exposed.sql.andWhere
|
import org.jetbrains.exposed.v1.jdbc.andWhere
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
import suwayomi.tachidesk.graphql.directives.RequireAuth
|
import suwayomi.tachidesk.graphql.directives.RequireAuth
|
||||||
import suwayomi.tachidesk.graphql.queries.filter.BooleanFilter
|
import suwayomi.tachidesk.graphql.queries.filter.BooleanFilter
|
||||||
import suwayomi.tachidesk.graphql.queries.filter.DoubleFilter
|
import suwayomi.tachidesk.graphql.queries.filter.DoubleFilter
|
||||||
|
|||||||
@@ -11,14 +11,14 @@ import com.expediagroup.graphql.generator.annotations.GraphQLDeprecated
|
|||||||
import com.expediagroup.graphql.server.extensions.getValueFromDataLoader
|
import com.expediagroup.graphql.server.extensions.getValueFromDataLoader
|
||||||
import eu.kanade.tachiyomi.source.local.LocalSource
|
import eu.kanade.tachiyomi.source.local.LocalSource
|
||||||
import graphql.schema.DataFetchingEnvironment
|
import graphql.schema.DataFetchingEnvironment
|
||||||
import org.jetbrains.exposed.sql.Column
|
import org.jetbrains.exposed.v1.core.Column
|
||||||
import org.jetbrains.exposed.sql.Op
|
import org.jetbrains.exposed.v1.core.Op
|
||||||
import org.jetbrains.exposed.sql.SortOrder
|
import org.jetbrains.exposed.v1.core.SortOrder
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.greater
|
import org.jetbrains.exposed.v1.core.greater
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.less
|
import org.jetbrains.exposed.v1.core.less
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.neq
|
import org.jetbrains.exposed.v1.core.neq
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
import suwayomi.tachidesk.graphql.directives.RequireAuth
|
import suwayomi.tachidesk.graphql.directives.RequireAuth
|
||||||
import suwayomi.tachidesk.graphql.queries.filter.BooleanFilter
|
import suwayomi.tachidesk.graphql.queries.filter.BooleanFilter
|
||||||
import suwayomi.tachidesk.graphql.queries.filter.Filter
|
import suwayomi.tachidesk.graphql.queries.filter.Filter
|
||||||
|
|||||||
@@ -10,12 +10,15 @@ package suwayomi.tachidesk.graphql.queries
|
|||||||
import com.expediagroup.graphql.generator.annotations.GraphQLDeprecated
|
import com.expediagroup.graphql.generator.annotations.GraphQLDeprecated
|
||||||
import com.expediagroup.graphql.server.extensions.getValueFromDataLoader
|
import com.expediagroup.graphql.server.extensions.getValueFromDataLoader
|
||||||
import graphql.schema.DataFetchingEnvironment
|
import graphql.schema.DataFetchingEnvironment
|
||||||
import org.jetbrains.exposed.sql.Column
|
import org.jetbrains.exposed.v1.core.Column
|
||||||
import org.jetbrains.exposed.sql.Op
|
import org.jetbrains.exposed.v1.core.Op
|
||||||
import org.jetbrains.exposed.sql.SortOrder
|
import org.jetbrains.exposed.v1.core.SortOrder
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.greater
|
import org.jetbrains.exposed.v1.core.greater
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.less
|
import org.jetbrains.exposed.v1.core.inList
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.core.less
|
||||||
|
import org.jetbrains.exposed.v1.core.like
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.select
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
import suwayomi.tachidesk.graphql.directives.RequireAuth
|
import suwayomi.tachidesk.graphql.directives.RequireAuth
|
||||||
import suwayomi.tachidesk.graphql.queries.filter.BooleanFilter
|
import suwayomi.tachidesk.graphql.queries.filter.BooleanFilter
|
||||||
import suwayomi.tachidesk.graphql.queries.filter.ComparableScalarFilter
|
import suwayomi.tachidesk.graphql.queries.filter.ComparableScalarFilter
|
||||||
|
|||||||
@@ -10,13 +10,13 @@ package suwayomi.tachidesk.graphql.queries
|
|||||||
import com.expediagroup.graphql.generator.annotations.GraphQLDeprecated
|
import com.expediagroup.graphql.generator.annotations.GraphQLDeprecated
|
||||||
import com.expediagroup.graphql.server.extensions.getValueFromDataLoader
|
import com.expediagroup.graphql.server.extensions.getValueFromDataLoader
|
||||||
import graphql.schema.DataFetchingEnvironment
|
import graphql.schema.DataFetchingEnvironment
|
||||||
import org.jetbrains.exposed.sql.Column
|
import org.jetbrains.exposed.v1.core.Column
|
||||||
import org.jetbrains.exposed.sql.Op
|
import org.jetbrains.exposed.v1.core.Op
|
||||||
import org.jetbrains.exposed.sql.SortOrder
|
import org.jetbrains.exposed.v1.core.SortOrder
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.greater
|
import org.jetbrains.exposed.v1.core.greater
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.less
|
import org.jetbrains.exposed.v1.core.less
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
import suwayomi.tachidesk.global.model.table.GlobalMetaTable
|
import suwayomi.tachidesk.global.model.table.GlobalMetaTable
|
||||||
import suwayomi.tachidesk.graphql.directives.RequireAuth
|
import suwayomi.tachidesk.graphql.directives.RequireAuth
|
||||||
import suwayomi.tachidesk.graphql.queries.filter.Filter
|
import suwayomi.tachidesk.graphql.queries.filter.Filter
|
||||||
|
|||||||
@@ -10,13 +10,13 @@ package suwayomi.tachidesk.graphql.queries
|
|||||||
import com.expediagroup.graphql.generator.annotations.GraphQLDeprecated
|
import com.expediagroup.graphql.generator.annotations.GraphQLDeprecated
|
||||||
import com.expediagroup.graphql.server.extensions.getValueFromDataLoader
|
import com.expediagroup.graphql.server.extensions.getValueFromDataLoader
|
||||||
import graphql.schema.DataFetchingEnvironment
|
import graphql.schema.DataFetchingEnvironment
|
||||||
import org.jetbrains.exposed.sql.Column
|
import org.jetbrains.exposed.v1.core.Column
|
||||||
import org.jetbrains.exposed.sql.Op
|
import org.jetbrains.exposed.v1.core.Op
|
||||||
import org.jetbrains.exposed.sql.SortOrder
|
import org.jetbrains.exposed.v1.core.SortOrder
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.greater
|
import org.jetbrains.exposed.v1.core.greater
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.less
|
import org.jetbrains.exposed.v1.core.less
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
import suwayomi.tachidesk.graphql.directives.RequireAuth
|
import suwayomi.tachidesk.graphql.directives.RequireAuth
|
||||||
import suwayomi.tachidesk.graphql.queries.filter.BooleanFilter
|
import suwayomi.tachidesk.graphql.queries.filter.BooleanFilter
|
||||||
import suwayomi.tachidesk.graphql.queries.filter.Filter
|
import suwayomi.tachidesk.graphql.queries.filter.Filter
|
||||||
|
|||||||
@@ -3,13 +3,13 @@ package suwayomi.tachidesk.graphql.queries
|
|||||||
import com.expediagroup.graphql.generator.annotations.GraphQLDeprecated
|
import com.expediagroup.graphql.generator.annotations.GraphQLDeprecated
|
||||||
import com.expediagroup.graphql.server.extensions.getValueFromDataLoader
|
import com.expediagroup.graphql.server.extensions.getValueFromDataLoader
|
||||||
import graphql.schema.DataFetchingEnvironment
|
import graphql.schema.DataFetchingEnvironment
|
||||||
import org.jetbrains.exposed.sql.Column
|
import org.jetbrains.exposed.v1.core.Column
|
||||||
import org.jetbrains.exposed.sql.Op
|
import org.jetbrains.exposed.v1.core.Op
|
||||||
import org.jetbrains.exposed.sql.SortOrder
|
import org.jetbrains.exposed.v1.core.SortOrder
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.greater
|
import org.jetbrains.exposed.v1.core.greater
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.less
|
import org.jetbrains.exposed.v1.core.less
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
import suwayomi.tachidesk.graphql.directives.RequireAuth
|
import suwayomi.tachidesk.graphql.directives.RequireAuth
|
||||||
import suwayomi.tachidesk.graphql.queries.filter.BooleanFilter
|
import suwayomi.tachidesk.graphql.queries.filter.BooleanFilter
|
||||||
import suwayomi.tachidesk.graphql.queries.filter.DoubleFilter
|
import suwayomi.tachidesk.graphql.queries.filter.DoubleFilter
|
||||||
|
|||||||
@@ -1,21 +1,33 @@
|
|||||||
package suwayomi.tachidesk.graphql.queries.filter
|
package suwayomi.tachidesk.graphql.queries.filter
|
||||||
|
|
||||||
import org.jetbrains.exposed.dao.id.EntityID
|
import org.jetbrains.exposed.v1.core.Column
|
||||||
import org.jetbrains.exposed.sql.Column
|
import org.jetbrains.exposed.v1.core.ComparisonOp
|
||||||
import org.jetbrains.exposed.sql.ComparisonOp
|
import org.jetbrains.exposed.v1.core.Expression
|
||||||
import org.jetbrains.exposed.sql.Expression
|
import org.jetbrains.exposed.v1.core.ExpressionWithColumnType
|
||||||
import org.jetbrains.exposed.sql.ExpressionWithColumnType
|
import org.jetbrains.exposed.v1.core.LikePattern
|
||||||
import org.jetbrains.exposed.sql.LikePattern
|
import org.jetbrains.exposed.v1.core.Op
|
||||||
import org.jetbrains.exposed.sql.Op
|
import org.jetbrains.exposed.v1.core.QueryBuilder
|
||||||
import org.jetbrains.exposed.sql.Query
|
import org.jetbrains.exposed.v1.core.and
|
||||||
import org.jetbrains.exposed.sql.QueryBuilder
|
import org.jetbrains.exposed.v1.core.dao.id.EntityID
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.and
|
import org.jetbrains.exposed.v1.core.greater
|
||||||
import org.jetbrains.exposed.sql.andWhere
|
import org.jetbrains.exposed.v1.core.greaterEq
|
||||||
import org.jetbrains.exposed.sql.not
|
import org.jetbrains.exposed.v1.core.inList
|
||||||
import org.jetbrains.exposed.sql.or
|
import org.jetbrains.exposed.v1.core.isNotNull
|
||||||
import org.jetbrains.exposed.sql.stringParam
|
import org.jetbrains.exposed.v1.core.isNull
|
||||||
import org.jetbrains.exposed.sql.upperCase
|
import org.jetbrains.exposed.v1.core.less
|
||||||
|
import org.jetbrains.exposed.v1.core.lessEq
|
||||||
|
import org.jetbrains.exposed.v1.core.like
|
||||||
|
import org.jetbrains.exposed.v1.core.neq
|
||||||
|
import org.jetbrains.exposed.v1.core.not
|
||||||
|
import org.jetbrains.exposed.v1.core.notInList
|
||||||
|
import org.jetbrains.exposed.v1.core.notLike
|
||||||
|
import org.jetbrains.exposed.v1.core.or
|
||||||
|
import org.jetbrains.exposed.v1.core.stringParam
|
||||||
|
import org.jetbrains.exposed.v1.core.upperCase
|
||||||
|
import org.jetbrains.exposed.v1.core.wrap
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.Query
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.andWhere
|
||||||
|
|
||||||
class ILikeEscapeOp(
|
class ILikeEscapeOp(
|
||||||
expr1: Expression<*>,
|
expr1: Expression<*>,
|
||||||
@@ -88,9 +100,7 @@ class DistinctFromOp(
|
|||||||
): DistinctFromOp =
|
): DistinctFromOp =
|
||||||
DistinctFromOp(
|
DistinctFromOp(
|
||||||
expression,
|
expression,
|
||||||
with(SqlExpressionBuilder) {
|
expression.wrap(t),
|
||||||
expression.wrap(t)
|
|
||||||
},
|
|
||||||
false,
|
false,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -100,9 +110,7 @@ class DistinctFromOp(
|
|||||||
): DistinctFromOp =
|
): DistinctFromOp =
|
||||||
DistinctFromOp(
|
DistinctFromOp(
|
||||||
expression,
|
expression,
|
||||||
with(SqlExpressionBuilder) {
|
expression.wrap(t),
|
||||||
expression.wrap(t)
|
|
||||||
},
|
|
||||||
true,
|
true,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -112,9 +120,7 @@ class DistinctFromOp(
|
|||||||
): DistinctFromOp =
|
): DistinctFromOp =
|
||||||
DistinctFromOp(
|
DistinctFromOp(
|
||||||
expression,
|
expression,
|
||||||
with(SqlExpressionBuilder) {
|
expression.wrap(t),
|
||||||
expression.wrap(t)
|
|
||||||
},
|
|
||||||
false,
|
false,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -124,9 +130,7 @@ class DistinctFromOp(
|
|||||||
): DistinctFromOp =
|
): DistinctFromOp =
|
||||||
DistinctFromOp(
|
DistinctFromOp(
|
||||||
expression,
|
expression,
|
||||||
with(SqlExpressionBuilder) {
|
expression.wrap(t),
|
||||||
expression.wrap(t)
|
|
||||||
},
|
|
||||||
true,
|
true,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -505,26 +509,26 @@ class OpAnd(
|
|||||||
) {
|
) {
|
||||||
fun <T> andWhere(
|
fun <T> andWhere(
|
||||||
value: T?,
|
value: T?,
|
||||||
andPart: SqlExpressionBuilder.(T & Any) -> Op<Boolean>,
|
andPart: (T & Any) -> Op<Boolean>,
|
||||||
) {
|
) {
|
||||||
value ?: return
|
value ?: return
|
||||||
val expr = Op.build { andPart(value) }
|
val expr = andPart(value)
|
||||||
op = if (op == null) expr else (op!! and expr)
|
op = if (op == null) expr else (op!! and expr)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun <T : Any> andWhere(
|
fun <T : Any> andWhere(
|
||||||
values: List<T>?,
|
values: List<T>?,
|
||||||
andPart: SqlExpressionBuilder.(List<T>) -> Op<Boolean>,
|
andPart: (List<T>) -> Op<Boolean>,
|
||||||
) {
|
) {
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
return andWhere(values as T?, andPart as SqlExpressionBuilder.(Any) -> Op<Boolean>)
|
return andWhere(values as T?, andPart as (Any) -> Op<Boolean>)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun <T : Any> andWhere(
|
fun <T : Any> andWhere(
|
||||||
valueDefault: T?,
|
valueDefault: T?,
|
||||||
valueAll: List<T>?,
|
valueAll: List<T>?,
|
||||||
valueAny: List<T>?,
|
valueAny: List<T>?,
|
||||||
expr: SqlExpressionBuilder.(T) -> Op<Boolean>,
|
expr: (T) -> Op<Boolean>,
|
||||||
) {
|
) {
|
||||||
andWhere(valueDefault, expr)
|
andWhere(valueDefault, expr)
|
||||||
andWhereAll(valueAll, expr)
|
andWhereAll(valueAll, expr)
|
||||||
@@ -533,17 +537,17 @@ class OpAnd(
|
|||||||
|
|
||||||
fun <T : Any> andWhereAll(
|
fun <T : Any> andWhereAll(
|
||||||
values: List<T>?,
|
values: List<T>?,
|
||||||
andPart: SqlExpressionBuilder.(T) -> Op<Boolean>,
|
andPart: (T) -> Op<Boolean>,
|
||||||
) {
|
) {
|
||||||
values?.map { andWhere(it, andPart) }
|
values?.map { andWhere(it, andPart) }
|
||||||
}
|
}
|
||||||
|
|
||||||
fun <T : Any> andWhereAny(
|
fun <T : Any> andWhereAny(
|
||||||
values: List<T>?,
|
values: List<T>?,
|
||||||
andPart: SqlExpressionBuilder.(T) -> Op<Boolean>,
|
andPart: (T) -> Op<Boolean>,
|
||||||
) {
|
) {
|
||||||
values ?: return
|
values ?: return
|
||||||
val expr = values.map { Op.build { andPart(it) } }.reduce { acc, op -> acc or op }
|
val expr = values.map { andPart(it) }.reduce { acc, op -> acc or op }
|
||||||
op = if (op == null) expr else (op!! and expr)
|
op = if (op == null) expr else (op!! and expr)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+5
-3
@@ -11,19 +11,20 @@ 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.fromJsonStream
|
import io.javalin.json.fromJsonStream
|
||||||
import io.javalin.json.fromJsonString
|
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 +78,8 @@ class JavalinGraphQLRequestParser : GraphQLRequestParser<Context> {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (_: IOException) {
|
} catch (e: IOException) {
|
||||||
|
logger.error(e) { "Error when parsing request" }
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,13 +10,11 @@ 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
|
||||||
import graphql.execution.DataFetcherExceptionHandler
|
import graphql.execution.DataFetcherExceptionHandler
|
||||||
import graphql.execution.DataFetcherExceptionHandlerResult
|
import graphql.execution.DataFetcherExceptionHandlerResult
|
||||||
import graphql.schema.idl.RuntimeWiring
|
|
||||||
import io.github.oshai.kotlinlogging.KotlinLogging
|
import io.github.oshai.kotlinlogging.KotlinLogging
|
||||||
import io.javalin.http.Context
|
import io.javalin.http.Context
|
||||||
import io.javalin.websocket.WsCloseContext
|
import io.javalin.websocket.WsCloseContext
|
||||||
@@ -27,6 +25,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,
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
+1
-1
@@ -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')",
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
package suwayomi.tachidesk.graphql.server.primitives
|
package suwayomi.tachidesk.graphql.server.primitives
|
||||||
|
|
||||||
import org.jetbrains.exposed.dao.id.EntityID
|
import org.jetbrains.exposed.v1.core.Column
|
||||||
import org.jetbrains.exposed.sql.Column
|
import org.jetbrains.exposed.v1.core.Op
|
||||||
import org.jetbrains.exposed.sql.Op
|
import org.jetbrains.exposed.v1.core.SortOrder
|
||||||
import org.jetbrains.exposed.sql.Query
|
import org.jetbrains.exposed.v1.core.and
|
||||||
import org.jetbrains.exposed.sql.SortOrder
|
import org.jetbrains.exposed.v1.core.dao.id.EntityID
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.greater
|
import org.jetbrains.exposed.v1.core.greater
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.less
|
import org.jetbrains.exposed.v1.core.less
|
||||||
import org.jetbrains.exposed.sql.and
|
import org.jetbrains.exposed.v1.core.or
|
||||||
import org.jetbrains.exposed.sql.andWhere
|
import org.jetbrains.exposed.v1.jdbc.Query
|
||||||
import org.jetbrains.exposed.sql.or
|
import org.jetbrains.exposed.v1.jdbc.andWhere
|
||||||
|
|
||||||
interface OrderBy<T> {
|
interface OrderBy<T> {
|
||||||
val column: Column<*>
|
val column: Column<*>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package suwayomi.tachidesk.graphql.server.primitives
|
package suwayomi.tachidesk.graphql.server.primitives
|
||||||
|
|
||||||
import org.jetbrains.exposed.sql.ResultRow
|
import org.jetbrains.exposed.v1.core.ResultRow
|
||||||
|
|
||||||
data class QueryResults<T>(
|
data class QueryResults<T>(
|
||||||
val total: Long,
|
val total: Long,
|
||||||
|
|||||||
+3
-3
@@ -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
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ package suwayomi.tachidesk.graphql.types
|
|||||||
|
|
||||||
import com.expediagroup.graphql.server.extensions.getValueFromDataLoader
|
import com.expediagroup.graphql.server.extensions.getValueFromDataLoader
|
||||||
import graphql.schema.DataFetchingEnvironment
|
import graphql.schema.DataFetchingEnvironment
|
||||||
import org.jetbrains.exposed.sql.ResultRow
|
import org.jetbrains.exposed.v1.core.ResultRow
|
||||||
import suwayomi.tachidesk.graphql.server.primitives.Cursor
|
import suwayomi.tachidesk.graphql.server.primitives.Cursor
|
||||||
import suwayomi.tachidesk.graphql.server.primitives.Edge
|
import suwayomi.tachidesk.graphql.server.primitives.Edge
|
||||||
import suwayomi.tachidesk.graphql.server.primitives.Node
|
import suwayomi.tachidesk.graphql.server.primitives.Node
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ package suwayomi.tachidesk.graphql.types
|
|||||||
|
|
||||||
import com.expediagroup.graphql.server.extensions.getValueFromDataLoader
|
import com.expediagroup.graphql.server.extensions.getValueFromDataLoader
|
||||||
import graphql.schema.DataFetchingEnvironment
|
import graphql.schema.DataFetchingEnvironment
|
||||||
import org.jetbrains.exposed.sql.ResultRow
|
import org.jetbrains.exposed.v1.core.ResultRow
|
||||||
import suwayomi.tachidesk.graphql.server.primitives.Cursor
|
import suwayomi.tachidesk.graphql.server.primitives.Cursor
|
||||||
import suwayomi.tachidesk.graphql.server.primitives.Edge
|
import suwayomi.tachidesk.graphql.server.primitives.Edge
|
||||||
import suwayomi.tachidesk.graphql.server.primitives.Node
|
import suwayomi.tachidesk.graphql.server.primitives.Node
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ package suwayomi.tachidesk.graphql.types
|
|||||||
|
|
||||||
import com.expediagroup.graphql.server.extensions.getValueFromDataLoader
|
import com.expediagroup.graphql.server.extensions.getValueFromDataLoader
|
||||||
import graphql.schema.DataFetchingEnvironment
|
import graphql.schema.DataFetchingEnvironment
|
||||||
import org.jetbrains.exposed.sql.ResultRow
|
import org.jetbrains.exposed.v1.core.ResultRow
|
||||||
import suwayomi.tachidesk.graphql.server.primitives.Cursor
|
import suwayomi.tachidesk.graphql.server.primitives.Cursor
|
||||||
import suwayomi.tachidesk.graphql.server.primitives.Edge
|
import suwayomi.tachidesk.graphql.server.primitives.Edge
|
||||||
import suwayomi.tachidesk.graphql.server.primitives.Node
|
import suwayomi.tachidesk.graphql.server.primitives.Node
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ package suwayomi.tachidesk.graphql.types
|
|||||||
import com.expediagroup.graphql.server.extensions.getValueFromDataLoader
|
import com.expediagroup.graphql.server.extensions.getValueFromDataLoader
|
||||||
import eu.kanade.tachiyomi.source.model.UpdateStrategy
|
import eu.kanade.tachiyomi.source.model.UpdateStrategy
|
||||||
import graphql.schema.DataFetchingEnvironment
|
import graphql.schema.DataFetchingEnvironment
|
||||||
import org.jetbrains.exposed.sql.ResultRow
|
import org.jetbrains.exposed.v1.core.ResultRow
|
||||||
import suwayomi.tachidesk.graphql.cache.CustomCacheMap
|
import suwayomi.tachidesk.graphql.cache.CustomCacheMap
|
||||||
import suwayomi.tachidesk.graphql.server.primitives.Cursor
|
import suwayomi.tachidesk.graphql.server.primitives.Cursor
|
||||||
import suwayomi.tachidesk.graphql.server.primitives.Edge
|
import suwayomi.tachidesk.graphql.server.primitives.Edge
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package suwayomi.tachidesk.graphql.types
|
|||||||
|
|
||||||
import com.expediagroup.graphql.server.extensions.getValueFromDataLoader
|
import com.expediagroup.graphql.server.extensions.getValueFromDataLoader
|
||||||
import graphql.schema.DataFetchingEnvironment
|
import graphql.schema.DataFetchingEnvironment
|
||||||
import org.jetbrains.exposed.sql.ResultRow
|
import org.jetbrains.exposed.v1.core.ResultRow
|
||||||
import suwayomi.tachidesk.global.model.table.GlobalMetaTable
|
import suwayomi.tachidesk.global.model.table.GlobalMetaTable
|
||||||
import suwayomi.tachidesk.graphql.server.primitives.Cursor
|
import suwayomi.tachidesk.graphql.server.primitives.Cursor
|
||||||
import suwayomi.tachidesk.graphql.server.primitives.Edge
|
import suwayomi.tachidesk.graphql.server.primitives.Edge
|
||||||
|
|||||||
@@ -13,8 +13,9 @@ import eu.kanade.tachiyomi.source.ConfigurableSource
|
|||||||
import eu.kanade.tachiyomi.source.model.FilterList
|
import eu.kanade.tachiyomi.source.model.FilterList
|
||||||
import eu.kanade.tachiyomi.source.online.HttpSource
|
import eu.kanade.tachiyomi.source.online.HttpSource
|
||||||
import graphql.schema.DataFetchingEnvironment
|
import graphql.schema.DataFetchingEnvironment
|
||||||
import org.jetbrains.exposed.sql.ResultRow
|
import org.jetbrains.exposed.v1.core.ResultRow
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
import suwayomi.tachidesk.graphql.server.primitives.Cursor
|
import suwayomi.tachidesk.graphql.server.primitives.Cursor
|
||||||
import suwayomi.tachidesk.graphql.server.primitives.Edge
|
import suwayomi.tachidesk.graphql.server.primitives.Edge
|
||||||
import suwayomi.tachidesk.graphql.server.primitives.Node
|
import suwayomi.tachidesk.graphql.server.primitives.Node
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package suwayomi.tachidesk.graphql.types
|
|||||||
|
|
||||||
import com.expediagroup.graphql.server.extensions.getValueFromDataLoader
|
import com.expediagroup.graphql.server.extensions.getValueFromDataLoader
|
||||||
import graphql.schema.DataFetchingEnvironment
|
import graphql.schema.DataFetchingEnvironment
|
||||||
import org.jetbrains.exposed.sql.ResultRow
|
import org.jetbrains.exposed.v1.core.ResultRow
|
||||||
import suwayomi.tachidesk.graphql.server.primitives.Cursor
|
import suwayomi.tachidesk.graphql.server.primitives.Cursor
|
||||||
import suwayomi.tachidesk.graphql.server.primitives.Edge
|
import suwayomi.tachidesk.graphql.server.primitives.Edge
|
||||||
import suwayomi.tachidesk.graphql.server.primitives.Node
|
import suwayomi.tachidesk.graphql.server.primitives.Node
|
||||||
|
|||||||
@@ -12,8 +12,9 @@ import io.javalin.http.HttpStatus
|
|||||||
import kotlinx.coroutines.GlobalScope
|
import kotlinx.coroutines.GlobalScope
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.serialization.json.Json
|
import kotlinx.serialization.json.Json
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.update
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.update
|
||||||
import suwayomi.tachidesk.manga.impl.CategoryManga
|
import suwayomi.tachidesk.manga.impl.CategoryManga
|
||||||
import suwayomi.tachidesk.manga.impl.Chapter
|
import suwayomi.tachidesk.manga.impl.Chapter
|
||||||
import suwayomi.tachidesk.manga.impl.ChapterDownloadHelper
|
import suwayomi.tachidesk.manga.impl.ChapterDownloadHelper
|
||||||
|
|||||||
@@ -7,25 +7,27 @@ package suwayomi.tachidesk.manga.impl
|
|||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
import org.jetbrains.exposed.dao.id.EntityID
|
import org.jetbrains.exposed.v1.core.SortOrder
|
||||||
import org.jetbrains.exposed.sql.SortOrder
|
import org.jetbrains.exposed.v1.core.and
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
|
import org.jetbrains.exposed.v1.core.dao.id.EntityID
|
||||||
import org.jetbrains.exposed.sql.and
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.andWhere
|
import org.jetbrains.exposed.v1.core.inList
|
||||||
import org.jetbrains.exposed.sql.batchInsert
|
import org.jetbrains.exposed.v1.core.isNull
|
||||||
import org.jetbrains.exposed.sql.deleteWhere
|
import org.jetbrains.exposed.v1.core.neq
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.core.statements.BatchUpdateStatement
|
||||||
import org.jetbrains.exposed.sql.statements.BatchUpdateStatement
|
import org.jetbrains.exposed.v1.jdbc.andWhere
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.batchInsert
|
||||||
import org.jetbrains.exposed.sql.update
|
import org.jetbrains.exposed.v1.jdbc.deleteWhere
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.statements.toExecutable
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.update
|
||||||
import suwayomi.tachidesk.manga.model.dataclass.CategoryDataClass
|
import suwayomi.tachidesk.manga.model.dataclass.CategoryDataClass
|
||||||
import suwayomi.tachidesk.manga.model.table.CategoryMangaTable
|
import suwayomi.tachidesk.manga.model.table.CategoryMangaTable
|
||||||
import suwayomi.tachidesk.manga.model.table.CategoryMetaTable
|
import suwayomi.tachidesk.manga.model.table.CategoryMetaTable
|
||||||
import suwayomi.tachidesk.manga.model.table.CategoryTable
|
import suwayomi.tachidesk.manga.model.table.CategoryTable
|
||||||
import suwayomi.tachidesk.manga.model.table.MangaTable
|
import suwayomi.tachidesk.manga.model.table.MangaTable
|
||||||
import suwayomi.tachidesk.manga.model.table.toDataClass
|
import suwayomi.tachidesk.manga.model.table.toDataClass
|
||||||
import kotlin.collections.component1
|
|
||||||
import kotlin.collections.orEmpty
|
|
||||||
|
|
||||||
object Category {
|
object Category {
|
||||||
/**
|
/**
|
||||||
@@ -248,13 +250,14 @@ object Category {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (existingMetaByMetaId.isNotEmpty()) {
|
if (existingMetaByMetaId.isNotEmpty()) {
|
||||||
BatchUpdateStatement(CategoryMetaTable).apply {
|
BatchUpdateStatement(CategoryMetaTable)
|
||||||
|
.apply {
|
||||||
existingMetaByMetaId.forEach { (metaId, entry) ->
|
existingMetaByMetaId.forEach { (metaId, entry) ->
|
||||||
addBatch(EntityID(metaId, CategoryMetaTable))
|
addBatch(EntityID(metaId, CategoryMetaTable))
|
||||||
this[CategoryMetaTable.value] = entry.value
|
this[CategoryMetaTable.value] = entry.value
|
||||||
}
|
}
|
||||||
execute(this@transaction)
|
}.toExecutable()
|
||||||
}
|
.execute(this@transaction)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (newMetaByCategoryId.isNotEmpty()) {
|
if (newMetaByCategoryId.isNotEmpty()) {
|
||||||
|
|||||||
@@ -7,19 +7,22 @@ package suwayomi.tachidesk.manga.impl
|
|||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
import org.jetbrains.exposed.sql.ResultRow
|
import org.jetbrains.exposed.v1.core.ResultRow
|
||||||
import org.jetbrains.exposed.sql.SortOrder
|
import org.jetbrains.exposed.v1.core.SortOrder
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
|
import org.jetbrains.exposed.v1.core.alias
|
||||||
import org.jetbrains.exposed.sql.alias
|
import org.jetbrains.exposed.v1.core.and
|
||||||
import org.jetbrains.exposed.sql.and
|
import org.jetbrains.exposed.v1.core.count
|
||||||
import org.jetbrains.exposed.sql.batchInsert
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.count
|
import org.jetbrains.exposed.v1.core.inList
|
||||||
import org.jetbrains.exposed.sql.deleteWhere
|
import org.jetbrains.exposed.v1.core.isNull
|
||||||
import org.jetbrains.exposed.sql.leftJoin
|
import org.jetbrains.exposed.v1.core.leftJoin
|
||||||
import org.jetbrains.exposed.sql.max
|
import org.jetbrains.exposed.v1.core.max
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.core.wrapAsExpression
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.batchInsert
|
||||||
import org.jetbrains.exposed.sql.wrapAsExpression
|
import org.jetbrains.exposed.v1.jdbc.deleteWhere
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.select
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
import suwayomi.tachidesk.manga.impl.Category.DEFAULT_CATEGORY_ID
|
import suwayomi.tachidesk.manga.impl.Category.DEFAULT_CATEGORY_ID
|
||||||
import suwayomi.tachidesk.manga.model.dataclass.CategoryDataClass
|
import suwayomi.tachidesk.manga.model.dataclass.CategoryDataClass
|
||||||
import suwayomi.tachidesk.manga.model.dataclass.MangaDataClass
|
import suwayomi.tachidesk.manga.model.dataclass.MangaDataClass
|
||||||
|
|||||||
@@ -17,17 +17,21 @@ import io.github.reactivecircus.cache4k.Cache
|
|||||||
import kotlinx.coroutines.sync.Mutex
|
import kotlinx.coroutines.sync.Mutex
|
||||||
import kotlinx.coroutines.sync.withLock
|
import kotlinx.coroutines.sync.withLock
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
import org.jetbrains.exposed.dao.id.EntityID
|
import org.jetbrains.exposed.v1.core.SortOrder
|
||||||
import org.jetbrains.exposed.sql.Op
|
import org.jetbrains.exposed.v1.core.and
|
||||||
import org.jetbrains.exposed.sql.SortOrder
|
import org.jetbrains.exposed.v1.core.dao.id.EntityID
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.inList
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.and
|
import org.jetbrains.exposed.v1.core.greater
|
||||||
import org.jetbrains.exposed.sql.batchInsert
|
import org.jetbrains.exposed.v1.core.inList
|
||||||
import org.jetbrains.exposed.sql.deleteWhere
|
import org.jetbrains.exposed.v1.core.less
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.core.statements.BatchUpdateStatement
|
||||||
import org.jetbrains.exposed.sql.statements.BatchUpdateStatement
|
import org.jetbrains.exposed.v1.jdbc.batchInsert
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.deleteWhere
|
||||||
import org.jetbrains.exposed.sql.update
|
import org.jetbrains.exposed.v1.jdbc.select
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.statements.toExecutable
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.update
|
||||||
import suwayomi.tachidesk.manga.impl.Manga.getManga
|
import suwayomi.tachidesk.manga.impl.Manga.getManga
|
||||||
import suwayomi.tachidesk.manga.impl.download.DownloadManager
|
import suwayomi.tachidesk.manga.impl.download.DownloadManager
|
||||||
import suwayomi.tachidesk.manga.impl.download.DownloadManager.EnqueueInput
|
import suwayomi.tachidesk.manga.impl.download.DownloadManager.EnqueueInput
|
||||||
@@ -306,7 +310,8 @@ object Chapter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (chaptersToUpdate.isNotEmpty()) {
|
if (chaptersToUpdate.isNotEmpty()) {
|
||||||
BatchUpdateStatement(ChapterTable).apply {
|
BatchUpdateStatement(ChapterTable)
|
||||||
|
.apply {
|
||||||
chaptersToUpdate.forEach {
|
chaptersToUpdate.forEach {
|
||||||
addBatch(EntityID(it.id, ChapterTable))
|
addBatch(EntityID(it.id, ChapterTable))
|
||||||
this[ChapterTable.name] = it.name
|
this[ChapterTable.name] = it.name
|
||||||
@@ -316,8 +321,8 @@ object Chapter {
|
|||||||
this[ChapterTable.sourceOrder] = it.index
|
this[ChapterTable.sourceOrder] = it.index
|
||||||
this[ChapterTable.realUrl] = it.realUrl
|
this[ChapterTable.realUrl] = it.realUrl
|
||||||
}
|
}
|
||||||
execute(this@transaction)
|
}.toExecutable()
|
||||||
}
|
.execute(this@transaction)
|
||||||
}
|
}
|
||||||
|
|
||||||
MangaTable.update({ MangaTable.id eq mangaId }) {
|
MangaTable.update({ MangaTable.id eq mangaId }) {
|
||||||
@@ -517,11 +522,11 @@ object Chapter {
|
|||||||
// mangaId is not null, scope query under manga
|
// mangaId is not null, scope query under manga
|
||||||
when {
|
when {
|
||||||
input.chapterIds != null -> {
|
input.chapterIds != null -> {
|
||||||
Op.build { (ChapterTable.manga eq mangaId) and (ChapterTable.id inList input.chapterIds) }
|
(ChapterTable.manga eq mangaId) and (ChapterTable.id inList input.chapterIds)
|
||||||
}
|
}
|
||||||
|
|
||||||
input.chapterIndexes != null -> {
|
input.chapterIndexes != null -> {
|
||||||
Op.build { (ChapterTable.manga eq mangaId) and (ChapterTable.sourceOrder inList input.chapterIndexes) }
|
(ChapterTable.manga eq mangaId) and (ChapterTable.sourceOrder inList input.chapterIndexes)
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> {
|
else -> {
|
||||||
@@ -534,7 +539,7 @@ object Chapter {
|
|||||||
// mangaId is null, only chapterIndexes is valid for this case
|
// mangaId is null, only chapterIndexes is valid for this case
|
||||||
when {
|
when {
|
||||||
input.chapterIds != null -> {
|
input.chapterIds != null -> {
|
||||||
Op.build { (ChapterTable.id inList input.chapterIds) }
|
(ChapterTable.id inList input.chapterIds)
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> {
|
else -> {
|
||||||
@@ -650,13 +655,14 @@ object Chapter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (existingMetaByMetaId.isNotEmpty()) {
|
if (existingMetaByMetaId.isNotEmpty()) {
|
||||||
BatchUpdateStatement(ChapterMetaTable).apply {
|
BatchUpdateStatement(ChapterMetaTable)
|
||||||
|
.apply {
|
||||||
existingMetaByMetaId.forEach { (metaId, entry) ->
|
existingMetaByMetaId.forEach { (metaId, entry) ->
|
||||||
addBatch(EntityID(metaId, ChapterMetaTable))
|
addBatch(EntityID(metaId, ChapterMetaTable))
|
||||||
this[ChapterMetaTable.value] = entry.value
|
this[ChapterMetaTable.value] = entry.value
|
||||||
}
|
}
|
||||||
execute(this@transaction)
|
}.toExecutable()
|
||||||
}
|
.execute(this@transaction)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (newMetaByChapterId.isNotEmpty()) {
|
if (newMetaByChapterId.isNotEmpty()) {
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
package suwayomi.tachidesk.manga.impl
|
package suwayomi.tachidesk.manga.impl
|
||||||
|
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.select
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
import suwayomi.tachidesk.manga.impl.chapter.getChapterDownloadReady
|
import suwayomi.tachidesk.manga.impl.chapter.getChapterDownloadReady
|
||||||
import suwayomi.tachidesk.manga.impl.download.fileProvider.ChaptersFilesProvider
|
import suwayomi.tachidesk.manga.impl.download.fileProvider.ChaptersFilesProvider
|
||||||
import suwayomi.tachidesk.manga.impl.download.fileProvider.impl.ArchiveProvider
|
import suwayomi.tachidesk.manga.impl.download.fileProvider.impl.ArchiveProvider
|
||||||
|
|||||||
@@ -12,11 +12,14 @@ import kotlinx.coroutines.CoroutineScope
|
|||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.SupervisorJob
|
import kotlinx.coroutines.SupervisorJob
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import org.jetbrains.exposed.sql.and
|
import org.jetbrains.exposed.v1.core.and
|
||||||
import org.jetbrains.exposed.sql.insert
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.core.neq
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.insert
|
||||||
import org.jetbrains.exposed.sql.update
|
import org.jetbrains.exposed.v1.jdbc.select
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.update
|
||||||
import suwayomi.tachidesk.manga.impl.Manga.getManga
|
import suwayomi.tachidesk.manga.impl.Manga.getManga
|
||||||
import suwayomi.tachidesk.manga.model.table.CategoryMangaTable
|
import suwayomi.tachidesk.manga.model.table.CategoryMangaTable
|
||||||
import suwayomi.tachidesk.manga.model.table.CategoryTable
|
import suwayomi.tachidesk.manga.model.table.CategoryTable
|
||||||
|
|||||||
@@ -20,15 +20,18 @@ import io.github.oshai.kotlinlogging.KotlinLogging
|
|||||||
import io.javalin.http.HttpStatus
|
import io.javalin.http.HttpStatus
|
||||||
import okhttp3.CacheControl
|
import okhttp3.CacheControl
|
||||||
import okhttp3.Response
|
import okhttp3.Response
|
||||||
import org.jetbrains.exposed.dao.id.EntityID
|
import org.jetbrains.exposed.v1.core.ResultRow
|
||||||
import org.jetbrains.exposed.sql.ResultRow
|
import org.jetbrains.exposed.v1.core.SortOrder
|
||||||
import org.jetbrains.exposed.sql.SortOrder
|
import org.jetbrains.exposed.v1.core.and
|
||||||
import org.jetbrains.exposed.sql.and
|
import org.jetbrains.exposed.v1.core.dao.id.EntityID
|
||||||
import org.jetbrains.exposed.sql.batchInsert
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.core.inList
|
||||||
import org.jetbrains.exposed.sql.statements.BatchUpdateStatement
|
import org.jetbrains.exposed.v1.core.statements.BatchUpdateStatement
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.batchInsert
|
||||||
import org.jetbrains.exposed.sql.update
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.statements.toExecutable
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.update
|
||||||
import suwayomi.tachidesk.manga.impl.MangaList.proxyThumbnailUrl
|
import suwayomi.tachidesk.manga.impl.MangaList.proxyThumbnailUrl
|
||||||
import suwayomi.tachidesk.manga.impl.Source.getSource
|
import suwayomi.tachidesk.manga.impl.Source.getSource
|
||||||
import suwayomi.tachidesk.manga.impl.download.fileProvider.impl.MissingThumbnailException
|
import suwayomi.tachidesk.manga.impl.download.fileProvider.impl.MissingThumbnailException
|
||||||
@@ -295,13 +298,14 @@ object Manga {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (existingMetaByMetaId.isNotEmpty()) {
|
if (existingMetaByMetaId.isNotEmpty()) {
|
||||||
BatchUpdateStatement(MangaMetaTable).apply {
|
BatchUpdateStatement(MangaMetaTable)
|
||||||
|
.apply {
|
||||||
existingMetaByMetaId.forEach { (metaId, entry) ->
|
existingMetaByMetaId.forEach { (metaId, entry) ->
|
||||||
addBatch(EntityID(metaId, MangaMetaTable))
|
addBatch(EntityID(metaId, MangaMetaTable))
|
||||||
this[MangaMetaTable.value] = entry.value
|
this[MangaMetaTable.value] = entry.value
|
||||||
}
|
}
|
||||||
execute(this@transaction)
|
}.toExecutable()
|
||||||
}
|
.execute(this@transaction)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (newMetaByMangaId.isNotEmpty()) {
|
if (newMetaByMangaId.isNotEmpty()) {
|
||||||
|
|||||||
@@ -9,12 +9,15 @@ package suwayomi.tachidesk.manga.impl
|
|||||||
|
|
||||||
import eu.kanade.tachiyomi.source.local.LocalSource
|
import eu.kanade.tachiyomi.source.local.LocalSource
|
||||||
import eu.kanade.tachiyomi.source.model.MangasPage
|
import eu.kanade.tachiyomi.source.model.MangasPage
|
||||||
import org.jetbrains.exposed.dao.id.EntityID
|
import org.jetbrains.exposed.v1.core.and
|
||||||
import org.jetbrains.exposed.sql.and
|
import org.jetbrains.exposed.v1.core.dao.id.EntityID
|
||||||
import org.jetbrains.exposed.sql.batchInsert
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.core.inList
|
||||||
import org.jetbrains.exposed.sql.statements.BatchUpdateStatement
|
import org.jetbrains.exposed.v1.core.statements.BatchUpdateStatement
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.batchInsert
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.statements.toExecutable
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
import suwayomi.tachidesk.manga.impl.util.source.GetCatalogueSource.getCatalogueSourceOrStub
|
import suwayomi.tachidesk.manga.impl.util.source.GetCatalogueSource.getCatalogueSourceOrStub
|
||||||
import suwayomi.tachidesk.manga.model.dataclass.PagedMangaListDataClass
|
import suwayomi.tachidesk.manga.model.dataclass.PagedMangaListDataClass
|
||||||
import suwayomi.tachidesk.manga.model.table.MangaTable
|
import suwayomi.tachidesk.manga.model.table.MangaTable
|
||||||
@@ -88,7 +91,8 @@ object MangaList {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (mangaToUpdate.isNotEmpty()) {
|
if (mangaToUpdate.isNotEmpty()) {
|
||||||
BatchUpdateStatement(MangaTable).apply {
|
BatchUpdateStatement(MangaTable)
|
||||||
|
.apply {
|
||||||
mangaToUpdate.forEach { (sManga, manga) ->
|
mangaToUpdate.forEach { (sManga, manga) ->
|
||||||
addBatch(EntityID(manga[MangaTable.id].value, MangaTable))
|
addBatch(EntityID(manga[MangaTable.id].value, MangaTable))
|
||||||
this[MangaTable.title] = sManga.title
|
this[MangaTable.title] = sManga.title
|
||||||
@@ -107,8 +111,8 @@ object MangaList {
|
|||||||
manga[MangaTable.thumbnailUrlLastFetched]
|
manga[MangaTable.thumbnailUrlLastFetched]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
execute(this@transaction)
|
}.toExecutable()
|
||||||
}
|
.execute(this@transaction)
|
||||||
}
|
}
|
||||||
|
|
||||||
val mangaUrlsToId =
|
val mangaUrlsToId =
|
||||||
|
|||||||
@@ -13,11 +13,12 @@ import eu.kanade.tachiyomi.source.online.HttpSource
|
|||||||
import io.github.oshai.kotlinlogging.KotlinLogging
|
import io.github.oshai.kotlinlogging.KotlinLogging
|
||||||
import kotlinx.coroutines.flow.StateFlow
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
import libcore.net.MimeUtils
|
import libcore.net.MimeUtils
|
||||||
import org.jetbrains.exposed.sql.SortOrder
|
import org.jetbrains.exposed.v1.core.SortOrder
|
||||||
import org.jetbrains.exposed.sql.and
|
import org.jetbrains.exposed.v1.core.and
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
import org.jetbrains.exposed.sql.update
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.update
|
||||||
import suwayomi.tachidesk.graphql.types.DownloadConversion
|
import suwayomi.tachidesk.graphql.types.DownloadConversion
|
||||||
import suwayomi.tachidesk.manga.impl.util.getChapterCachePath
|
import suwayomi.tachidesk.manga.impl.util.getChapterCachePath
|
||||||
import suwayomi.tachidesk.manga.impl.util.source.GetCatalogueSource.getCatalogueSourceOrStub
|
import suwayomi.tachidesk.manga.impl.util.source.GetCatalogueSource.getCatalogueSourceOrStub
|
||||||
|
|||||||
@@ -15,12 +15,16 @@ import eu.kanade.tachiyomi.source.sourcePreferences
|
|||||||
import io.github.oshai.kotlinlogging.KotlinLogging
|
import io.github.oshai.kotlinlogging.KotlinLogging
|
||||||
import io.javalin.json.JsonMapper
|
import io.javalin.json.JsonMapper
|
||||||
import io.javalin.json.fromJsonString
|
import io.javalin.json.fromJsonString
|
||||||
import org.jetbrains.exposed.dao.id.EntityID
|
import org.jetbrains.exposed.v1.core.and
|
||||||
import org.jetbrains.exposed.sql.and
|
import org.jetbrains.exposed.v1.core.dao.id.EntityID
|
||||||
import org.jetbrains.exposed.sql.batchInsert
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.core.inList
|
||||||
import org.jetbrains.exposed.sql.statements.BatchUpdateStatement
|
import org.jetbrains.exposed.v1.core.statements.BatchUpdateStatement
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.batchInsert
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.statements.toExecutable
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
|
import suwayomi.tachidesk.manga.impl.Source.preferenceScreenMap
|
||||||
import suwayomi.tachidesk.manga.impl.extension.Extension.getExtensionIconUrl
|
import suwayomi.tachidesk.manga.impl.extension.Extension.getExtensionIconUrl
|
||||||
import suwayomi.tachidesk.manga.impl.util.source.GetCatalogueSource.getCatalogueSourceOrNull
|
import suwayomi.tachidesk.manga.impl.util.source.GetCatalogueSource.getCatalogueSourceOrNull
|
||||||
import suwayomi.tachidesk.manga.impl.util.source.GetCatalogueSource.getCatalogueSourceOrStub
|
import suwayomi.tachidesk.manga.impl.util.source.GetCatalogueSource.getCatalogueSourceOrStub
|
||||||
@@ -210,13 +214,14 @@ object Source {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (existingMetaByMetaId.isNotEmpty()) {
|
if (existingMetaByMetaId.isNotEmpty()) {
|
||||||
BatchUpdateStatement(SourceMetaTable).apply {
|
BatchUpdateStatement(SourceMetaTable)
|
||||||
|
.apply {
|
||||||
existingMetaByMetaId.forEach { (metaId, entry) ->
|
existingMetaByMetaId.forEach { (metaId, entry) ->
|
||||||
addBatch(EntityID(metaId, SourceMetaTable))
|
addBatch(EntityID(metaId, SourceMetaTable))
|
||||||
this[SourceMetaTable.value] = entry.value
|
this[SourceMetaTable.value] = entry.value
|
||||||
}
|
}
|
||||||
execute(this@transaction)
|
}.toExecutable()
|
||||||
}
|
.execute(this@transaction)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (newMetaBySourceId.isNotEmpty()) {
|
if (newMetaBySourceId.isNotEmpty()) {
|
||||||
|
|||||||
+1
-1
@@ -19,7 +19,7 @@ import okio.Buffer
|
|||||||
import okio.Sink
|
import okio.Sink
|
||||||
import okio.buffer
|
import okio.buffer
|
||||||
import okio.gzip
|
import okio.gzip
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
import suwayomi.tachidesk.manga.impl.backup.BackupFlags
|
import suwayomi.tachidesk.manga.impl.backup.BackupFlags
|
||||||
import suwayomi.tachidesk.manga.impl.backup.proto.handlers.BackupCategoryHandler
|
import suwayomi.tachidesk.manga.impl.backup.proto.handlers.BackupCategoryHandler
|
||||||
import suwayomi.tachidesk.manga.impl.backup.proto.handlers.BackupGlobalMetaHandler
|
import suwayomi.tachidesk.manga.impl.backup.proto.handlers.BackupGlobalMetaHandler
|
||||||
|
|||||||
+3
-2
@@ -11,8 +11,9 @@ import com.fasterxml.jackson.annotation.JsonIgnore
|
|||||||
import okio.buffer
|
import okio.buffer
|
||||||
import okio.gzip
|
import okio.gzip
|
||||||
import okio.source
|
import okio.source
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
import suwayomi.tachidesk.manga.impl.backup.proto.models.Backup
|
import suwayomi.tachidesk.manga.impl.backup.proto.models.Backup
|
||||||
import suwayomi.tachidesk.manga.impl.track.tracker.TrackerManager
|
import suwayomi.tachidesk.manga.impl.track.tracker.TrackerManager
|
||||||
import suwayomi.tachidesk.manga.model.table.SourceTable
|
import suwayomi.tachidesk.manga.model.table.SourceTable
|
||||||
|
|||||||
+2
-2
@@ -7,8 +7,8 @@ package suwayomi.tachidesk.manga.impl.backup.proto.handlers
|
|||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
import org.jetbrains.exposed.sql.SortOrder
|
import org.jetbrains.exposed.v1.core.SortOrder
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
import suwayomi.tachidesk.manga.impl.Category
|
import suwayomi.tachidesk.manga.impl.Category
|
||||||
import suwayomi.tachidesk.manga.impl.Category.modifyCategoriesMetas
|
import suwayomi.tachidesk.manga.impl.Category.modifyCategoriesMetas
|
||||||
import suwayomi.tachidesk.manga.impl.backup.BackupFlags
|
import suwayomi.tachidesk.manga.impl.backup.BackupFlags
|
||||||
|
|||||||
+16
-13
@@ -8,16 +8,18 @@ package suwayomi.tachidesk.manga.impl.backup.proto.handlers
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.source.model.UpdateStrategy
|
import eu.kanade.tachiyomi.source.model.UpdateStrategy
|
||||||
import org.jetbrains.exposed.dao.id.EntityID
|
import org.jetbrains.exposed.v1.core.ResultRow
|
||||||
import org.jetbrains.exposed.sql.ResultRow
|
import org.jetbrains.exposed.v1.core.SortOrder
|
||||||
import org.jetbrains.exposed.sql.SortOrder
|
import org.jetbrains.exposed.v1.core.and
|
||||||
import org.jetbrains.exposed.sql.and
|
import org.jetbrains.exposed.v1.core.dao.id.EntityID
|
||||||
import org.jetbrains.exposed.sql.batchInsert
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.insertAndGetId
|
import org.jetbrains.exposed.v1.core.statements.BatchUpdateStatement
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.jdbc.batchInsert
|
||||||
import org.jetbrains.exposed.sql.statements.BatchUpdateStatement
|
import org.jetbrains.exposed.v1.jdbc.insertAndGetId
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
import org.jetbrains.exposed.sql.update
|
import org.jetbrains.exposed.v1.jdbc.statements.toExecutable
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.update
|
||||||
import suwayomi.tachidesk.manga.impl.CategoryManga
|
import suwayomi.tachidesk.manga.impl.CategoryManga
|
||||||
import suwayomi.tachidesk.manga.impl.Chapter
|
import suwayomi.tachidesk.manga.impl.Chapter
|
||||||
import suwayomi.tachidesk.manga.impl.Chapter.modifyChaptersMetas
|
import suwayomi.tachidesk.manga.impl.Chapter.modifyChaptersMetas
|
||||||
@@ -343,7 +345,8 @@ object BackupMangaHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (chaptersToUpdateToDbChapter.isNotEmpty()) {
|
if (chaptersToUpdateToDbChapter.isNotEmpty()) {
|
||||||
BatchUpdateStatement(ChapterTable).apply {
|
BatchUpdateStatement(ChapterTable)
|
||||||
|
.apply {
|
||||||
chaptersToUpdateToDbChapter.forEach { (backupChapter, dbChapter) ->
|
chaptersToUpdateToDbChapter.forEach { (backupChapter, dbChapter) ->
|
||||||
addBatch(EntityID(dbChapter[ChapterTable.id].value, ChapterTable))
|
addBatch(EntityID(dbChapter[ChapterTable.id].value, ChapterTable))
|
||||||
if (flags.includeChapters) {
|
if (flags.includeChapters) {
|
||||||
@@ -359,8 +362,8 @@ object BackupMangaHandler {
|
|||||||
.coerceAtLeast(dbChapter[ChapterTable.lastReadAt])
|
.coerceAtLeast(dbChapter[ChapterTable.lastReadAt])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
execute(this@dbTransaction)
|
}.toExecutable()
|
||||||
}
|
.execute(this@dbTransaction)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags.includeClientData) {
|
if (flags.includeClientData) {
|
||||||
|
|||||||
+2
-1
@@ -7,7 +7,8 @@ package suwayomi.tachidesk.manga.impl.backup.proto.handlers
|
|||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.core.inList
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
import suwayomi.tachidesk.manga.impl.Source
|
import suwayomi.tachidesk.manga.impl.Source
|
||||||
import suwayomi.tachidesk.manga.impl.Source.modifySourceMetas
|
import suwayomi.tachidesk.manga.impl.Source.modifySourceMetas
|
||||||
import suwayomi.tachidesk.manga.impl.backup.BackupFlags
|
import suwayomi.tachidesk.manga.impl.backup.BackupFlags
|
||||||
|
|||||||
@@ -14,14 +14,14 @@ import io.github.oshai.kotlinlogging.KotlinLogging
|
|||||||
import io.github.reactivecircus.cache4k.Cache
|
import io.github.reactivecircus.cache4k.Cache
|
||||||
import kotlinx.coroutines.sync.Mutex
|
import kotlinx.coroutines.sync.Mutex
|
||||||
import kotlinx.coroutines.sync.withLock
|
import kotlinx.coroutines.sync.withLock
|
||||||
import org.jetbrains.exposed.sql.ResultRow
|
import org.jetbrains.exposed.v1.core.ResultRow
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
|
import org.jetbrains.exposed.v1.core.and
|
||||||
import org.jetbrains.exposed.sql.and
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.batchInsert
|
import org.jetbrains.exposed.v1.jdbc.batchInsert
|
||||||
import org.jetbrains.exposed.sql.deleteWhere
|
import org.jetbrains.exposed.v1.jdbc.deleteWhere
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
import org.jetbrains.exposed.sql.update
|
import org.jetbrains.exposed.v1.jdbc.update
|
||||||
import suwayomi.tachidesk.manga.impl.ChapterDownloadHelper
|
import suwayomi.tachidesk.manga.impl.ChapterDownloadHelper
|
||||||
import suwayomi.tachidesk.manga.impl.util.source.GetCatalogueSource.getCatalogueSourceOrStub
|
import suwayomi.tachidesk.manga.impl.util.source.GetCatalogueSource.getCatalogueSourceOrStub
|
||||||
import suwayomi.tachidesk.manga.model.dataclass.ChapterDataClass
|
import suwayomi.tachidesk.manga.model.dataclass.ChapterDataClass
|
||||||
|
|||||||
@@ -27,9 +27,12 @@ import kotlinx.coroutines.flow.onStart
|
|||||||
import kotlinx.coroutines.flow.sample
|
import kotlinx.coroutines.flow.sample
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
import org.jetbrains.exposed.sql.and
|
import org.jetbrains.exposed.v1.core.and
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.core.inList
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.select
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
import suwayomi.tachidesk.manga.impl.download.model.DownloadChapter
|
import suwayomi.tachidesk.manga.impl.download.model.DownloadChapter
|
||||||
import suwayomi.tachidesk.manga.impl.download.model.DownloadQueueItem
|
import suwayomi.tachidesk.manga.impl.download.model.DownloadQueueItem
|
||||||
import suwayomi.tachidesk.manga.impl.download.model.DownloadState.Error
|
import suwayomi.tachidesk.manga.impl.download.model.DownloadState.Error
|
||||||
@@ -343,7 +346,7 @@ object DownloadManager {
|
|||||||
transaction {
|
transaction {
|
||||||
ChapterTable
|
ChapterTable
|
||||||
.select(ChapterTable.id)
|
.select(ChapterTable.id)
|
||||||
.where { ChapterTable.manga.eq(mangaId) and ChapterTable.sourceOrder.eq(chapterIndex) }
|
.where { (ChapterTable.manga eq mangaId) and (ChapterTable.sourceOrder eq chapterIndex) }
|
||||||
.first()
|
.first()
|
||||||
}
|
}
|
||||||
enqueue(EnqueueInput(chapterIds = listOf(chapter[ChapterTable.id].value)))
|
enqueue(EnqueueInput(chapterIds = listOf(chapter[ChapterTable.id].value)))
|
||||||
|
|||||||
@@ -17,8 +17,9 @@ import kotlinx.coroutines.currentCoroutineContext
|
|||||||
import kotlinx.coroutines.ensureActive
|
import kotlinx.coroutines.ensureActive
|
||||||
import kotlinx.coroutines.isActive
|
import kotlinx.coroutines.isActive
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.update
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.update
|
||||||
import suwayomi.tachidesk.manga.impl.ChapterDownloadHelper
|
import suwayomi.tachidesk.manga.impl.ChapterDownloadHelper
|
||||||
import suwayomi.tachidesk.manga.impl.chapter.getChapterDownloadReadyById
|
import suwayomi.tachidesk.manga.impl.chapter.getChapterDownloadReadyById
|
||||||
import suwayomi.tachidesk.manga.impl.download.model.DownloadQueueItem
|
import suwayomi.tachidesk.manga.impl.download.model.DownloadQueueItem
|
||||||
|
|||||||
+4
-10
@@ -11,10 +11,10 @@ import kotlinx.coroutines.flow.onEach
|
|||||||
import kotlinx.coroutines.flow.sample
|
import kotlinx.coroutines.flow.sample
|
||||||
import libcore.net.MimeUtils
|
import libcore.net.MimeUtils
|
||||||
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry
|
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
import org.jetbrains.exposed.sql.update
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
import suwayomi.tachidesk.graphql.types.DownloadConversion
|
import org.jetbrains.exposed.v1.jdbc.update
|
||||||
import suwayomi.tachidesk.manga.impl.Page
|
import suwayomi.tachidesk.manga.impl.Page
|
||||||
import suwayomi.tachidesk.manga.impl.chapter.getChapterDownloadReady
|
import suwayomi.tachidesk.manga.impl.chapter.getChapterDownloadReady
|
||||||
import suwayomi.tachidesk.manga.impl.download.model.DownloadQueueItem
|
import suwayomi.tachidesk.manga.impl.download.model.DownloadQueueItem
|
||||||
@@ -26,14 +26,8 @@ import suwayomi.tachidesk.manga.impl.util.getChapterDownloadPath
|
|||||||
import suwayomi.tachidesk.manga.impl.util.storage.ImageResponse
|
import suwayomi.tachidesk.manga.impl.util.storage.ImageResponse
|
||||||
import suwayomi.tachidesk.manga.model.table.ChapterTable
|
import suwayomi.tachidesk.manga.model.table.ChapterTable
|
||||||
import suwayomi.tachidesk.manga.model.table.MangaTable
|
import suwayomi.tachidesk.manga.model.table.MangaTable
|
||||||
import suwayomi.tachidesk.server.serverConfig
|
|
||||||
import suwayomi.tachidesk.util.ConversionUtil
|
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.InputStream
|
import java.io.InputStream
|
||||||
import javax.imageio.IIOImage
|
|
||||||
import javax.imageio.ImageIO
|
|
||||||
import javax.imageio.ImageWriteParam
|
|
||||||
import javax.imageio.ImageWriter
|
|
||||||
|
|
||||||
sealed class FileType {
|
sealed class FileType {
|
||||||
data class RegularFile(
|
data class RegularFile(
|
||||||
|
|||||||
+3
-2
@@ -6,8 +6,9 @@ import org.apache.commons.compress.archivers.zip.ZipArchiveEntry
|
|||||||
import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream
|
import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream
|
||||||
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream
|
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream
|
||||||
import org.apache.commons.compress.archivers.zip.ZipFile
|
import org.apache.commons.compress.archivers.zip.ZipFile
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.update
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.update
|
||||||
import suwayomi.tachidesk.manga.impl.download.fileProvider.ChaptersFilesProvider
|
import suwayomi.tachidesk.manga.impl.download.fileProvider.ChaptersFilesProvider
|
||||||
import suwayomi.tachidesk.manga.impl.download.fileProvider.FileType
|
import suwayomi.tachidesk.manga.impl.download.fileProvider.FileType
|
||||||
import suwayomi.tachidesk.manga.impl.util.getChapterCachePath
|
import suwayomi.tachidesk.manga.impl.util.getChapterCachePath
|
||||||
|
|||||||
+3
-2
@@ -2,8 +2,9 @@ package suwayomi.tachidesk.manga.impl.download.fileProvider.impl
|
|||||||
|
|
||||||
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry
|
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry
|
||||||
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream
|
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.update
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.update
|
||||||
import suwayomi.tachidesk.manga.impl.download.fileProvider.ChaptersFilesProvider
|
import suwayomi.tachidesk.manga.impl.download.fileProvider.ChaptersFilesProvider
|
||||||
import suwayomi.tachidesk.manga.impl.download.fileProvider.FileType.RegularFile
|
import suwayomi.tachidesk.manga.impl.download.fileProvider.FileType.RegularFile
|
||||||
import suwayomi.tachidesk.manga.impl.util.getChapterCachePath
|
import suwayomi.tachidesk.manga.impl.util.getChapterCachePath
|
||||||
|
|||||||
@@ -20,12 +20,12 @@ import okhttp3.CacheControl
|
|||||||
import okio.buffer
|
import okio.buffer
|
||||||
import okio.sink
|
import okio.sink
|
||||||
import okio.source
|
import okio.source
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.deleteWhere
|
import org.jetbrains.exposed.v1.jdbc.deleteWhere
|
||||||
import org.jetbrains.exposed.sql.insert
|
import org.jetbrains.exposed.v1.jdbc.insert
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
import org.jetbrains.exposed.sql.update
|
import org.jetbrains.exposed.v1.jdbc.update
|
||||||
import suwayomi.tachidesk.manga.impl.extension.ExtensionsList.extensionTableAsDataClass
|
import suwayomi.tachidesk.manga.impl.extension.ExtensionsList.extensionTableAsDataClass
|
||||||
import suwayomi.tachidesk.manga.impl.extension.github.ExtensionGithubApi
|
import suwayomi.tachidesk.manga.impl.extension.github.ExtensionGithubApi
|
||||||
import suwayomi.tachidesk.manga.impl.util.PackageTools
|
import suwayomi.tachidesk.manga.impl.util.PackageTools
|
||||||
@@ -55,7 +55,6 @@ import java.util.zip.ZipOutputStream
|
|||||||
import kotlin.io.path.Path
|
import kotlin.io.path.Path
|
||||||
import kotlin.io.path.absolutePathString
|
import kotlin.io.path.absolutePathString
|
||||||
import kotlin.io.path.outputStream
|
import kotlin.io.path.outputStream
|
||||||
import kotlin.io.path.relativeTo
|
|
||||||
|
|
||||||
object Extension {
|
object Extension {
|
||||||
private val logger = KotlinLogging.logger {}
|
private val logger = KotlinLogging.logger {}
|
||||||
@@ -359,6 +358,7 @@ object Extension {
|
|||||||
} else {
|
} else {
|
||||||
ExtensionTable.update({ ExtensionTable.pkgName eq pkgName }) {
|
ExtensionTable.update({ ExtensionTable.pkgName eq pkgName }) {
|
||||||
it[isInstalled] = false
|
it[isInstalled] = false
|
||||||
|
it[hasUpdate] = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,15 +11,16 @@ import eu.kanade.tachiyomi.source.local.LocalSource
|
|||||||
import io.github.oshai.kotlinlogging.KotlinLogging
|
import io.github.oshai.kotlinlogging.KotlinLogging
|
||||||
import kotlinx.coroutines.sync.Mutex
|
import kotlinx.coroutines.sync.Mutex
|
||||||
import kotlinx.coroutines.sync.withLock
|
import kotlinx.coroutines.sync.withLock
|
||||||
import org.jetbrains.exposed.dao.id.EntityID
|
import org.jetbrains.exposed.v1.core.ResultRow
|
||||||
import org.jetbrains.exposed.sql.ResultRow
|
import org.jetbrains.exposed.v1.core.dao.id.EntityID
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.inList
|
import org.jetbrains.exposed.v1.core.inList
|
||||||
import org.jetbrains.exposed.sql.batchInsert
|
import org.jetbrains.exposed.v1.core.statements.BatchUpdateStatement
|
||||||
import org.jetbrains.exposed.sql.deleteWhere
|
import org.jetbrains.exposed.v1.jdbc.batchInsert
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.jdbc.deleteWhere
|
||||||
import org.jetbrains.exposed.sql.statements.BatchUpdateStatement
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.statements.toExecutable
|
||||||
import org.jetbrains.exposed.sql.update
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.update
|
||||||
import suwayomi.tachidesk.manga.impl.extension.Extension.getExtensionIconUrl
|
import suwayomi.tachidesk.manga.impl.extension.Extension.getExtensionIconUrl
|
||||||
import suwayomi.tachidesk.manga.impl.extension.github.ExtensionGithubApi
|
import suwayomi.tachidesk.manga.impl.extension.github.ExtensionGithubApi
|
||||||
import suwayomi.tachidesk.manga.impl.extension.github.OnlineExtension
|
import suwayomi.tachidesk.manga.impl.extension.github.OnlineExtension
|
||||||
@@ -125,7 +126,8 @@ object ExtensionsList {
|
|||||||
.groupBy { it.second[ExtensionTable.isInstalled] }
|
.groupBy { it.second[ExtensionTable.isInstalled] }
|
||||||
val installedExtensionsToUpdate = extensionsInstalled[true].orEmpty()
|
val installedExtensionsToUpdate = extensionsInstalled[true].orEmpty()
|
||||||
if (installedExtensionsToUpdate.isNotEmpty()) {
|
if (installedExtensionsToUpdate.isNotEmpty()) {
|
||||||
BatchUpdateStatement(ExtensionTable).apply {
|
BatchUpdateStatement(ExtensionTable)
|
||||||
|
.apply {
|
||||||
installedExtensionsToUpdate.forEach { (foundExtension, extensionRecord) ->
|
installedExtensionsToUpdate.forEach { (foundExtension, extensionRecord) ->
|
||||||
addBatch(EntityID(extensionRecord[ExtensionTable.id].value, ExtensionTable))
|
addBatch(EntityID(extensionRecord[ExtensionTable.id].value, ExtensionTable))
|
||||||
// Always update icon url and repo
|
// Always update icon url and repo
|
||||||
@@ -156,12 +158,13 @@ object ExtensionsList {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
execute(this@transaction)
|
}.toExecutable()
|
||||||
}
|
.execute(this@transaction)
|
||||||
}
|
}
|
||||||
val extensionsToFullyUpdate = extensionsInstalled[false].orEmpty()
|
val extensionsToFullyUpdate = extensionsInstalled[false].orEmpty()
|
||||||
if (extensionsToFullyUpdate.isNotEmpty()) {
|
if (extensionsToFullyUpdate.isNotEmpty()) {
|
||||||
BatchUpdateStatement(ExtensionTable).apply {
|
BatchUpdateStatement(ExtensionTable)
|
||||||
|
.apply {
|
||||||
extensionsToFullyUpdate.forEach { (foundExtension, extensionRecord) ->
|
extensionsToFullyUpdate.forEach { (foundExtension, extensionRecord) ->
|
||||||
addBatch(EntityID(extensionRecord[ExtensionTable.id].value, ExtensionTable))
|
addBatch(EntityID(extensionRecord[ExtensionTable.id].value, ExtensionTable))
|
||||||
// extension is not installed, so we can overwrite the data without a care
|
// extension is not installed, so we can overwrite the data without a care
|
||||||
@@ -174,8 +177,8 @@ object ExtensionsList {
|
|||||||
this[ExtensionTable.apkName] = foundExtension.apkName
|
this[ExtensionTable.apkName] = foundExtension.apkName
|
||||||
this[ExtensionTable.iconUrl] = foundExtension.iconUrl
|
this[ExtensionTable.iconUrl] = foundExtension.iconUrl
|
||||||
}
|
}
|
||||||
execute(this@transaction)
|
}.toExecutable()
|
||||||
}
|
.execute(this@transaction)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (extensionsToInsert.isNotEmpty()) {
|
if (extensionsToInsert.isNotEmpty()) {
|
||||||
|
|||||||
@@ -14,8 +14,10 @@ import kotlinx.serialization.json.put
|
|||||||
import okhttp3.MediaType.Companion.toMediaType
|
import okhttp3.MediaType.Companion.toMediaType
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
import okhttp3.RequestBody.Companion.toRequestBody
|
import okhttp3.RequestBody.Companion.toRequestBody
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.update
|
import org.jetbrains.exposed.v1.jdbc.select
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.update
|
||||||
import suwayomi.tachidesk.graphql.types.KoSyncStatusPayload
|
import suwayomi.tachidesk.graphql.types.KoSyncStatusPayload
|
||||||
import suwayomi.tachidesk.graphql.types.KoreaderSyncChecksumMethod
|
import suwayomi.tachidesk.graphql.types.KoreaderSyncChecksumMethod
|
||||||
import suwayomi.tachidesk.graphql.types.KoreaderSyncConflictStrategy
|
import suwayomi.tachidesk.graphql.types.KoreaderSyncConflictStrategy
|
||||||
|
|||||||
@@ -6,16 +6,17 @@ import kotlinx.coroutines.Dispatchers
|
|||||||
import kotlinx.coroutines.SupervisorJob
|
import kotlinx.coroutines.SupervisorJob
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
import org.jetbrains.exposed.dao.id.EntityID
|
import org.jetbrains.exposed.v1.core.ResultRow
|
||||||
import org.jetbrains.exposed.sql.ResultRow
|
import org.jetbrains.exposed.v1.core.SortOrder
|
||||||
import org.jetbrains.exposed.sql.SortOrder
|
import org.jetbrains.exposed.v1.core.and
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
|
import org.jetbrains.exposed.v1.core.dao.id.EntityID
|
||||||
import org.jetbrains.exposed.sql.and
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.batchInsert
|
import org.jetbrains.exposed.v1.core.statements.BatchUpdateStatement
|
||||||
import org.jetbrains.exposed.sql.deleteWhere
|
import org.jetbrains.exposed.v1.jdbc.batchInsert
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.jdbc.deleteWhere
|
||||||
import org.jetbrains.exposed.sql.statements.BatchUpdateStatement
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.statements.toExecutable
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
import org.jsoup.Jsoup
|
import org.jsoup.Jsoup
|
||||||
import suwayomi.tachidesk.manga.impl.track.tracker.DeletableTracker
|
import suwayomi.tachidesk.manga.impl.track.tracker.DeletableTracker
|
||||||
import suwayomi.tachidesk.manga.impl.track.tracker.TrackerManager
|
import suwayomi.tachidesk.manga.impl.track.tracker.TrackerManager
|
||||||
@@ -427,7 +428,8 @@ object Track {
|
|||||||
fun updateTrackRecords(tracks: List<Track>) =
|
fun updateTrackRecords(tracks: List<Track>) =
|
||||||
transaction {
|
transaction {
|
||||||
if (tracks.isNotEmpty()) {
|
if (tracks.isNotEmpty()) {
|
||||||
BatchUpdateStatement(TrackRecordTable).apply {
|
BatchUpdateStatement(TrackRecordTable)
|
||||||
|
.apply {
|
||||||
tracks.forEach {
|
tracks.forEach {
|
||||||
addBatch(EntityID(it.id!!, TrackRecordTable))
|
addBatch(EntityID(it.id!!, TrackRecordTable))
|
||||||
this[remoteId] = it.remote_id
|
this[remoteId] = it.remote_id
|
||||||
@@ -442,8 +444,8 @@ object Track {
|
|||||||
this[finishDate] = it.finished_reading_date
|
this[finishDate] = it.finished_reading_date
|
||||||
this[private] = it.private
|
this[private] = it.private
|
||||||
}
|
}
|
||||||
execute(this@transaction)
|
}.toExecutable()
|
||||||
}
|
.execute(this@transaction)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-3
@@ -1,11 +1,9 @@
|
|||||||
package suwayomi.tachidesk.manga.impl.track.tracker.model
|
package suwayomi.tachidesk.manga.impl.track.tracker.model
|
||||||
|
|
||||||
import org.jetbrains.exposed.sql.ResultRow
|
import org.jetbrains.exposed.v1.core.ResultRow
|
||||||
import suwayomi.tachidesk.manga.impl.backup.proto.models.BackupTracking
|
import suwayomi.tachidesk.manga.impl.backup.proto.models.BackupTracking
|
||||||
import suwayomi.tachidesk.manga.model.dataclass.TrackRecordDataClass
|
import suwayomi.tachidesk.manga.model.dataclass.TrackRecordDataClass
|
||||||
import suwayomi.tachidesk.manga.model.table.TrackRecordTable
|
import suwayomi.tachidesk.manga.model.table.TrackRecordTable
|
||||||
import suwayomi.tachidesk.manga.model.table.TrackRecordTable.lastChapterRead
|
|
||||||
import suwayomi.tachidesk.manga.model.table.TrackRecordTable.remoteUrl
|
|
||||||
import suwayomi.tachidesk.manga.model.table.TrackSearchTable
|
import suwayomi.tachidesk.manga.model.table.TrackSearchTable
|
||||||
|
|
||||||
fun ResultRow.toTrackRecordDataClass(): TrackRecordDataClass =
|
fun ResultRow.toTrackRecordDataClass(): TrackRecordDataClass =
|
||||||
|
|||||||
@@ -7,10 +7,10 @@ package suwayomi.tachidesk.manga.impl.util
|
|||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
import io.github.oshai.kotlinlogging.KLogger
|
|
||||||
import io.github.oshai.kotlinlogging.KotlinLogging
|
import io.github.oshai.kotlinlogging.KotlinLogging
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
import suwayomi.tachidesk.manga.impl.util.source.GetCatalogueSource
|
import suwayomi.tachidesk.manga.impl.util.source.GetCatalogueSource
|
||||||
import suwayomi.tachidesk.manga.model.table.ChapterTable
|
import suwayomi.tachidesk.manga.model.table.ChapterTable
|
||||||
import suwayomi.tachidesk.manga.model.table.MangaTable
|
import suwayomi.tachidesk.manga.model.table.MangaTable
|
||||||
|
|||||||
@@ -4,10 +4,11 @@ import eu.kanade.tachiyomi.source.local.metadata.COMIC_INFO_FILE
|
|||||||
import eu.kanade.tachiyomi.source.local.metadata.ComicInfo
|
import eu.kanade.tachiyomi.source.local.metadata.ComicInfo
|
||||||
import eu.kanade.tachiyomi.source.local.metadata.ComicInfoPublishingStatus
|
import eu.kanade.tachiyomi.source.local.metadata.ComicInfoPublishingStatus
|
||||||
import nl.adaptivity.xmlutil.serialization.XML
|
import nl.adaptivity.xmlutil.serialization.XML
|
||||||
import org.jetbrains.exposed.sql.ResultRow
|
import org.jetbrains.exposed.v1.core.ResultRow
|
||||||
import org.jetbrains.exposed.sql.SortOrder
|
import org.jetbrains.exposed.v1.core.SortOrder
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
import suwayomi.tachidesk.manga.model.table.CategoryMangaTable
|
import suwayomi.tachidesk.manga.model.table.CategoryMangaTable
|
||||||
import suwayomi.tachidesk.manga.model.table.CategoryTable
|
import suwayomi.tachidesk.manga.model.table.CategoryTable
|
||||||
import suwayomi.tachidesk.manga.model.table.ChapterTable
|
import suwayomi.tachidesk.manga.model.table.ChapterTable
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ package suwayomi.tachidesk.manga.impl.util.lang
|
|||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
import org.jetbrains.exposed.sql.Query
|
import org.jetbrains.exposed.v1.jdbc.Query
|
||||||
|
|
||||||
fun Query.isEmpty() = this.empty()
|
fun Query.isEmpty() = this.empty()
|
||||||
|
|
||||||
|
|||||||
+3
-2
@@ -12,8 +12,9 @@ import eu.kanade.tachiyomi.source.Source
|
|||||||
import eu.kanade.tachiyomi.source.SourceFactory
|
import eu.kanade.tachiyomi.source.SourceFactory
|
||||||
import eu.kanade.tachiyomi.source.online.HttpSource
|
import eu.kanade.tachiyomi.source.online.HttpSource
|
||||||
import io.github.oshai.kotlinlogging.KotlinLogging
|
import io.github.oshai.kotlinlogging.KotlinLogging
|
||||||
import org.jetbrains.exposed.sql.selectAll
|
import org.jetbrains.exposed.v1.core.eq
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
||||||
|
import org.jetbrains.exposed.v1.jdbc.transactions.transaction
|
||||||
import suwayomi.tachidesk.manga.impl.util.PackageTools.loadExtensionSources
|
import suwayomi.tachidesk.manga.impl.util.PackageTools.loadExtensionSources
|
||||||
import suwayomi.tachidesk.manga.model.table.ExtensionTable
|
import suwayomi.tachidesk.manga.model.table.ExtensionTable
|
||||||
import suwayomi.tachidesk.manga.model.table.SourceTable
|
import suwayomi.tachidesk.manga.model.table.SourceTable
|
||||||
|
|||||||
@@ -7,8 +7,8 @@ package suwayomi.tachidesk.manga.model.table
|
|||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
import org.jetbrains.exposed.dao.id.IntIdTable
|
import org.jetbrains.exposed.v1.core.ReferenceOption
|
||||||
import org.jetbrains.exposed.sql.ReferenceOption
|
import org.jetbrains.exposed.v1.core.dao.id.IntIdTable
|
||||||
|
|
||||||
object CategoryMangaTable : IntIdTable() {
|
object CategoryMangaTable : IntIdTable() {
|
||||||
val category = reference("category", CategoryTable, ReferenceOption.CASCADE)
|
val category = reference("category", CategoryTable, ReferenceOption.CASCADE)
|
||||||
|
|||||||
@@ -7,15 +7,15 @@ package suwayomi.tachidesk.manga.model.table
|
|||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
import org.jetbrains.exposed.dao.id.IntIdTable
|
import org.jetbrains.exposed.v1.core.ReferenceOption
|
||||||
import org.jetbrains.exposed.sql.ReferenceOption
|
import org.jetbrains.exposed.v1.core.dao.id.IntIdTable
|
||||||
import suwayomi.tachidesk.manga.model.table.CategoryMetaTable.ref
|
import suwayomi.tachidesk.manga.model.table.CategoryMetaTable.ref
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Metadata storage for clients, about Category with id == [ref].
|
* Metadata storage for clients, about Category with id == [ref].
|
||||||
*/
|
*/
|
||||||
object CategoryMetaTable : IntIdTable() {
|
object CategoryMetaTable : IntIdTable() {
|
||||||
val key = varchar("key", 256)
|
val key = varchar("meta_key", 256)
|
||||||
val value = varchar("value", 4096)
|
val value = varchar("value", 4096)
|
||||||
val ref = reference("category_ref", CategoryTable, ReferenceOption.CASCADE)
|
val ref = reference("category_ref", CategoryTable, ReferenceOption.CASCADE)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,8 +7,8 @@ package suwayomi.tachidesk.manga.model.table
|
|||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
import org.jetbrains.exposed.dao.id.IntIdTable
|
import org.jetbrains.exposed.v1.core.ResultRow
|
||||||
import org.jetbrains.exposed.sql.ResultRow
|
import org.jetbrains.exposed.v1.core.dao.id.IntIdTable
|
||||||
import suwayomi.tachidesk.manga.impl.Category
|
import suwayomi.tachidesk.manga.impl.Category
|
||||||
import suwayomi.tachidesk.manga.model.dataclass.CategoryDataClass
|
import suwayomi.tachidesk.manga.model.dataclass.CategoryDataClass
|
||||||
import suwayomi.tachidesk.manga.model.dataclass.IncludeOrExclude
|
import suwayomi.tachidesk.manga.model.dataclass.IncludeOrExclude
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user