diff --git a/build.gradle.kts b/build.gradle.kts index 3167bb1..3ff45d1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,7 +6,7 @@ plugins { id("io.micronaut.application") version "2.0.2" } -version = "1.0.1" +version = "1.0.2" group = "com.jsonblob" val kotlinVersion= project.properties["kotlinVersion"] diff --git a/src/main/kotlin/jsonblob/api/http/ApiController.kt b/src/main/kotlin/jsonblob/api/http/ApiController.kt index afd17e8..d0586aa 100644 --- a/src/main/kotlin/jsonblob/api/http/ApiController.kt +++ b/src/main/kotlin/jsonblob/api/http/ApiController.kt @@ -157,7 +157,7 @@ class ApiController( return false } - private fun delete(blobId: String) = jsonBlobStore.remove(blobId) + private fun delete(blobId: String) = jsonBlobStore.exists(blobId) && jsonBlobStore.remove(blobId) private fun updateFirstBlobFromPath(path: String, json: String): JsonBlob? { val ids = blobIdsFromPath(path) @@ -169,17 +169,21 @@ class ApiController( } private fun update(blobId: String, json: String): JsonBlob? { - val resolver = idResolvers.firstOrNull { it.handles(blobId) } - return if (resolver != null) { - val created = resolver.resolveTimestamp(blobId) - val jsonBlob = JsonBlob( - id = blobId, - json = json, - created = created - ) - jsonBlobStore.write(jsonBlob) + if (JsonCleaner.validJson(json)) { + val resolver = idResolvers.firstOrNull { it.handles(blobId) } + return if (resolver != null) { + val created = resolver.resolveTimestamp(blobId) + val jsonBlob = JsonBlob( + id = blobId, + json = json, + created = created + ) + jsonBlobStore.write(jsonBlob) + } else { + null + } } else { - null + throw HttpStatusException(HttpStatus.BAD_REQUEST, "Invalid JSON") } } diff --git a/src/main/kotlin/jsonblob/core/store/JsonBlobStore.kt b/src/main/kotlin/jsonblob/core/store/JsonBlobStore.kt index 13c7fe2..2f1573f 100644 --- a/src/main/kotlin/jsonblob/core/store/JsonBlobStore.kt +++ b/src/main/kotlin/jsonblob/core/store/JsonBlobStore.kt @@ -32,7 +32,7 @@ abstract class JsonBlobStore( created = created ) }.onFailure { - log.warn { "Couldn't read JsonBlob with id=$id " } + log.debug { "Couldn't read JsonBlob with id=$id " } }.getOrNull() } diff --git a/src/main/kotlin/jsonblob/core/store/file/FileSystemJsonBlobStore.kt b/src/main/kotlin/jsonblob/core/store/file/FileSystemJsonBlobStore.kt index e0a615d..5e80f6d 100644 --- a/src/main/kotlin/jsonblob/core/store/file/FileSystemJsonBlobStore.kt +++ b/src/main/kotlin/jsonblob/core/store/file/FileSystemJsonBlobStore.kt @@ -58,7 +58,7 @@ open class FileSystemJsonBlobStore( lock.unlock() } }.onFailure { - log.warn { "Couldn't retrieve JsonBlob with id=$id " } + log.debug { "Couldn't retrieve JsonBlob with id=$id " } }.getOrNull() } diff --git a/src/main/resources/views/editor.hbs b/src/main/resources/views/editor.hbs index dc0ea84..07a44a7 100644 --- a/src/main/resources/views/editor.hbs +++ b/src/main/resources/views/editor.hbs @@ -289,7 +289,6 @@ \ No newline at end of file diff --git a/src/test/kotlin/jsonblob/api/http/ApiTest.kt b/src/test/kotlin/jsonblob/api/http/ApiTest.kt index ed8e173..e5a0739 100644 --- a/src/test/kotlin/jsonblob/api/http/ApiTest.kt +++ b/src/test/kotlin/jsonblob/api/http/ApiTest.kt @@ -8,23 +8,20 @@ import io.micronaut.http.HttpResponse import io.micronaut.http.MediaType import io.micronaut.http.client.HttpClient import io.micronaut.http.client.annotation.Client +import io.micronaut.http.client.exceptions.HttpClientResponseException import io.micronaut.test.extensions.junit5.annotation.MicronautTest import io.micronaut.test.support.TestPropertyProvider -import jsonblob.config.S3ClientBuilderListener import jsonblob.core.compression.compressor.GZIPBlobCompressor import jsonblob.core.id.Type1UUIDJsonBlobHandler import jsonblob.core.store.JsonBlobStore import mu.KotlinLogging import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.AfterAll -import org.junit.jupiter.api.BeforeAll +import org.assertj.core.api.Assertions.assertThatThrownBy import org.junit.jupiter.api.Test import org.junit.jupiter.api.TestInstance import org.skyscreamer.jsonassert.JSONAssert.assertEquals -import org.testcontainers.containers.localstack.LocalStackContainer import org.testcontainers.shaded.com.google.common.io.Files -import org.testcontainers.utility.DockerImageName -import software.amazon.awssdk.services.s3.S3Client +import java.util.UUID import javax.inject.Inject @@ -129,6 +126,24 @@ class ApiTest: TestPropertyProvider { } } + @Test + fun `blob is created on API PUT`() { + val resp = client + .toBlocking() + .exchange(PUT("/api/jsonBlob/${type1UUIDJsonBlobHandler.generate()}", json).contentType(MediaType.APPLICATION_JSON_TYPE), String::class.java) + assertThat(resp.code()).isEqualTo(200) + } + + @Test + fun `blob is not created on bad API PUT`() { + assertThatThrownBy { + client + .toBlocking() + .exchange(PUT("/api/jsonBlob/${UUID.randomUUID()}", json).contentType(MediaType.APPLICATION_JSON_TYPE), String::class.java) + + }.isInstanceOf(HttpClientResponseException::class.java) + } + @Test fun `blob is updated on custom API PUT`() { validateUpdate {