mirror of
https://github.com/Suwayomi/Tachidesk.git
synced 2025-12-23 13:02:34 +01:00
Fix File Upload (#694)
* Fix File Upload * Use operations instead of operation * Fix tests
This commit is contained in:
@@ -21,7 +21,7 @@ class JavalinGraphQLRequestParser : GraphQLRequestParser<Context> {
|
|||||||
@Suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE", "UNCHECKED_CAST")
|
@Suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE", "UNCHECKED_CAST")
|
||||||
override suspend fun parseRequest(context: Context): GraphQLServerRequest? {
|
override suspend fun parseRequest(context: Context): GraphQLServerRequest? {
|
||||||
return try {
|
return try {
|
||||||
val formParam = context.formParam("operation")
|
val formParam = context.formParam("operations")
|
||||||
?: return context.bodyAsClass(GraphQLServerRequest::class.java)
|
?: return context.bodyAsClass(GraphQLServerRequest::class.java)
|
||||||
|
|
||||||
val request = context.jsonMapper().fromJsonString(
|
val request = context.jsonMapper().fromJsonString(
|
||||||
@@ -35,18 +35,12 @@ class JavalinGraphQLRequestParser : GraphQLRequestParser<Context> {
|
|||||||
)
|
)
|
||||||
}.orEmpty()
|
}.orEmpty()
|
||||||
|
|
||||||
val filesMap = map.keys
|
val mapItems = map.flatMap { (key, variables) ->
|
||||||
.sortedBy { it.toIntOrNull() }
|
val file = context.uploadedFile(key)
|
||||||
.map { context.uploadedFile(it) }
|
|
||||||
|
|
||||||
val mapItems = map.flatMap { (index, variables) ->
|
|
||||||
val indexInt = index.toIntOrNull() ?: return@flatMap emptyList()
|
|
||||||
val file = filesMap.getOrNull(indexInt)
|
|
||||||
variables.map { fullVariable ->
|
variables.map { fullVariable ->
|
||||||
val variable = fullVariable.removePrefix("variables.").substringBefore('.')
|
val variable = fullVariable.removePrefix("variables.").substringBefore('.')
|
||||||
val listIndex = fullVariable.substringAfterLast('.').toIntOrNull()
|
val listIndex = fullVariable.substringAfterLast('.').toIntOrNull()
|
||||||
MapItem(
|
MapItem(
|
||||||
indexInt,
|
|
||||||
variable,
|
variable,
|
||||||
listIndex,
|
listIndex,
|
||||||
file
|
file
|
||||||
@@ -74,7 +68,6 @@ class JavalinGraphQLRequestParser : GraphQLRequestParser<Context> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
data class MapItem(
|
data class MapItem(
|
||||||
val index: Int,
|
|
||||||
val variable: String,
|
val variable: String,
|
||||||
val listIndex: Int?,
|
val listIndex: Int?,
|
||||||
val file: UploadedFile?
|
val file: UploadedFile?
|
||||||
|
|||||||
@@ -0,0 +1,60 @@
|
|||||||
|
package suwayomi.tachidesk.graphql
|
||||||
|
|
||||||
|
import com.expediagroup.graphql.server.types.GraphQLRequest
|
||||||
|
import io.javalin.http.Context
|
||||||
|
import io.javalin.http.UploadedFile
|
||||||
|
import io.javalin.plugin.json.JSON_MAPPER_KEY
|
||||||
|
import io.javalin.plugin.json.JavalinJackson
|
||||||
|
import io.javalin.plugin.json.JsonMapper
|
||||||
|
import io.mockk.every
|
||||||
|
import io.mockk.mockk
|
||||||
|
import kotlinx.coroutines.test.runTest
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
import suwayomi.tachidesk.graphql.server.JavalinGraphQLRequestParser
|
||||||
|
import java.io.ByteArrayInputStream
|
||||||
|
import kotlin.test.assertIs
|
||||||
|
import kotlin.test.assertNotNull
|
||||||
|
|
||||||
|
class RequestParserTest {
|
||||||
|
private val ctx = mockk<Context>(relaxed = true)
|
||||||
|
private val requestParser = JavalinGraphQLRequestParser()
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testZero() = runTest {
|
||||||
|
every { ctx.appAttribute<JsonMapper>(JSON_MAPPER_KEY) } returns (JavalinJackson(JavalinJackson.defaultMapper()))
|
||||||
|
every { ctx.formParam("operations") } returns """{ "query": "mutation (${'$'}file: Upload!) { singleUpload(file: ${'$'}file) { id } }", "variables": { "file": null } }"""
|
||||||
|
every { ctx.formParam("map") } returns """{ "0": ["variables.file"] }"""
|
||||||
|
every { ctx.uploadedFile("0") } returns UploadedFile(ByteArrayInputStream(byteArrayOf()), "", "", "", 0)
|
||||||
|
val test = requestParser.parseRequest(ctx)
|
||||||
|
assertIs<GraphQLRequest>(test)
|
||||||
|
assertNotNull(test.variables?.get("file"))
|
||||||
|
println("File: " + test.variables?.get("file"))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testTest() = runTest {
|
||||||
|
every { ctx.appAttribute<JsonMapper>(JSON_MAPPER_KEY) } returns (JavalinJackson(JavalinJackson.defaultMapper()))
|
||||||
|
every { ctx.formParam("operations") } returns """{ "query": "mutation (${'$'}file: Upload!) { singleUpload(file: ${'$'}file) { id } }", "variables": { "file": null } }"""
|
||||||
|
every { ctx.formParam("map") } returns """{ "test": ["variables.file"] }"""
|
||||||
|
every { ctx.uploadedFile("test") } returns UploadedFile(ByteArrayInputStream(byteArrayOf()), "", "", "", 0)
|
||||||
|
val test = requestParser.parseRequest(ctx)
|
||||||
|
assertIs<GraphQLRequest>(test)
|
||||||
|
assertNotNull(test.variables?.get("file"))
|
||||||
|
println("File: " + test.variables?.get("file"))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testList() = runTest {
|
||||||
|
every { ctx.appAttribute<JsonMapper>(JSON_MAPPER_KEY) } returns (JavalinJackson(JavalinJackson.defaultMapper()))
|
||||||
|
every { ctx.formParam("operations") } returns """{ "query": "mutation (${'$'}files: [Upload!]!) { singleUpload(files: ${'$'}files) { id } }", "variables": { "files": [null, null] } }"""
|
||||||
|
every { ctx.formParam("map") } returns """{ "test": ["variables.files.0"], "test2": ["variables.files.1"] }"""
|
||||||
|
every { ctx.uploadedFile("test") } returns UploadedFile(ByteArrayInputStream(byteArrayOf()), "", "", "", 0)
|
||||||
|
every { ctx.uploadedFile("test2") } returns UploadedFile(ByteArrayInputStream(byteArrayOf()), "", "", "", 0)
|
||||||
|
val test = requestParser.parseRequest(ctx)
|
||||||
|
assertIs<GraphQLRequest>(test)
|
||||||
|
val files = test.variables?.get("files")
|
||||||
|
assertIs<List<*>>(files)
|
||||||
|
assert(files.all { it is UploadedFile })
|
||||||
|
println("Files: $files")
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user