diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentMethodResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentMethodResource.java
index 002622a..92cd5f8 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentMethodResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentMethodResource.java
@@ -26,21 +26,25 @@ import java.util.UUID;
import java.util.concurrent.atomic.AtomicReference;
import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
+import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
+import javax.ws.rs.core.UriInfo;
import org.killbill.billing.ObjectType;
import org.killbill.billing.account.api.Account;
import org.killbill.billing.account.api.AccountApiException;
import org.killbill.billing.account.api.AccountUserApi;
+import org.killbill.billing.jaxrs.json.CustomFieldJson;
import org.killbill.billing.jaxrs.json.PaymentMethodJson;
import org.killbill.billing.jaxrs.util.Context;
import org.killbill.billing.jaxrs.util.JaxrsUriBuilder;
@@ -49,6 +53,7 @@ import org.killbill.billing.payment.api.PaymentApiException;
import org.killbill.billing.payment.api.PaymentMethod;
import org.killbill.billing.payment.api.PluginProperty;
import org.killbill.billing.util.api.AuditUserApi;
+import org.killbill.billing.util.api.CustomFieldApiException;
import org.killbill.billing.util.api.CustomFieldUserApi;
import org.killbill.billing.util.api.TagUserApi;
import org.killbill.billing.util.audit.AccountAuditLogs;
@@ -270,6 +275,53 @@ public class PaymentMethodResource extends JaxRsResourceBase {
return Response.status(Status.OK).build();
}
+ @Timed
+ @GET
+ @Path("/{paymentMethodId:" + UUID_PATTERN + "}/" + CUSTOM_FIELDS)
+ @Produces(APPLICATION_JSON)
+ @ApiOperation(value = "Retrieve payment method custom fields", response = CustomFieldJson.class, responseContainer = "List")
+ @ApiResponses(value = {@ApiResponse(code = 400, message = "Invalid payment method id supplied")})
+ public Response getCustomFields(@PathParam("paymentMethodId") final String paymentMethodId,
+ @QueryParam(QUERY_AUDIT) @DefaultValue("NONE") final AuditMode auditMode,
+ @javax.ws.rs.core.Context final HttpServletRequest request) {
+ return super.getCustomFields(UUID.fromString(paymentMethodId), auditMode, context.createContext(request));
+ }
+
+ @Timed
+ @POST
+ @Path("/{paymentMethodId:" + UUID_PATTERN + "}/" + CUSTOM_FIELDS)
+ @Consumes(APPLICATION_JSON)
+ @Produces(APPLICATION_JSON)
+ @ApiOperation(value = "Add custom fields to payment method")
+ @ApiResponses(value = {@ApiResponse(code = 400, message = "Invalid payment method id supplied")})
+ public Response createCustomFields(@PathParam("paymentMethodId") final String paymentMethodId,
+ final List<CustomFieldJson> customFields,
+ @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 HttpServletRequest request,
+ @javax.ws.rs.core.Context final UriInfo uriInfo) throws CustomFieldApiException {
+ return super.createCustomFields(UUID.fromString(paymentMethodId), customFields,
+ context.createContext(createdBy, reason, comment, request), uriInfo);
+ }
+
+ @Timed
+ @DELETE
+ @Path("/{paymentMethodId:" + UUID_PATTERN + "}/" + CUSTOM_FIELDS)
+ @Consumes(APPLICATION_JSON)
+ @Produces(APPLICATION_JSON)
+ @ApiOperation(value = "Remove custom fields from payment method")
+ @ApiResponses(value = {@ApiResponse(code = 400, message = "Invalid payment method id supplied")})
+ public Response deleteCustomFields(@PathParam("paymentMethodId") final String paymentMethodId,
+ @QueryParam(QUERY_CUSTOM_FIELDS) final String customFieldList,
+ @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 HttpServletRequest request) throws CustomFieldApiException {
+ return super.deleteCustomFields(UUID.fromString(paymentMethodId), customFieldList,
+ context.createContext(createdBy, reason, comment, request));
+ }
+
@Override
protected ObjectType getObjectType() {
return ObjectType.PAYMENT_METHOD;
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPaymentMethod.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPaymentMethod.java
index 5d3893d..eb8d746 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPaymentMethod.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPaymentMethod.java
@@ -19,16 +19,24 @@
package org.killbill.billing.jaxrs;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import java.util.UUID;
+import org.killbill.billing.ObjectType;
+import org.killbill.billing.client.KillBillClientException;
import org.killbill.billing.client.model.Account;
+import org.killbill.billing.client.model.CustomField;
+import org.killbill.billing.client.model.CustomFields;
import org.killbill.billing.client.model.PaymentMethod;
import org.killbill.billing.client.model.PaymentMethods;
import org.killbill.billing.client.model.PluginProperty;
+import org.killbill.billing.util.api.AuditLevel;
import org.testng.Assert;
import org.testng.annotations.Test;
+import static org.testng.Assert.assertEquals;
+
public class TestPaymentMethod extends TestJaxrsBase {
@Test(groups = "slow", description = "Create/retrieve by externalKey")
@@ -39,7 +47,7 @@ public class TestPaymentMethod extends TestJaxrsBase {
final PaymentMethod paymentMethodJson1 = killBillClient.getPaymentMethodByKey("foo", true);
final PaymentMethod paymentMethodJson2 = killBillClient.getPaymentMethod(accountJson.getPaymentMethodId(), true);
- Assert.assertEquals(paymentMethodJson1, paymentMethodJson2);
+ assertEquals(paymentMethodJson1, paymentMethodJson2);
final PaymentMethod paymentMethodJson3 = killBillClient.getPaymentMethodByKey("doesnotexist", true);
Assert.assertNull(paymentMethodJson3);
@@ -48,8 +56,8 @@ public class TestPaymentMethod extends TestJaxrsBase {
@Test(groups = "slow", description = "Can search payment methods")
public void testSearchPaymentMethods() throws Exception {
// Search random key
- Assert.assertEquals(killBillClient.searchPaymentMethodsByKey(UUID.randomUUID().toString()).size(), 0);
- Assert.assertEquals(killBillClient.searchPaymentMethodsByKeyAndPlugin(UUID.randomUUID().toString(), PLUGIN_NAME).size(), 0);
+ assertEquals(killBillClient.searchPaymentMethodsByKey(UUID.randomUUID().toString()).size(), 0);
+ assertEquals(killBillClient.searchPaymentMethodsByKeyAndPlugin(UUID.randomUUID().toString(), PLUGIN_NAME).size(), 0);
// Create a payment method
final List<PluginProperty> pmProperties = new ArrayList<PluginProperty>();
@@ -63,8 +71,8 @@ public class TestPaymentMethod extends TestJaxrsBase {
final PaymentMethod paymentMethodJson = killBillClient.getPaymentMethod(accountJson.getPaymentMethodId(), true);
// Search random key again
- Assert.assertEquals(killBillClient.searchPaymentMethodsByKey(UUID.randomUUID().toString()).size(), 0);
- Assert.assertEquals(killBillClient.searchPaymentMethodsByKeyAndPlugin(UUID.randomUUID().toString(), PLUGIN_NAME).size(), 0);
+ assertEquals(killBillClient.searchPaymentMethodsByKey(UUID.randomUUID().toString()).size(), 0);
+ assertEquals(killBillClient.searchPaymentMethodsByKeyAndPlugin(UUID.randomUUID().toString(), PLUGIN_NAME).size(), 0);
// Last 4
doSearch("4365", paymentMethodJson);
@@ -85,25 +93,73 @@ public class TestPaymentMethod extends TestJaxrsBase {
}
final PaymentMethods allPaymentMethods = killBillClient.getPaymentMethods();
- Assert.assertEquals(allPaymentMethods.size(), 5);
+ assertEquals(allPaymentMethods.size(), 5);
PaymentMethods page = killBillClient.getPaymentMethods(0L, 1L);
for (int i = 0; i < 5; i++) {
Assert.assertNotNull(page);
- Assert.assertEquals(page.size(), 1);
- Assert.assertEquals(page.get(0), allPaymentMethods.get(i));
+ assertEquals(page.size(), 1);
+ assertEquals(page.get(0), allPaymentMethods.get(i));
page = page.getNext();
}
Assert.assertNull(page);
}
+ @Test(groups = "slow", description = "Can create, retrieve and delete custom fields")
+ public void testPaymentMethodCustomFields() throws Exception {
+ Account account = createAccountWithDefaultPaymentMethod();
+ UUID paymentMethodId = account.getPaymentMethodId();
+
+ // create custom field
+ CustomField customField = createCustomFieldJson(paymentMethodId, ObjectType.PAYMENT_METHOD, "testKey", "testValue");
+ CustomFields createdCustomFields = killBillClient.createPaymentMethodCustomField(paymentMethodId,customField, createdBy, reason, comment);
+ assertEquals(createdCustomFields.size(), 1);
+ CustomField createdCustomField = createdCustomFields.get(0);
+ assertEquals(createdCustomField.getName(), "testKey");
+ assertEquals(createdCustomField.getValue(), "testValue");
+ assertEquals(createdCustomField.getObjectId(), paymentMethodId);
+ assertEquals(createdCustomField.getObjectType(), ObjectType.PAYMENT_METHOD);
+
+ // retrieve custom field
+ CustomFields retrievedCustomFields = killBillClient.getPaymentMethodCustomFields(paymentMethodId, AuditLevel.NONE);
+ assertEquals(retrievedCustomFields.size(), 1);
+ CustomField retrievedCustomField = retrievedCustomFields.get(0);
+ assertEquals(retrievedCustomField.getName(), "testKey");
+ assertEquals(retrievedCustomField.getValue(), "testValue");
+ assertEquals(retrievedCustomField.getObjectId(), paymentMethodId);
+ assertEquals(retrievedCustomField.getObjectType(), ObjectType.PAYMENT_METHOD);
+
+ // delete custom field
+ killBillClient.deletePaymentMethodCustomFields(paymentMethodId, Arrays.asList(createdCustomField.getCustomFieldId()), createdBy, reason, comment);
+ CustomFields deletedCustomFields = killBillClient.getPaymentMethodCustomFields(paymentMethodId, AuditLevel.NONE);
+ assertEquals(deletedCustomFields.size(), 0);
+ }
+
+ private CustomField createCustomFieldJson(final UUID objectId, final ObjectType objectType, final String name, final String value) {
+ return new CustomField() {
+ {
+ setObjectId(objectId);
+ setObjectType(objectType);
+ setName(name);
+ setValue(value);
+ }
+ };
+ }
+
+ private CustomField createCustomField(final UUID paymentMethodId, final String name, final String value) throws KillBillClientException {
+ CustomField customField = createCustomFieldJson(paymentMethodId, ObjectType.PAYMENT_METHOD, name, value);
+ CustomFields customFields = killBillClient.createPaymentMethodCustomField(paymentMethodId,customField, createdBy, reason, comment);
+ assertEquals(customFields.size(), 1);
+ return customFields.get(0);
+ }
+
private void doSearch(final String searchKey, final PaymentMethod paymentMethodJson) throws Exception {
final List<PaymentMethod> results1 = killBillClient.searchPaymentMethodsByKey(searchKey, true);
- Assert.assertEquals(results1.size(), 1);
- Assert.assertEquals(results1.get(0), paymentMethodJson);
+ assertEquals(results1.size(), 1);
+ assertEquals(results1.get(0), paymentMethodJson);
final List<PaymentMethod> results2 = killBillClient.searchPaymentMethodsByKeyAndPlugin(searchKey, PLUGIN_NAME);
- Assert.assertEquals(results2.size(), 1);
- Assert.assertEquals(results2.get(0), paymentMethodJson);
+ assertEquals(results2.size(), 1);
+ assertEquals(results2.get(0), paymentMethodJson);
}
}