killbill-memoizeit

jaxrs: implement missing endpoints for direct payments Signed-off-by:

4/25/2014 9:26:27 AM

Details

diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/DirectPaymentJson.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/DirectPaymentJson.java
index 40485d6..87bdd14 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/DirectPaymentJson.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/DirectPaymentJson.java
@@ -24,13 +24,12 @@ import javax.annotation.Nullable;
 
 import org.killbill.billing.payment.api.DirectPayment;
 import org.killbill.billing.payment.api.DirectPaymentTransaction;
-import org.killbill.billing.payment.api.TransactionType;
+import org.killbill.billing.util.audit.AccountAuditLogs;
 import org.killbill.billing.util.audit.AuditLog;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.common.base.Function;
-import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 
@@ -69,25 +68,25 @@ public class DirectPaymentJson extends JsonBase {
         this.transactions = transactions;
     }
 
-    public DirectPaymentJson(final DirectPayment dp, @Nullable final List<AuditLog> directPaymentLogs, @Nullable final List<AuditLog> directTransactionLogs) {
+    public DirectPaymentJson(final DirectPayment dp, @Nullable final AccountAuditLogs accountAuditLogs) {
         this(dp.getAccountId().toString(),
-              dp.getId().toString(),
-              dp.getPaymentNumber().toString(),
-              dp.getAuthAmount(),
-              dp.getCapturedAmount(),
-              dp.getRefundedAmount(),
-              dp.getCurrency() != null ? dp.getCurrency().toString() : null,
-              dp.getPaymentMethodId() != null ? dp.getPaymentMethodId().toString() : null,
-              getTransactions(dp.getTransactions(), dp.getId(), dp.getExternalKey(), directTransactionLogs),
-              toAuditLogJson(directPaymentLogs));
+             dp.getId().toString(),
+             dp.getPaymentNumber().toString(),
+             dp.getAuthAmount(),
+             dp.getCapturedAmount(),
+             dp.getRefundedAmount(),
+             dp.getCurrency() != null ? dp.getCurrency().toString() : null,
+             dp.getPaymentMethodId() != null ? dp.getPaymentMethodId().toString() : null,
+             getTransactions(dp.getTransactions(), dp.getId(), dp.getExternalKey(), accountAuditLogs),
+             toAuditLogJson(accountAuditLogs == null ? null : accountAuditLogs.getAuditLogsForDirectPayment(dp.getId())));
     }
 
