From e7f1d3fc1a2f48c4e89f3d259e39db7f7736f9b1 Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Tue, 15 Nov 2022 15:14:55 -0400 Subject: [PATCH] Add JsonCreator annotation to data class constructors. --- .../main/java/org/signal/donations/StripeApi.kt | 17 +++++++++++++++-- .../java/org/signal/donations/StripeError.kt | 4 ++++ .../donations/json/StripePaymentIntent.kt | 3 ++- .../signal/donations/json/StripeSetupIntent.kt | 3 ++- 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/donations/lib/src/main/java/org/signal/donations/StripeApi.kt b/donations/lib/src/main/java/org/signal/donations/StripeApi.kt index cca475d5c9..b73a62eb43 100644 --- a/donations/lib/src/main/java/org/signal/donations/StripeApi.kt +++ b/donations/lib/src/main/java/org/signal/donations/StripeApi.kt @@ -3,6 +3,7 @@ package org.signal.donations import android.net.Uri import android.os.Parcelable import androidx.annotation.WorkerThread +import com.fasterxml.jackson.databind.exc.InvalidDefinitionException import com.fasterxml.jackson.module.kotlin.jsonMapper import com.fasterxml.jackson.module.kotlin.kotlinModule import com.fasterxml.jackson.module.kotlin.readValue @@ -130,7 +131,13 @@ class StripeApi( fun getSetupIntent(stripeIntentAccessor: StripeIntentAccessor): StripeSetupIntent { return when (stripeIntentAccessor.objectType) { StripeIntentAccessor.ObjectType.SETUP_INTENT -> get("setup_intents/${stripeIntentAccessor.intentId}?client_secret=${stripeIntentAccessor.intentClientSecret}").use { - objectMapper.readValue(it.body()!!.string()) + try { + objectMapper.readValue(it.body()!!.string()) + } catch (e: InvalidDefinitionException) { + throw StripeError.FailedToParseSetupIntentResponseError(e) + } catch (e: Exception) { + throw StripeError.FailedToParseSetupIntentResponseError(null) + } } else -> error("Unsupported type") } @@ -142,7 +149,13 @@ class StripeApi( fun getPaymentIntent(stripeIntentAccessor: StripeIntentAccessor): StripePaymentIntent { return when (stripeIntentAccessor.objectType) { StripeIntentAccessor.ObjectType.PAYMENT_INTENT -> get("payment_intents/${stripeIntentAccessor.intentId}?client_secret=${stripeIntentAccessor.intentClientSecret}").use { - objectMapper.readValue(it.body()!!.string()) + try { + objectMapper.readValue(it.body()!!.string()) + } catch (e: InvalidDefinitionException) { + throw StripeError.FailedToParsePaymentIntentResponseError(e) + } catch (e: Exception) { + throw StripeError.FailedToParsePaymentIntentResponseError(null) + } } else -> error("Unsupported type") } diff --git a/donations/lib/src/main/java/org/signal/donations/StripeError.kt b/donations/lib/src/main/java/org/signal/donations/StripeError.kt index ef6f17b1a8..d1313d8280 100644 --- a/donations/lib/src/main/java/org/signal/donations/StripeError.kt +++ b/donations/lib/src/main/java/org/signal/donations/StripeError.kt @@ -1,6 +1,10 @@ package org.signal.donations +import com.fasterxml.jackson.databind.exc.InvalidDefinitionException + sealed class StripeError(message: String) : Exception(message) { + class FailedToParsePaymentIntentResponseError(invalidDefCause: InvalidDefinitionException?) : StripeError("Failed to parse payment intent response: ${invalidDefCause?.type} ${invalidDefCause?.property} ${invalidDefCause?.beanDescription}") + class FailedToParseSetupIntentResponseError(invalidDefCause: InvalidDefinitionException?) : StripeError("Failed to parse setup intent response: ${invalidDefCause?.type} ${invalidDefCause?.property} ${invalidDefCause?.beanDescription}") object FailedToParsePaymentMethodResponseError : StripeError("Failed to parse payment method response") object FailedToCreatePaymentSourceFromCardData : StripeError("Failed to create payment source from card data") class PostError(val statusCode: Int, val errorCode: String?, val declineCode: StripeDeclineCode?) : StripeError("postForm failed with code: $statusCode. errorCode: $errorCode. declineCode: $declineCode") diff --git a/donations/lib/src/main/java/org/signal/donations/json/StripePaymentIntent.kt b/donations/lib/src/main/java/org/signal/donations/json/StripePaymentIntent.kt index 6c81d081cb..c7f2c426b8 100644 --- a/donations/lib/src/main/java/org/signal/donations/json/StripePaymentIntent.kt +++ b/donations/lib/src/main/java/org/signal/donations/json/StripePaymentIntent.kt @@ -1,5 +1,6 @@ package org.signal.donations.json +import com.fasterxml.jackson.annotation.JsonCreator import com.fasterxml.jackson.annotation.JsonIgnoreProperties import com.fasterxml.jackson.annotation.JsonProperty @@ -9,7 +10,7 @@ import com.fasterxml.jackson.annotation.JsonProperty * See: https://stripe.com/docs/api/payment_intents/object */ @JsonIgnoreProperties(ignoreUnknown = true) -data class StripePaymentIntent( +data class StripePaymentIntent @JsonCreator constructor( @JsonProperty("id") val id: String, @JsonProperty("client_secret") val clientSecret: String, @JsonProperty("status") val status: StripeIntentStatus, diff --git a/donations/lib/src/main/java/org/signal/donations/json/StripeSetupIntent.kt b/donations/lib/src/main/java/org/signal/donations/json/StripeSetupIntent.kt index 69a0cede14..0d34e15822 100644 --- a/donations/lib/src/main/java/org/signal/donations/json/StripeSetupIntent.kt +++ b/donations/lib/src/main/java/org/signal/donations/json/StripeSetupIntent.kt @@ -1,5 +1,6 @@ package org.signal.donations.json +import com.fasterxml.jackson.annotation.JsonCreator import com.fasterxml.jackson.annotation.JsonIgnoreProperties import com.fasterxml.jackson.annotation.JsonProperty @@ -9,7 +10,7 @@ import com.fasterxml.jackson.annotation.JsonProperty * See: https://stripe.com/docs/api/setup_intents/object */ @JsonIgnoreProperties(ignoreUnknown = true) -data class StripeSetupIntent( +data class StripeSetupIntent @JsonCreator constructor( @JsonProperty("id") val id: String, @JsonProperty("client_secret") val clientSecret: String, @JsonProperty("status") val status: StripeIntentStatus,