killbill-memoizeit

jaxrs: add resource to retrieve a payment by id Signed-off-by:

8/16/2012 7:25:25 PM

Details

diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/PaymentJsonSimple.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/PaymentJsonSimple.java
index 360202b..b49715c 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/PaymentJsonSimple.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/PaymentJsonSimple.java
@@ -33,33 +33,19 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 public class PaymentJsonSimple extends JsonBase {
 
     private final BigDecimal paidAmount;
-
     private final BigDecimal amount;
-
     private final String accountId;
-
     private final String invoiceId;
-
     private final String paymentId;
-
     private final DateTime requestedDate;
-
     private final DateTime effectiveDate;
-
     private final Integer retryCount;
-
     private final String currency;
-
     private final String status;
-
     private final String gatewayErrorCode;
-
     private final String gatewayErrorMsg;
-
     private final String paymentMethodId;
-
     private final String extFirstPaymentIdRef;
-
     private final String extSecondPaymentIdRef;
 
     @JsonCreator
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/PaymentJsonWithBundleKeys.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/PaymentJsonWithBundleKeys.java
index d7029dc..77df918 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/PaymentJsonWithBundleKeys.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/PaymentJsonWithBundleKeys.java
@@ -65,8 +65,13 @@ public class PaymentJsonWithBundleKeys extends PaymentJsonSimple {
     }
 
     public PaymentJsonWithBundleKeys(final Payment payment, final String status, final int nbOfPaymentAttempts, final String bundleExternalKey,
+                                     final UUID accountId, final List<RefundJson> refunds, final List<ChargebackJson> chargebacks) {
+        this(payment, status, nbOfPaymentAttempts, bundleExternalKey, accountId, refunds, chargebacks, null);
+    }
+
+    public PaymentJsonWithBundleKeys(final Payment payment, final String status, final int nbOfPaymentAttempts, final String bundleExternalKey,
                                      final UUID accountId, final List<RefundJson> refunds, final List<ChargebackJson> chargebacks,
-                                     final List<AuditLog> auditLogs) {
+                                     @Nullable final List<AuditLog> auditLogs) {
         this(payment.getAmount(), payment.getPaidAmount(), accountId.toString(),
              payment.getInvoiceId().toString(), payment.getId().toString(),
              payment.getPaymentMethodId().toString(),
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/RefundJson.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/RefundJson.java
index 3a52b58..8dd0c8e 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/RefundJson.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/RefundJson.java
@@ -65,6 +65,10 @@ public class RefundJson extends JsonBase {
         this.adjustments = adjustments;
     }
 
+    public RefundJson(final Refund refund) {
+        this(refund, null, null);
+    }
+
     public RefundJson(final Refund refund, @Nullable final List<InvoiceItem> adjustments, @Nullable final List<AuditLog> auditLogs) {
         this(refund.getId().toString(), refund.getPaymentId().toString(), refund.getRefundAmount(), refund.getCurrency().toString(),
              refund.isAdjusted(), refund.getEffectiveDate(), refund.getEffectiveDate(),
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/JaxrsResource.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/JaxrsResource.java
index 3f48212..eeb1034 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/JaxrsResource.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/JaxrsResource.java
@@ -59,6 +59,7 @@ public interface JaxrsResource {
     public static final String QUERY_PAYMENT_EXTERNAL = "externalPayment";
     public static final String QUERY_PAYMENT_LAST4_CC = "last4CC";
     public static final String QUERY_PAYMENT_NAME_ON_CC = "nameOnCC";
+    public static final String QUERY_PAYMENT_WITH_REFUNDS_AND_CHARGEBACKS = "withRefundsAndChargebacks";
 
     public static final String QUERY_TAGS = "tagList";
     public static final String QUERY_CUSTOM_FIELDS = "customFieldList";
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/PaymentResource.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/PaymentResource.java
index 24f6bc2..cea02e2 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/PaymentResource.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/PaymentResource.java
@@ -40,8 +40,13 @@ import javax.ws.rs.core.UriInfo;
 import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountApiException;
 import com.ning.billing.account.api.AccountUserApi;
+import com.ning.billing.invoice.api.InvoicePayment;
+import com.ning.billing.invoice.api.InvoicePaymentApi;
+import com.ning.billing.jaxrs.json.ChargebackJson;
 import com.ning.billing.jaxrs.json.CustomFieldJson;
 import com.ning.billing.jaxrs.json.InvoiceItemJsonSimple;
+import com.ning.billing.jaxrs.json.PaymentJsonSimple;
+import com.ning.billing.jaxrs.json.PaymentJsonWithBundleKeys;
 import com.ning.billing.jaxrs.json.RefundJson;
 import com.ning.billing.jaxrs.util.Context;
 import com.ning.billing.jaxrs.util.JaxrsUriBuilder;
@@ -70,22 +75,61 @@ public class PaymentResource extends JaxRsResourceBase {
 
     private final Context context;
     private final PaymentApi paymentApi;
+    private final InvoicePaymentApi invoicePaymentApi;
     private final AccountUserApi accountApi;
 
     @Inject
     public PaymentResource(final JaxrsUriBuilder uriBuilder,
                            final AccountUserApi accountApi,
                            final PaymentApi paymentApi,
+                           final InvoicePaymentApi invoicePaymentApi,
                            final TagUserApi tagUserApi,
                            final CustomFieldUserApi customFieldUserApi,
                            final Context context) {
         super(uriBuilder, tagUserApi, customFieldUserApi);
         this.context = context;
         this.paymentApi = paymentApi;
+        this.invoicePaymentApi = invoicePaymentApi;
         this.accountApi = accountApi;
     }
 
     @GET
+    @Path("/{paymentId:" + UUID_PATTERN + "}")
+    @Produces(APPLICATION_JSON)
+    public Response getPayment(@PathParam(ID_PARAM_NAME) final String paymentIdString,
+                               @QueryParam(QUERY_PAYMENT_WITH_REFUNDS_AND_CHARGEBACKS) @DefaultValue("false") final Boolean withRefundsAndChargebacks) throws PaymentApiException {
+        final UUID paymentId = UUID.fromString(paymentIdString);
+        final Payment payment = paymentApi.getPayment(paymentId);
+
+        final PaymentJsonSimple paymentJsonSimple;
+        if (withRefundsAndChargebacks) {
+            final List<RefundJson> refunds = new ArrayList<RefundJson>();
+            for (final Refund refund : paymentApi.getPaymentRefunds(paymentId)) {
+                refunds.add(new RefundJson(refund));
+            }
+
+            final List<ChargebackJson> chargebacks = new ArrayList<ChargebackJson>();
+            for (final InvoicePayment chargeback : invoicePaymentApi.getChargebacksByPaymentId(paymentId)) {
+                chargebacks.add(new ChargebackJson(chargeback));
+            }
+
+            final int nbOfPaymentAttempts = payment.getAttempts().size();
+            final String status = payment.getPaymentStatus().toString();
+            paymentJsonSimple = new PaymentJsonWithBundleKeys(payment,
+                                                              status,
+                                                              nbOfPaymentAttempts,
+                                                              null, // TODO - the keys are really only used for the timeline
+                                                              payment.getAccountId(),
+                                                              refunds,
+                                                              chargebacks);
+        } else {
+            paymentJsonSimple = new PaymentJsonSimple(payment);
+        }
+
+        return Response.status(Status.OK).entity(paymentJsonSimple).build();
+    }
+
+    @GET
     @Path("/{paymentId:" + UUID_PATTERN + "}/" + REFUNDS)
     @Produces(APPLICATION_JSON)
     public Response getRefunds(@PathParam("paymentId") final String paymentId) throws PaymentApiException {
diff --git a/server/src/test/java/com/ning/billing/jaxrs/TestJaxrsBase.java b/server/src/test/java/com/ning/billing/jaxrs/TestJaxrsBase.java
index 54149d7..c51afa1 100644
--- a/server/src/test/java/com/ning/billing/jaxrs/TestJaxrsBase.java
+++ b/server/src/test/java/com/ning/billing/jaxrs/TestJaxrsBase.java
@@ -75,6 +75,7 @@ import com.ning.billing.jaxrs.json.InvoiceItemJsonSimple;
 import com.ning.billing.jaxrs.json.InvoiceJsonSimple;
 import com.ning.billing.jaxrs.json.InvoiceJsonWithItems;
 import com.ning.billing.jaxrs.json.PaymentJsonSimple;
+import com.ning.billing.jaxrs.json.PaymentJsonWithBundleKeys;
 import com.ning.billing.jaxrs.json.PaymentMethodJson;
 import com.ning.billing.jaxrs.json.PaymentMethodJson.PaymentMethodPluginDetailJson;
 import com.ning.billing.jaxrs.json.PaymentMethodJson.PaymentMethodProperties;
@@ -680,6 +681,26 @@ public class TestJaxrsBase extends ServerTestSuiteWithEmbeddedDB {
     // PAYMENT UTILITIES
     //
 
+    protected PaymentJsonSimple getPayment(final String paymentId) throws IOException {
+        return doGetPayment(paymentId, DEFAULT_EMPTY_QUERY, PaymentJsonSimple.class);
+    }
+
+    protected PaymentJsonWithBundleKeys getPaymentWithRefundsAndChargebacks(final String paymentId) throws IOException {
+        return doGetPayment(paymentId, ImmutableMap.<String, String>of(JaxrsResource.QUERY_PAYMENT_WITH_REFUNDS_AND_CHARGEBACKS, "true"), PaymentJsonWithBundleKeys.class);
+    }
+
+    protected <T extends PaymentJsonSimple> T doGetPayment(final String paymentId, final Map<String, String> queryParams, final Class<T> clazz) throws IOException {
+        final String paymentURI = JaxrsResource.PAYMENTS_PATH + "/" + paymentId;
+
+        final Response paymentResponse = doGet(paymentURI, queryParams, DEFAULT_HTTP_TIMEOUT_SEC);
+        assertEquals(paymentResponse.getStatusCode(), Status.OK.getStatusCode());
+
+        final T paymentJsonSimple = mapper.readValue(paymentResponse.getResponseBody(), clazz);
+        assertNotNull(paymentJsonSimple);
+
+        return paymentJsonSimple;
+    }
+
     protected PaymentMethodJson getPaymentMethod(final String paymentMethodId) throws IOException {
         final String paymentMethodURI = JaxrsResource.PAYMENT_METHODS_PATH + "/" + paymentMethodId;
         final Response paymentMethodResponse = doGet(paymentMethodURI, DEFAULT_EMPTY_QUERY, DEFAULT_HTTP_TIMEOUT_SEC);
diff --git a/server/src/test/java/com/ning/billing/jaxrs/TestPayment.java b/server/src/test/java/com/ning/billing/jaxrs/TestPayment.java
index a95ac00..2c2942e 100644
--- a/server/src/test/java/com/ning/billing/jaxrs/TestPayment.java
+++ b/server/src/test/java/com/ning/billing/jaxrs/TestPayment.java
@@ -29,12 +29,21 @@ import com.ning.billing.jaxrs.json.InvoiceItemJsonSimple;
 import com.ning.billing.jaxrs.json.InvoiceJsonSimple;
 import com.ning.billing.jaxrs.json.InvoiceJsonWithItems;
 import com.ning.billing.jaxrs.json.PaymentJsonSimple;
+import com.ning.billing.jaxrs.json.PaymentJsonWithBundleKeys;
 import com.ning.billing.jaxrs.json.PaymentMethodJson;
 import com.ning.billing.jaxrs.json.RefundJson;
 
 public class TestPayment extends TestJaxrsBase {
 
     @Test(groups = "slow")
+    public void testRetrievePayment() throws Exception {
+        final PaymentJsonSimple paymentJsonSimple = setupScenarioWithPayment();
+
+        final PaymentJsonSimple retrievedPaymentJsonSimple = getPayment(paymentJsonSimple.getPaymentId());
+        Assert.assertEquals(retrievedPaymentJsonSimple, paymentJsonSimple);
+    }
+
+    @Test(groups = "slow")
     public void testFullRefundWithNoAdjustment() throws Exception {
         final PaymentJsonSimple paymentJsonSimple = setupScenarioWithPayment();
 
@@ -181,6 +190,27 @@ public class TestPayment extends TestJaxrsBase {
         // Verify the refunds
         final List<RefundJson> retrievedRefunds = getRefundsForPayment(paymentJsonSimple.getPaymentId());
         Assert.assertEquals(retrievedRefunds.size(), 1);
+
+        // Verify the refund via the payment API
+        final PaymentJsonWithBundleKeys retrievedPaymentJsonWithBundleKeys = getPaymentWithRefundsAndChargebacks(paymentJsonSimple.getPaymentId());
+        Assert.assertEquals(retrievedPaymentJsonWithBundleKeys.getPaymentId(), paymentJsonSimple.getPaymentId());
+        Assert.assertEquals(retrievedPaymentJsonWithBundleKeys.getPaidAmount(), paymentJsonSimple.getPaidAmount().add(refundAmount.negate()).setScale(2, RoundingMode.HALF_UP));
+        Assert.assertEquals(retrievedPaymentJsonWithBundleKeys.getAmount(), paymentJsonSimple.getAmount());
+        Assert.assertEquals(retrievedPaymentJsonWithBundleKeys.getAccountId(), paymentJsonSimple.getAccountId());
+        Assert.assertEquals(retrievedPaymentJsonWithBundleKeys.getInvoiceId(), paymentJsonSimple.getInvoiceId());
+        Assert.assertEquals(retrievedPaymentJsonWithBundleKeys.getRequestedDate(), paymentJsonSimple.getRequestedDate());
+        Assert.assertEquals(retrievedPaymentJsonWithBundleKeys.getEffectiveDate(), paymentJsonSimple.getEffectiveDate());
+        Assert.assertEquals(retrievedPaymentJsonWithBundleKeys.getRetryCount(), paymentJsonSimple.getRetryCount());
+        Assert.assertEquals(retrievedPaymentJsonWithBundleKeys.getCurrency(), paymentJsonSimple.getCurrency());
+        Assert.assertEquals(retrievedPaymentJsonWithBundleKeys.getStatus(), paymentJsonSimple.getStatus());
+        Assert.assertEquals(retrievedPaymentJsonWithBundleKeys.getGatewayErrorCode(), paymentJsonSimple.getGatewayErrorCode());
+        Assert.assertEquals(retrievedPaymentJsonWithBundleKeys.getGatewayErrorMsg(), paymentJsonSimple.getGatewayErrorMsg());
+        Assert.assertEquals(retrievedPaymentJsonWithBundleKeys.getPaymentMethodId(), paymentJsonSimple.getPaymentMethodId());
+        Assert.assertEquals(retrievedPaymentJsonWithBundleKeys.getExtFirstPaymentIdRef(), paymentJsonSimple.getExtFirstPaymentIdRef());
+        Assert.assertEquals(retrievedPaymentJsonWithBundleKeys.getExtSecondPaymentIdRef(), paymentJsonSimple.getExtSecondPaymentIdRef());
+        Assert.assertEquals(retrievedPaymentJsonWithBundleKeys.getChargebacks().size(), 0);
+        Assert.assertEquals(retrievedPaymentJsonWithBundleKeys.getRefunds().size(), 1);
+        Assert.assertEquals(retrievedPaymentJsonWithBundleKeys.getRefunds().get(0), refundJsonCheck);
     }
 
     private void verifyInvoice(final PaymentJsonSimple paymentJsonSimple, final BigDecimal expectedInvoiceBalance) throws IOException {