Skip to content

Commit

Permalink
jaxrs: Fixes #626
Browse files Browse the repository at this point in the history
  • Loading branch information
sbrossie committed Oct 15, 2016
1 parent 35ddc21 commit d9783da
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 7 deletions.
Expand Up @@ -99,6 +99,7 @@
import org.killbill.billing.payment.api.PaymentOptions; import org.killbill.billing.payment.api.PaymentOptions;
import org.killbill.billing.payment.api.PaymentTransaction; import org.killbill.billing.payment.api.PaymentTransaction;
import org.killbill.billing.payment.api.PluginProperty; import org.killbill.billing.payment.api.PluginProperty;
import org.killbill.billing.payment.api.TransactionStatus;
import org.killbill.billing.payment.api.TransactionType; import org.killbill.billing.payment.api.TransactionType;
import org.killbill.billing.util.UUIDs; import org.killbill.billing.util.UUIDs;
import org.killbill.billing.util.api.AuditLevel; import org.killbill.billing.util.api.AuditLevel;
Expand Down Expand Up @@ -949,10 +950,15 @@ private Response processPayment(final PaymentTransactionJson json,
final UUID paymentMethodId; final UUID paymentMethodId;
if (paymentId != null) { if (paymentId != null) {
final Payment initialPayment = paymentApi.getPayment(paymentId, false, false, pluginProperties, callContext); final Payment initialPayment = paymentApi.getPayment(paymentId, false, false, pluginProperties, callContext);
final PaymentTransaction pendingTransaction = lookupPendingTransaction(initialPayment, final PaymentTransaction pendingOrSuccessTransaction = lookupPendingOrSuccessTransaction(initialPayment,
json != null ? json.getTransactionId() : null, json != null ? json.getTransactionId() : null,
json != null ? json.getTransactionExternalKey() : null, json != null ? json.getTransactionExternalKey() : null,
json != null ? json.getTransactionType() : null); json != null ? json.getTransactionType() : null);
// If transaction was already completed, return early (See #626)
if (pendingOrSuccessTransaction.getTransactionStatus() == TransactionStatus.SUCCESS) {
return uriBuilder.buildResponse(uriInfo, PaymentResource.class, "getPayment", pendingOrSuccessTransaction.getPaymentId());
}

paymentMethodId = initialPayment.getPaymentMethodId(); paymentMethodId = initialPayment.getPaymentMethodId();
} else { } else {
paymentMethodId = paymentMethodIdStr == null ? account.getPaymentMethodId() : UUID.fromString(paymentMethodIdStr); paymentMethodId = paymentMethodIdStr == null ? account.getPaymentMethodId() : UUID.fromString(paymentMethodIdStr);
Expand Down
Expand Up @@ -348,11 +348,11 @@ protected void validatePaymentMethodForAccount(final UUID accountId, final UUID
} }
} }


protected PaymentTransaction lookupPendingTransaction(final Payment initialPayment, @Nullable final String transactionId, @Nullable final String transactionExternalKey, @Nullable final String transactionType) throws PaymentApiException { protected PaymentTransaction lookupPendingOrSuccessTransaction(final Payment initialPayment, @Nullable final String transactionId, @Nullable final String transactionExternalKey, @Nullable final String transactionType) throws PaymentApiException {
final Collection<PaymentTransaction> pendingTransaction = Collections2.filter(initialPayment.getTransactions(), new Predicate<PaymentTransaction>() { final Collection<PaymentTransaction> pendingTransaction = Collections2.filter(initialPayment.getTransactions(), new Predicate<PaymentTransaction>() {
@Override @Override
public boolean apply(final PaymentTransaction input) { public boolean apply(final PaymentTransaction input) {
if (input.getTransactionStatus() != TransactionStatus.PENDING) { if (input.getTransactionStatus() != TransactionStatus.PENDING && input.getTransactionStatus() != TransactionStatus.SUCCESS) {
return false; return false;
} }
if (transactionId != null && !transactionId.equals(input.getId().toString())) { if (transactionId != null && !transactionId.equals(input.getId().toString())) {
Expand Down
Expand Up @@ -61,6 +61,7 @@
import org.killbill.billing.payment.api.PaymentOptions; import org.killbill.billing.payment.api.PaymentOptions;
import org.killbill.billing.payment.api.PaymentTransaction; import org.killbill.billing.payment.api.PaymentTransaction;
import org.killbill.billing.payment.api.PluginProperty; import org.killbill.billing.payment.api.PluginProperty;
import org.killbill.billing.payment.api.TransactionStatus;
import org.killbill.billing.payment.api.TransactionType; import org.killbill.billing.payment.api.TransactionType;
import org.killbill.billing.util.api.AuditUserApi; import org.killbill.billing.util.api.AuditUserApi;
import org.killbill.billing.util.api.CustomFieldApiException; import org.killbill.billing.util.api.CustomFieldApiException;
Expand Down Expand Up @@ -310,11 +311,17 @@ private Response completeTransactionInternal(final PaymentTransactionJson json,
final BigDecimal amount = json == null ? null : json.getAmount(); final BigDecimal amount = json == null ? null : json.getAmount();
final Currency currency = json == null || json.getCurrency() == null ? null : Currency.valueOf(json.getCurrency()); final Currency currency = json == null || json.getCurrency() == null ? null : Currency.valueOf(json.getCurrency());


final PaymentTransaction pendingTransaction = lookupPendingTransaction(initialPayment, final PaymentTransaction pendingOrSuccessTransaction = lookupPendingOrSuccessTransaction(initialPayment,
json != null ? json.getTransactionId() : null, json != null ? json.getTransactionId() : null,
json != null ? json.getTransactionExternalKey() : null, json != null ? json.getTransactionExternalKey() : null,
json != null ? json.getTransactionType() : null); json != null ? json.getTransactionType() : null);
// If transaction was already completed, return early (See #626)
if (pendingOrSuccessTransaction.getTransactionStatus() == TransactionStatus.SUCCESS) {
return uriBuilder.buildResponse(uriInfo, PaymentResource.class, "getPayment", pendingOrSuccessTransaction.getPaymentId());
}



final PaymentTransaction pendingTransaction = pendingOrSuccessTransaction;
final PaymentOptions paymentOptions = createControlPluginApiPaymentOptions(paymentControlPluginNames); final PaymentOptions paymentOptions = createControlPluginApiPaymentOptions(paymentControlPluginNames);
final Payment result; final Payment result;
switch (pendingTransaction.getTransactionType()) { switch (pendingTransaction.getTransactionType()) {
Expand Down

0 comments on commit d9783da

Please sign in to comment.