-
-    private static List<DirectTransactionJson> getTransactions(final List<DirectPaymentTransaction> transactions, final UUID directPaymentId, final String externalKey, @Nullable final List<AuditLog> directTransactionLogs) {
+    private static List<DirectTransactionJson> getTransactions(final List<DirectPaymentTransaction> transactions, final UUID directPaymentId, final String externalKey, @Nullable final AccountAuditLogs accountAuditLogs) {
         return ImmutableList.copyOf(Iterables.transform(transactions, new Function<DirectPaymentTransaction, DirectTransactionJson>() {
             @Override
             public DirectTransactionJson apply(final DirectPaymentTransaction input) {
-                return new DirectTransactionJson(input,directPaymentId, externalKey, directTransactionLogs);
+                final List<AuditLog> auditLogsForDirectPaymentTransaction = accountAuditLogs == null ? null : accountAuditLogs.getAuditLogsForDirectPaymentTransaction(input.getId());
+                return new DirectTransactionJson(input, directPaymentId, externalKey, auditLogsForDirectPaymentTransaction);
             }
         }));
     }
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java
index e9c88b8..0d085d4 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java
@@ -616,14 +616,16 @@ public class AccountResource extends JaxRsResourceBase {
     @Path("/{accountId:" + UUID_PATTERN + "}/" + DIRECT_PAYMENTS)
     @Produces(APPLICATION_JSON)
     public Response getDirectPaymentsForAccount(@PathParam("accountId") final String accountIdStr,
+                                                @QueryParam(QUERY_AUDIT) @DefaultValue("NONE") final AuditMode auditMode,
                                                 @javax.ws.rs.core.Context final HttpServletRequest request) throws PaymentApiException {
         final UUID accountId = UUID.fromString(accountIdStr);
-        final List<DirectPayment> payments = directPaymentApi.getAccountPayments(accountId, context.createContext(request));
+        final TenantContext tenantContext = context.createContext(request);
+        final List<DirectPayment> payments = directPaymentApi.getAccountPayments(accountId, tenantContext);
+        final AccountAuditLogs accountAuditLogs = auditUserApi.getAccountAuditLogs(accountId, auditMode.getLevel(), tenantContext);
         final List<DirectPaymentJson> result = ImmutableList.copyOf(Iterables.transform(payments, new Function<DirectPayment, DirectPaymentJson>() {
             @Override
-            public DirectPaymentJson apply(final DirectPayment input) {
-                // STEPH_DP audits
-                return new DirectPaymentJson(input, null, null);
+            public DirectPaymentJson apply(final DirectPayment directPayment) {
+                return new DirectPaymentJson(directPayment, accountAuditLogs);
             }
         }));
         return Response.status(Response.Status.OK).entity(result).build();
@@ -649,7 +651,7 @@ public class AccountResource extends JaxRsResourceBase {
         final UUID directPaymentId = json.getDirectPaymentId() == null ? null : UUID.fromString(json.getDirectPaymentId());
 
         final TransactionType transactionType = TransactionType.valueOf(json.getTransactionType());
-        DirectPayment result;
+        final DirectPayment result;
         switch (transactionType) {
             case AUTHORIZE:
                 result = directPaymentApi.createAuthorization(account, directPaymentId, json.getAmount(), currency, json.getExternalKey(), pluginProperties, callContext);
@@ -694,7 +696,7 @@ public class AccountResource extends JaxRsResourceBase {
         final List<Refund> refunds = paymentApi.getAccountRefunds(account, tenantContext);
         final List<RefundJson> result = new ArrayList<RefundJson>(Collections2.transform(refunds, new Function<Refund, RefundJson>() {
             @Override
-            public RefundJson apply(Refund input) {
+            public RefundJson apply(final Refund input) {
                 // TODO Return adjusted items and audits
                 return new RefundJson(input, null, null);
             }
@@ -889,7 +891,7 @@ public class AccountResource extends JaxRsResourceBase {
         final UUID accountId = UUID.fromString(id);
 
         final List<AccountEmail> emails = accountUserApi.getEmails(accountId, context.createContext(request));
-        for (AccountEmail cur : emails) {
+        for (final AccountEmail cur : emails) {
             if (cur.getEmail().equals(email)) {
                 final AccountEmailJson accountEmailJson = new AccountEmailJson(accountId.toString(), email);
                 final AccountEmail accountEmail = accountEmailJson.toAccountEmail(cur.getId());
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/DirectPaymentResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/DirectPaymentResource.java
index 20ccbf9..665ea81 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/DirectPaymentResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/DirectPaymentResource.java
@@ -17,8 +17,12 @@
 
 package org.killbill.billing.jaxrs.resources;
 
+import java.net.URI;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.UUID;
+import java.util.concurrent.atomic.AtomicReference;
 
 import javax.inject.Inject;
 import javax.servlet.http.HttpServletRequest;
@@ -50,9 +54,16 @@ import org.killbill.billing.payment.api.PluginProperty;
 import org.killbill.billing.util.api.AuditUserApi;
 import org.killbill.billing.util.api.CustomFieldUserApi;
 import org.killbill.billing.util.api.TagUserApi;
+import org.killbill.billing.util.audit.AccountAuditLogs;
 import org.killbill.billing.util.callcontext.CallContext;
+import org.killbill.billing.util.callcontext.TenantContext;
+import org.killbill.billing.util.entity.Pagination;
 import org.killbill.clock.Clock;
 
+import com.google.common.base.Function;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableMap;
+
 import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
 
 @Path(JaxrsResource.DIRECT_PAYMENTS_PATH)
@@ -79,14 +90,99 @@ public class DirectPaymentResource extends JaxRsResourceBase {
     public Response getDirectPayment(@PathParam("directPaymentId") final String directPaymentIdStr,
                                      @QueryParam(QUERY_PAYMENT_METHOD_PLUGIN_INFO) @DefaultValue("false") final Boolean withPluginInfo,
                                      @QueryParam(QUERY_PLUGIN_PROPERTY) final List<String> pluginPropertiesString,
+                                     @QueryParam(QUERY_AUDIT) @DefaultValue("NONE") final AuditMode auditMode,
                                      @javax.ws.rs.core.Context final HttpServletRequest request) throws PaymentApiException {
         final Iterable<PluginProperty> pluginProperties = extractPluginProperties(pluginPropertiesString);
         final UUID directPaymentIdId = UUID.fromString(directPaymentIdStr);
-        final DirectPayment payment = directPaymentApi.getPayment(directPaymentIdId, withPluginInfo, pluginProperties, context.createContext(request));
-        final DirectPaymentJson result = new DirectPaymentJson(payment, null, null);
+        final TenantContext tenantContext = context.createContext(request);
+        final DirectPayment directPayment = directPaymentApi.getPayment(directPaymentIdId, withPluginInfo, pluginProperties, tenantContext);
+        final AccountAuditLogs accountAuditLogs = auditUserApi.getAccountAuditLogs(directPayment.getAccountId(), auditMode.getLevel(), tenantContext);
+        final DirectPaymentJson result = new DirectPaymentJson(directPayment, accountAuditLogs);
+
         return Response.status(Response.Status.OK).entity(result).build();
     }
 
+    @GET
+    @Path("/" + PAGINATION)
+    @Produces(APPLICATION_JSON)
+    public Response getDirectPayments(@QueryParam(QUERY_SEARCH_OFFSET) @DefaultValue("0") final Long offset,
+                                      @QueryParam(QUERY_SEARCH_LIMIT) @DefaultValue("100") final Long limit,
+                                      @QueryParam(QUERY_PAYMENT_PLUGIN_NAME) final String pluginName,
+                                      @QueryParam(QUERY_PLUGIN_PROPERTY) final List<String> pluginPropertiesString,
+                                      @QueryParam(QUERY_AUDIT) @DefaultValue("NONE") final AuditMode auditMode,
+                                      @javax.ws.rs.core.Context final HttpServletRequest request) throws PaymentApiException {
+        final Iterable<PluginProperty> pluginProperties = extractPluginProperties(pluginPropertiesString);
+        final TenantContext tenantContext = context.createContext(request);
+
+        final Pagination<DirectPayment> directPayments;
+        if (Strings.isNullOrEmpty(pluginName)) {
+            directPayments = directPaymentApi.getPayments(offset, limit, pluginProperties, tenantContext);
+        } else {
+            directPayments = directPaymentApi.getPayments(offset, limit, pluginName, pluginProperties, tenantContext);
+        }
+
+        final URI nextPageUri = uriBuilder.nextPage(DirectPaymentResource.class, "getDirectPayments", directPayments.getNextOffset(), limit, ImmutableMap.<String, String>of(QUERY_PAYMENT_METHOD_PLUGIN_NAME, Strings.nullToEmpty(pluginName),
+                                                                                                                                                                             QUERY_AUDIT, auditMode.getLevel().toString()));
+        final AtomicReference<Map<UUID, AccountAuditLogs>> accountsAuditLogs = new AtomicReference<Map<UUID, AccountAuditLogs>>(new HashMap<UUID, AccountAuditLogs>());
+
+        return buildStreamingPaginationResponse(directPayments,
+                                                new Function<DirectPayment, DirectPaymentJson>() {
+                                                    @Override
+                                                    public DirectPaymentJson apply(final DirectPayment directPayment) {
+                                                        // Cache audit logs per account
+                                                        if (accountsAuditLogs.get().get(directPayment.getAccountId()) == null) {
+                                                            accountsAuditLogs.get().put(directPayment.getAccountId(), auditUserApi.getAccountAuditLogs(directPayment.getAccountId(), auditMode.getLevel(), tenantContext));
+                                                        }
+                                                        final AccountAuditLogs accountAuditLogs = accountsAuditLogs.get().get(directPayment.getAccountId());
+                                                        return new DirectPaymentJson(directPayment, accountAuditLogs);
+                                                    }
+                                                },
+                                                nextPageUri
+                                               );
+    }
+
+    @GET
+    @Path("/" + SEARCH + "/{searchKey:" + ANYTHING_PATTERN + "}")
+    @Produces(APPLICATION_JSON)
+    public Response searchDirectPayments(@PathParam("searchKey") final String searchKey,
+                                         @QueryParam(QUERY_SEARCH_OFFSET) @DefaultValue("0") final Long offset,
+                                         @QueryParam(QUERY_SEARCH_LIMIT) @DefaultValue("100") final Long limit,
+                                         @QueryParam(QUERY_PAYMENT_PLUGIN_NAME) final String pluginName,
+                                         @QueryParam(QUERY_PLUGIN_PROPERTY) final List<String> pluginPropertiesString,
+                                         @QueryParam(QUERY_AUDIT) @DefaultValue("NONE") final AuditMode auditMode,
+                                         @javax.ws.rs.core.Context final HttpServletRequest request) throws PaymentApiException {
+        final Iterable<PluginProperty> pluginProperties = extractPluginProperties(pluginPropertiesString);
+        final TenantContext tenantContext = context.createContext(request);
+
+        // Search the plugin(s)
+        final Pagination<DirectPayment> directPayments;
+        if (Strings.isNullOrEmpty(pluginName)) {
+            directPayments = directPaymentApi.searchPayments(searchKey, offset, limit, pluginProperties, tenantContext);
+        } else {
+            directPayments = directPaymentApi.searchPayments(searchKey, offset, limit, pluginName, pluginProperties, tenantContext);
+        }
+
+        final URI nextPageUri = uriBuilder.nextPage(DirectPaymentResource.class, "searchDirectPayments", directPayments.getNextOffset(), limit, ImmutableMap.<String, String>of("searchKey", searchKey,
+                                                                                                                                                                                QUERY_PAYMENT_METHOD_PLUGIN_NAME, Strings.nullToEmpty(pluginName),
+                                                                                                                                                                                QUERY_AUDIT, auditMode.getLevel().toString()));
+        final AtomicReference<Map<UUID, AccountAuditLogs>> accountsAuditLogs = new AtomicReference<Map<UUID, AccountAuditLogs>>(new HashMap<UUID, AccountAuditLogs>());
+
+        return buildStreamingPaginationResponse(directPayments,
+                                                new Function<DirectPayment, DirectPaymentJson>() {
+                                                    @Override
+                                                    public DirectPaymentJson apply(final DirectPayment directPayment) {
+                                                        // Cache audit logs per account
+                                                        if (accountsAuditLogs.get().get(directPayment.getAccountId()) == null) {
+                                                            accountsAuditLogs.get().put(directPayment.getAccountId(), auditUserApi.getAccountAuditLogs(directPayment.getAccountId(), auditMode.getLevel(), tenantContext));
+                                                        }
+                                                        final AccountAuditLogs accountAuditLogs = accountsAuditLogs.get().get(directPayment.getAccountId());
+                                                        return new DirectPaymentJson(directPayment, accountAuditLogs);
+                                                    }
+                                                },
+                                                nextPageUri
+                                               );
+    }
+
     @POST
     @Path("/{directPaymentId:" + UUID_PATTERN + "}/")
     @Consumes(APPLICATION_JSON)
@@ -100,7 +196,6 @@ public class DirectPaymentResource extends JaxRsResourceBase {
                                          @javax.ws.rs.core.Context final UriInfo uriInfo,
                                          @javax.ws.rs.core.Context final HttpServletRequest request) throws PaymentApiException, AccountApiException {
         final Iterable<PluginProperty> pluginProperties = extractPluginProperties(pluginPropertiesString);
-        // STEPH_DP error code if no such payment
         final CallContext callContext = context.createContext(createdBy, reason, comment, request);
         final UUID directPaymentId = UUID.fromString(directPaymentIdStr);
         final DirectPayment initialPayment = directPaymentApi.getPayment(directPaymentId, false, pluginProperties, callContext);
@@ -112,6 +207,30 @@ public class DirectPaymentResource extends JaxRsResourceBase {
         return uriBuilder.buildResponse(uriInfo, DirectPaymentResource.class, "getDirectPayment", payment.getId());
     }
 
+    @POST
+    @Path("/{directPaymentId:" + UUID_PATTERN + "}/" + CREDITS)
+    @Consumes(APPLICATION_JSON)
+    @Produces(APPLICATION_JSON)
+    public Response creditPayment(final PaymentJson json,
+                                  @PathParam("directPaymentId") final String directPaymentIdStr,
+                                  @QueryParam(QUERY_PLUGIN_PROPERTY) final List<String> pluginPropertiesString,
+                                  @HeaderParam(HDR_CREATED_BY) final String createdBy,
+                                  @HeaderParam(HDR_REASON) final String reason,
+                                  @HeaderParam(HDR_COMMENT) final String comment,
+                                  @javax.ws.rs.core.Context final UriInfo uriInfo,
+                                  @javax.ws.rs.core.Context final HttpServletRequest request) throws PaymentApiException, AccountApiException {
+        final Iterable<PluginProperty> pluginProperties = extractPluginProperties(pluginPropertiesString);
+        final CallContext callContext = context.createContext(createdBy, reason, comment, request);
+        final UUID directPaymentId = UUID.fromString(directPaymentIdStr);
+        final DirectPayment initialPayment = directPaymentApi.getPayment(directPaymentId, false, pluginProperties, callContext);
+
+        final Account account = accountUserApi.getAccountById(initialPayment.getAccountId(), callContext);
+        final Currency currency = json.getCurrency() == null ? account.getCurrency() : Currency.valueOf(json.getCurrency());
+
+        final DirectPayment payment = directPaymentApi.createCredit(account, directPaymentId, json.getAmount(), currency, pluginProperties, callContext);
+        return uriBuilder.buildResponse(uriInfo, DirectPaymentResource.class, "getDirectPayment", payment.getId());
+    }
+
     @DELETE
     @Path("/{directPaymentId:" + UUID_PATTERN + "}/")
     @Consumes(APPLICATION_JSON)

pom.xml 2(+1 -1)

diff --git a/pom.xml b/pom.xml
index 8f296ff..6c670af 100644
--- a/pom.xml
+++ b/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill-oss-parent</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.7.4</version>
+        <version>0.7.5</version>
     </parent>
     <artifactId>killbill</artifactId>
     <version>0.11.2-SNAPSHOT</version>
diff --git a/util/src/main/java/org/killbill/billing/util/audit/DefaultAccountAuditLogs.java b/util/src/main/java/org/killbill/billing/util/audit/DefaultAccountAuditLogs.java
index 85bd2da..6995911 100644
--- a/util/src/main/java/org/killbill/billing/util/audit/DefaultAccountAuditLogs.java
+++ b/util/src/main/java/org/killbill/billing/util/audit/DefaultAccountAuditLogs.java
@@ -91,6 +91,16 @@ public class DefaultAccountAuditLogs implements AccountAuditLogs {
     }
 
     @Override
+    public List<AuditLog> getAuditLogsForDirectPayment(final UUID directPaymentId) {
+        return getAuditLogs(ObjectType.DIRECT_PAYMENT).getAuditLogs(directPaymentId);
+    }
+
+    @Override
+    public List<AuditLog> getAuditLogsForDirectPaymentTransaction(final UUID directPaymentTransactionId) {
+        return getAuditLogs(ObjectType.DIRECT_TRANSACTION).getAuditLogs(directPaymentTransactionId);
+    }
+
+    @Override
     public List<AuditLog> getAuditLogsForPaymentMethod(final UUID paymentMethodId) {
         return getAuditLogs(ObjectType.PAYMENT_METHOD).getAuditLogs(paymentMethodId);
     }