diff options
Diffstat (limited to 'merchant-lib/src')
4 files changed, 23 insertions, 22 deletions
diff --git a/merchant-lib/src/main/java/net/taler/merchantlib/MerchantApi.kt b/merchant-lib/src/main/java/net/taler/merchantlib/MerchantApi.kt index c02907b..950cea6 100644 --- a/merchant-lib/src/main/java/net/taler/merchantlib/MerchantApi.kt +++ b/merchant-lib/src/main/java/net/taler/merchantlib/MerchantApi.kt @@ -20,6 +20,7 @@ import io.ktor.client.HttpClient import io.ktor.client.call.body import io.ktor.client.engine.okhttp.OkHttp import io.ktor.client.plugins.contentnegotiation.ContentNegotiation +import io.ktor.client.request.HttpRequestBuilder import io.ktor.client.request.delete import io.ktor.client.request.get import io.ktor.client.request.header @@ -28,13 +29,12 @@ import io.ktor.client.request.setBody import io.ktor.http.ContentType.Application.Json import io.ktor.http.HttpHeaders.Authorization import io.ktor.http.contentType +import io.ktor.serialization.kotlinx.json.json import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext -import net.taler.merchantlib.Response.Companion.response -import io.ktor.serialization.kotlinx.json.* -import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.json.Json +import net.taler.merchantlib.Response.Companion.response class MerchantApi( private val httpClient: HttpClient = getDefaultHttpClient(), @@ -53,7 +53,7 @@ class MerchantApi( ): Response<PostOrderResponse> = withContext(ioDispatcher) { response { httpClient.post(merchantConfig.urlFor("private/orders")) { - header(Authorization, "ApiKey ${merchantConfig.apiKey}") + auth(merchantConfig) contentType(Json) setBody(orderRequest) }.body() @@ -66,7 +66,7 @@ class MerchantApi( ): Response<CheckPaymentResponse> = withContext(ioDispatcher) { response { httpClient.get(merchantConfig.urlFor("private/orders/$orderId")) { - header(Authorization, "ApiKey ${merchantConfig.apiKey}") + auth(merchantConfig) }.body() } } @@ -77,7 +77,7 @@ class MerchantApi( ): Response<Unit> = withContext(ioDispatcher) { response { httpClient.delete(merchantConfig.urlFor("private/orders/$orderId")) { - header(Authorization, "ApiKey ${merchantConfig.apiKey}") + auth(merchantConfig) }.body() } } @@ -86,7 +86,7 @@ class MerchantApi( withContext(ioDispatcher) { response { httpClient.get(merchantConfig.urlFor("private/orders")) { - header(Authorization, "ApiKey ${merchantConfig.apiKey}") + auth(merchantConfig) }.body() } } @@ -98,12 +98,16 @@ class MerchantApi( ): Response<RefundResponse> = withContext(ioDispatcher) { response { httpClient.post(merchantConfig.urlFor("private/orders/$orderId/refund")) { - header(Authorization, "ApiKey ${merchantConfig.apiKey}") + auth(merchantConfig) contentType(Json) setBody(request) }.body() } } + + private fun HttpRequestBuilder.auth(merchantConfig: MerchantConfig) { + header(Authorization, "Bearer ${merchantConfig.apiKey}") + } } fun getDefaultHttpClient(): HttpClient = HttpClient(OkHttp) { diff --git a/merchant-lib/src/main/java/net/taler/merchantlib/Orders.kt b/merchant-lib/src/main/java/net/taler/merchantlib/Orders.kt index 391abf5..9348ded 100644 --- a/merchant-lib/src/main/java/net/taler/merchantlib/Orders.kt +++ b/merchant-lib/src/main/java/net/taler/merchantlib/Orders.kt @@ -21,14 +21,14 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.json.JsonClassDiscriminator import net.taler.common.ContractTerms -import net.taler.common.Duration +import net.taler.common.RelativeTime @Serializable data class PostOrderRequest( @SerialName("order") val contractTerms: ContractTerms, @SerialName("refund_delay") - val refundDelay: Duration? = null + val refundDelay: RelativeTime? = null ) @Serializable diff --git a/merchant-lib/src/main/java/net/taler/merchantlib/Response.kt b/merchant-lib/src/main/java/net/taler/merchantlib/Response.kt index b7ba1ac..55de077 100644 --- a/merchant-lib/src/main/java/net/taler/merchantlib/Response.kt +++ b/merchant-lib/src/main/java/net/taler/merchantlib/Response.kt @@ -17,9 +17,7 @@ package net.taler.merchantlib import io.ktor.client.call.body -import io.ktor.client.plugins.ClientRequestException import io.ktor.client.plugins.ResponseException -import io.ktor.client.plugins.ServerResponseException import kotlinx.serialization.Serializable class Response<out T> private constructor( @@ -64,8 +62,7 @@ class Response<out T> private constructor( } private suspend fun getFailureString(failure: Failure): String = when (failure.exception) { - is ClientRequestException -> getExceptionString(failure.exception) - is ServerResponseException -> getExceptionString(failure.exception) + is ResponseException -> getExceptionString(failure.exception) else -> failure.exception.toString() } @@ -73,7 +70,7 @@ class Response<out T> private constructor( val response = e.response return try { val error: Error = response.body() - "Error ${error.code}: ${error.hint}" + "Error ${error.code} (${response.status.value}): ${error.hint} ${error.detail}" } catch (ex: Exception) { "Status code: ${response.status.value}" } @@ -84,6 +81,7 @@ class Response<out T> private constructor( @Serializable private class Error( val code: Int?, - val hint: String? + val hint: String?, + val detail: String? = null, ) } diff --git a/merchant-lib/src/test/java/net/taler/merchantlib/MerchantApiTest.kt b/merchant-lib/src/test/java/net/taler/merchantlib/MerchantApiTest.kt index a89e2d3..cf627c6 100644 --- a/merchant-lib/src/test/java/net/taler/merchantlib/MerchantApiTest.kt +++ b/merchant-lib/src/test/java/net/taler/merchantlib/MerchantApiTest.kt @@ -19,7 +19,6 @@ package net.taler.merchantlib import io.ktor.http.HttpStatusCode.Companion.NotFound import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.runBlocking -import kotlinx.coroutines.test.TestCoroutineDispatcher import kotlinx.coroutines.test.UnconfinedTestDispatcher import net.taler.common.Amount import net.taler.common.ContractProduct @@ -81,7 +80,7 @@ class MerchantApiTest { { "product_id": "${product.productId}", "description": "${product.description}", - "price": "${product.price.toJSONString()}", + "price": "${product.price!!.toJSONString()}", "quantity": ${product.quantity} } ] @@ -173,7 +172,7 @@ class MerchantApiTest { "order_id": "2020.217-0281FGXCS25P2", "row_id": 183, "timestamp": { - "t_ms": 1596542338000 + "t_s": 1596542338 }, "amount": "TESTKUDOS:1", "summary": "Chips", @@ -184,7 +183,7 @@ class MerchantApiTest { "order_id": "2020.216-01G2ZPXSP6BYT", "row_id": 154, "timestamp": { - "t_ms": 1596468174000 + "t_s": 1596468174 }, "amount": "TESTKUDOS:0.8", "summary": "Peanuts", @@ -203,7 +202,7 @@ class MerchantApiTest { assertEquals(true, order1.paid) assertEquals(true, order1.refundable) assertEquals("Chips", order1.summary) - assertEquals(Timestamp(1596542338000), order1.timestamp) + assertEquals(Timestamp.fromMillis(1596542338000), order1.timestamp) val order2 = it.orders[1] assertEquals(Amount("TESTKUDOS", 0, 80000000), order2.amount) @@ -211,7 +210,7 @@ class MerchantApiTest { assertEquals(false, order2.paid) assertEquals(false, order2.refundable) assertEquals("Peanuts", order2.summary) - assertEquals(Timestamp(1596468174000), order2.timestamp) + assertEquals(Timestamp.fromMillis(1596468174000), order2.timestamp) } } |