diff --git a/app/src/androidTest/java/com/vitorpamplona/amethyst/ImageUploadTesting.kt b/app/src/androidTest/java/com/vitorpamplona/amethyst/ImageUploadTesting.kt index 4e7d14ae8..937796bda 100644 --- a/app/src/androidTest/java/com/vitorpamplona/amethyst/ImageUploadTesting.kt +++ b/app/src/androidTest/java/com/vitorpamplona/amethyst/ImageUploadTesting.kt @@ -9,6 +9,7 @@ import com.vitorpamplona.amethyst.ui.actions.ImageDownloader import com.vitorpamplona.amethyst.ui.actions.Nip96Uploader import com.vitorpamplona.quartz.crypto.KeyPair import junit.framework.TestCase.assertEquals +import junit.framework.TestCase.assertTrue import junit.framework.TestCase.fail import kotlinx.coroutines.runBlocking import org.junit.Assert @@ -32,7 +33,9 @@ class ImageUploadTesting { val bytes = Base64.getDecoder().decode(imagePng) val inputStream = bytes.inputStream() - val result = Nip96Uploader(Account(KeyPair())).uploadImage( + val account = Account(KeyPair()) + + val result = Nip96Uploader(account).uploadImage( inputStream, bytes.size.toLong(), contentTypePng, @@ -44,9 +47,11 @@ class ImageUploadTesting { ) val url = result.tags!!.first() { it[0] == "url" }.get(1) - val size = result.tags!!.firstOrNull() { it[0] == "size" }?.get(1) - val dim = result.tags!!.firstOrNull() { it[0] == "dim" }?.get(1) - val hash = result.tags!!.firstOrNull() { it[0] == "x" }?.get(1) + val size = result.tags!!.firstOrNull() { it[0] == "size" }?.get(1)?.ifBlank { null } + val dim = result.tags!!.firstOrNull() { it[0] == "dim" }?.get(1)?.ifBlank { null } + val hash = result.tags!!.firstOrNull() { it[0] == "x" }?.get(1)?.ifBlank { null } + val contentType = result.tags!!.first() { it[0] == "m" }.get(1) + val ox = result.tags!!.first() { it[0] == "ox" }.get(1) Assert.assertTrue(url.startsWith("http")) @@ -74,6 +79,10 @@ class ImageUploadTesting { fail("It should not fail") } ) + + // delay(1000) + + // assertTrue(Nip96Uploader(account).delete(ox, contentType, serverInfo)) } @Test() diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/Nip96Uploader.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/Nip96Uploader.kt index 7e96ae9ba..216027e21 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/Nip96Uploader.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/Nip96Uploader.kt @@ -154,6 +154,42 @@ class Nip96Uploader(val account: Account?) { } } + suspend fun delete( + hash: String, + contentType: String?, + server: Nip96Retriever.ServerInfo + ): Boolean { + val extension = contentType?.let { MimeTypeMap.getSingleton().getExtensionFromMimeType(it) } ?: "" + + val client = HttpClient.getHttpClient() + + val requestBuilder = Request.Builder() + + nip98Header(server.apiUrl)?.let { + requestBuilder.addHeader("Authorization", it) + } + + println(server.apiUrl.removeSuffix("/") + "/$hash.$extension") + + val request = requestBuilder + .header("User-Agent", "Amethyst/${BuildConfig.VERSION_NAME}") + .url(server.apiUrl.removeSuffix("/") + "/$hash.$extension") + .delete() + .build() + + client.newCall(request).execute().use { response -> + if (response.isSuccessful) { + response.body.use { body -> + val str = body.string() + val result = parseDeleteResults(str) + return result.status == "success" + } + } else { + throw RuntimeException("Error Uploading image: ${response.code}") + } + } + } + private suspend fun waitProcessing( result: Nip96Result, server: Nip96Retriever.ServerInfo, @@ -215,6 +251,16 @@ class Nip96Uploader(val account: Account?) { } } + data class DeleteResult( + val status: String, + val message: String + ) + + private fun parseDeleteResults(body: String): DeleteResult { + val mapper = jacksonObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) + return mapper.readValue(body, DeleteResult::class.java) + } + data class Nip96Result( val status: String, val message: String? = null,