Publish donation events for immediately-successful donations
This commit is contained in:
parent
8999f0104f
commit
7f6da52349
|
@ -176,6 +176,7 @@ public class BraintreeManager implements SubscriptionProcessorManager {
|
||||||
|
|
||||||
final PaymentStatus paymentStatus = getPaymentStatus(chargeResponse.transaction.status);
|
final PaymentStatus paymentStatus = getPaymentStatus(chargeResponse.transaction.status);
|
||||||
if (paymentStatus == PaymentStatus.SUCCEEDED || paymentStatus == PaymentStatus.PROCESSING) {
|
if (paymentStatus == PaymentStatus.SUCCEEDED || paymentStatus == PaymentStatus.PROCESSING) {
|
||||||
|
publishDonationEvent(amount, currency, Instant.now(), clientPlatform);
|
||||||
return CompletableFuture.completedFuture(new PayPalChargeSuccessDetails(chargeResponse.transaction.id));
|
return CompletableFuture.completedFuture(new PayPalChargeSuccessDetails(chargeResponse.transaction.id));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -204,47 +205,7 @@ public class BraintreeManager implements SubscriptionProcessorManager {
|
||||||
|
|
||||||
final Transaction successfulTx = search.getFirst();
|
final Transaction successfulTx = search.getFirst();
|
||||||
|
|
||||||
try {
|
publishDonationEvent(amount, currency, successfulTx.getCreatedAt().toInstant(), clientPlatform);
|
||||||
final BigDecimal originalAmountUsd =
|
|
||||||
currencyConversionManager.convertToUsd(successfulTx.getAmount(), successfulTx.getCurrencyIsoCode())
|
|
||||||
.orElseThrow(() -> new IllegalArgumentException("Could not convert to USD from " + successfulTx.getCurrencyIsoCode()));
|
|
||||||
|
|
||||||
final DonationsPubsub.DonationPubSubMessage.Builder donationPubSubMessageBuilder =
|
|
||||||
DonationsPubsub.DonationPubSubMessage.newBuilder()
|
|
||||||
.setTimestamp(successfulTx.getCreatedAt().toInstant().toEpochMilli() * 1000)
|
|
||||||
.setSource("app")
|
|
||||||
.setProvider("braintree")
|
|
||||||
.setRecurring(false)
|
|
||||||
.setPaymentMethodType("paypal")
|
|
||||||
.setOriginalAmountMicros(toMicros(successfulTx.getAmount()))
|
|
||||||
.setOriginalCurrency(successfulTx.getCurrencyIsoCode())
|
|
||||||
.setOriginalAmountUsdMicros(toMicros(originalAmountUsd));
|
|
||||||
|
|
||||||
if (clientPlatform != null) {
|
|
||||||
donationPubSubMessageBuilder.setClientPlatform(clientPlatform.name().toLowerCase(Locale.ROOT));
|
|
||||||
}
|
|
||||||
|
|
||||||
ApiFutures.addCallback(pubsubPublisher.publish(PubsubMessage.newBuilder()
|
|
||||||
.setData(donationPubSubMessageBuilder.build().toByteString())
|
|
||||||
.build()),
|
|
||||||
new ApiFutureCallback<>() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onSuccess(final String messageId) {
|
|
||||||
Metrics.counter(PUBSUB_MESSAGE_COUNTER_NAME, PUBSUB_MESSAGE_SUCCESS_TAG, "true").increment();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onFailure(final Throwable throwable) {
|
|
||||||
logger.warn("Failed to publish donation pub/sub message", throwable);
|
|
||||||
Metrics.counter(PUBSUB_MESSAGE_COUNTER_NAME, PUBSUB_MESSAGE_SUCCESS_TAG, "false").increment();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}, executor);
|
|
||||||
} catch (final Exception e) {
|
|
||||||
logger.warn("Failed to construct donation pub/sub message", e);
|
|
||||||
}
|
|
||||||
|
|
||||||
return CompletableFuture.completedFuture(
|
return CompletableFuture.completedFuture(
|
||||||
new PayPalChargeSuccessDetails(successfulTx.getGraphQLId()));
|
new PayPalChargeSuccessDetails(successfulTx.getGraphQLId()));
|
||||||
|
@ -265,6 +226,53 @@ public class BraintreeManager implements SubscriptionProcessorManager {
|
||||||
}, executor));
|
}, executor));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void publishDonationEvent(final long amount,
|
||||||
|
final String currency,
|
||||||
|
final Instant timestamp,
|
||||||
|
@Nullable final ClientPlatform clientPlatform) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
final BigDecimal originalAmount = convertApiAmountToBraintreeAmount(currency, amount);
|
||||||
|
|
||||||
|
final BigDecimal originalAmountUsd =
|
||||||
|
currencyConversionManager.convertToUsd(originalAmount, currency)
|
||||||
|
.orElseThrow(() -> new IllegalArgumentException("Could not convert to USD from " + currency));
|
||||||
|
|
||||||
|
final DonationsPubsub.DonationPubSubMessage.Builder donationPubSubMessageBuilder =
|
||||||
|
DonationsPubsub.DonationPubSubMessage.newBuilder()
|
||||||
|
.setTimestamp(timestamp.toEpochMilli() * 1000)
|
||||||
|
.setSource("app")
|
||||||
|
.setProvider("braintree")
|
||||||
|
.setRecurring(false)
|
||||||
|
.setPaymentMethodType("paypal")
|
||||||
|
.setOriginalAmountMicros(toMicros(originalAmount))
|
||||||
|
.setOriginalCurrency(currency)
|
||||||
|
.setOriginalAmountUsdMicros(toMicros(originalAmountUsd));
|
||||||
|
|
||||||
|
if (clientPlatform != null) {
|
||||||
|
donationPubSubMessageBuilder.setClientPlatform(clientPlatform.name().toLowerCase(Locale.ROOT));
|
||||||
|
}
|
||||||
|
|
||||||
|
ApiFutures.addCallback(pubsubPublisher.publish(PubsubMessage.newBuilder()
|
||||||
|
.setData(donationPubSubMessageBuilder.build().toByteString())
|
||||||
|
.build()), new ApiFutureCallback<>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSuccess(final String messageId) {
|
||||||
|
Metrics.counter(PUBSUB_MESSAGE_COUNTER_NAME, PUBSUB_MESSAGE_SUCCESS_TAG, "true").increment();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(final Throwable throwable) {
|
||||||
|
logger.warn("Failed to publish donation pub/sub message", throwable);
|
||||||
|
Metrics.counter(PUBSUB_MESSAGE_COUNTER_NAME, PUBSUB_MESSAGE_SUCCESS_TAG, "false").increment();
|
||||||
|
}
|
||||||
|
}, executor);
|
||||||
|
} catch (final Exception e) {
|
||||||
|
logger.warn("Failed to construct donation pub/sub message", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
long toMicros(final BigDecimal amount) {
|
long toMicros(final BigDecimal amount) {
|
||||||
return amount.multiply(ONE_MILLION).longValueExact();
|
return amount.multiply(ONE_MILLION).longValueExact();
|
||||||
|
|
Loading…
Reference in New Issue