killbill-memoizeit
Changes
util/src/main/java/org/killbill/billing/util/customfield/api/DefaultCustomFieldUserApi.java 15(+15 -0)
util/src/main/resources/org/killbill/billing/util/customfield/dao/CustomFieldSqlDao.sql.stg 8(+8 -0)
Details
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 6cbcebb..ebd4840 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
@@ -1232,6 +1232,25 @@ public class AccountResource extends JaxRsResourceBase {
comment, request), uriInfo, request);
}
+
+ @TimedResource
+ @PUT
+ @Path("/{accountId:" + UUID_PATTERN + "}/" + CUSTOM_FIELDS)
+ @Consumes(APPLICATION_JSON)
+ @Produces(APPLICATION_JSON)
+ @ApiOperation(value = "Modify custom fields to account")
+ @ApiResponses(value = {@ApiResponse(code = 400, message = "Invalid account id supplied")})
+ public Response modifyCustomFields(@PathParam(ID_PARAM_NAME) final String accountIdStr,
+ 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) throws CustomFieldApiException {
+ final UUID accountId = UUID.fromString(accountIdStr);
+ return super.modifyCustomFields(accountId, customFields, context.createCallContextWithAccountId(accountId, createdBy, reason,
+ comment, request));
+ }
+
@TimedResource
@DELETE
@Path("/{accountId:" + UUID_PATTERN + "}/" + CUSTOM_FIELDS)
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/BundleResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/BundleResource.java
index f87438a..cff17bc 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/BundleResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/BundleResource.java
@@ -324,6 +324,26 @@ public class BundleResource extends JaxRsResourceBase {
}
@TimedResource
+ @PUT
+ @Path("/{bundleId:" + UUID_PATTERN + "}/" + CUSTOM_FIELDS)
+ @Consumes(APPLICATION_JSON)
+ @Produces(APPLICATION_JSON)
+ @ApiOperation(value = "Modify custom fields to bundle")
+ @ApiResponses(value = {@ApiResponse(code = 400, message = "Invalid bundle id supplied")})
+ public Response modifyCustomFields(@PathParam(ID_PARAM_NAME) final String id,
+ 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) throws CustomFieldApiException {
+ return super.modifyCustomFields(UUID.fromString(id), customFields,
+ context.createCallContextNoAccountId(createdBy, reason, comment, request));
+ }
+
+
+
+
+ @TimedResource
@DELETE
@Path("/{bundleId:" + UUID_PATTERN + "}/" + CUSTOM_FIELDS)
@Consumes(APPLICATION_JSON)
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoicePaymentResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoicePaymentResource.java
index 45e0cb4..ca157b6 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoicePaymentResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoicePaymentResource.java
@@ -73,7 +73,6 @@ import org.killbill.billing.util.audit.AccountAuditLogs;
import org.killbill.billing.util.callcontext.CallContext;
import org.killbill.billing.util.callcontext.TenantContext;
import org.killbill.clock.Clock;
-import org.killbill.commons.metrics.MetricTag;
import org.killbill.commons.metrics.TimedResource;
import com.google.common.base.Predicate;
@@ -349,6 +348,25 @@ public class InvoicePaymentResource extends JaxRsResourceBase {
context.createCallContextNoAccountId(createdBy, reason, comment, request), uriInfo, request);
}
+
+ @TimedResource
+ @PUT
+ @Path("/{paymentId:" + UUID_PATTERN + "}/" + CUSTOM_FIELDS)
+ @Consumes(APPLICATION_JSON)
+ @Produces(APPLICATION_JSON)
+ @ApiOperation(value = "Modify custom fields to payment")
+ @ApiResponses(value = {@ApiResponse(code = 400, message = "Invalid payment id supplied")})
+ public Response modifyCustomFields(@PathParam(ID_PARAM_NAME) final String id,
+ 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) throws CustomFieldApiException {
+ return super.modifyCustomFields(UUID.fromString(id), customFields,
+ context.createCallContextNoAccountId(createdBy, reason, comment, request));
+ }
+
+
@TimedResource
@DELETE
@Path("/{paymentId:" + UUID_PATTERN + "}/" + CUSTOM_FIELDS)
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoiceResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoiceResource.java
index 4592153..9a4cb37 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoiceResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoiceResource.java
@@ -901,6 +901,24 @@ public class InvoiceResource extends JaxRsResourceBase {
context.createCallContextNoAccountId(createdBy, reason, comment, request), uriInfo, request);
}
+
+ @TimedResource
+ @PUT
+ @Path("/{invoiceId:" + UUID_PATTERN + "}/" + CUSTOM_FIELDS)
+ @Consumes(APPLICATION_JSON)
+ @Produces(APPLICATION_JSON)
+ @ApiOperation(value = "Modify custom fields to invoice")
+ @ApiResponses(value = {@ApiResponse(code = 400, message = "Invalid invoice id supplied")})
+ public Response modifyCustomFields(@PathParam(ID_PARAM_NAME) final String id,
+ 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) throws CustomFieldApiException {
+ return super.modifyCustomFields(UUID.fromString(id), customFields,
+ context.createCallContextNoAccountId(createdBy, reason, comment, request));
+ }
+
@TimedResource
@DELETE
@Path("/{invoiceId:" + UUID_PATTERN + "}/" + CUSTOM_FIELDS)
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxRsResourceBase.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxRsResourceBase.java
index 07fbc86..fb81844 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxRsResourceBase.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxRsResourceBase.java
@@ -268,6 +268,23 @@ public abstract class JaxRsResourceBase implements JaxrsResource {
return uriBuilder.buildResponse(uriInfo, this.getClass(), "getCustomFields", id, request);
}
+
+ protected Response modifyCustomFields(final UUID id,
+ final List<CustomFieldJson> customFields,
+ final CallContext context) throws CustomFieldApiException {
+ final LinkedList<CustomField> input = new LinkedList<CustomField>();
+ for (final CustomFieldJson cur : customFields) {
+ verifyNonNullOrEmpty(cur.getCustomFieldId(), "CustomFieldJson id needs to be set");
+ verifyNonNullOrEmpty(cur.getValue(), "CustomFieldJson value needs to be set");
+ input.add(new StringCustomField(UUID.fromString(cur.getCustomFieldId()), cur.getName(), cur.getValue(), getObjectType(), id, context.getCreatedDate()));
+ }
+
+ customFieldUserApi.updateCustomFields(input, context);
+ return Response.status(Response.Status.OK).build();
+ }
+
+
+
/**
* @param id the if of the object for which the custom fields apply
* @param customFieldList a comma separated list of custom field ids or null if they should all be removed
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 f6542a3..e765694 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
@@ -32,6 +32,7 @@ import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
@@ -308,6 +309,25 @@ public class PaymentMethodResource extends JaxRsResourceBase {
context.createCallContextNoAccountId(createdBy, reason, comment, request), uriInfo, request);
}
+
+ @TimedResource
+ @PUT
+ @Path("/{paymentMethodId:" + UUID_PATTERN + "}/" + CUSTOM_FIELDS)
+ @Consumes(APPLICATION_JSON)
+ @Produces(APPLICATION_JSON)
+ @ApiOperation(value = "Modify custom fields to payment method")
+ @ApiResponses(value = {@ApiResponse(code = 400, message = "Invalid payment method id supplied")})
+ public Response modifyCustomFields(@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) throws CustomFieldApiException {
+ return super.modifyCustomFields(UUID.fromString(paymentMethodId), customFields,
+ context.createCallContextNoAccountId(createdBy, reason, comment, request));
+ }
+
+
@TimedResource
@DELETE
@Path("/{paymentMethodId:" + UUID_PATTERN + "}/" + CUSTOM_FIELDS)
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentResource.java
index bf63aaa..6ebcbd8 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentResource.java
@@ -812,6 +812,23 @@ public class PaymentResource extends ComboPaymentResource {
}
@TimedResource
+ @PUT
+ @Path("/{paymentId:" + UUID_PATTERN + "}/" + CUSTOM_FIELDS)
+ @Consumes(APPLICATION_JSON)
+ @Produces(APPLICATION_JSON)
+ @ApiOperation(value = "Modify custom fields to payment")
+ @ApiResponses(value = {@ApiResponse(code = 400, message = "Invalid payment id supplied")})
+ public Response modifyCustomFields(@PathParam(ID_PARAM_NAME) final String id,
+ 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) throws CustomFieldApiException {
+ return super.modifyCustomFields(UUID.fromString(id), customFields,
+ context.createCallContextNoAccountId(createdBy, reason, comment, request));
+ }
+
+ @TimedResource
@DELETE
@Path("/{paymentId:" + UUID_PATTERN + "}/" + CUSTOM_FIELDS)
@Consumes(APPLICATION_JSON)
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/SubscriptionResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/SubscriptionResource.java
index 7a9430c..ae71972 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/SubscriptionResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/SubscriptionResource.java
@@ -54,7 +54,6 @@ import org.killbill.billing.catalog.api.Currency;
import org.killbill.billing.catalog.api.PhaseType;
import org.killbill.billing.catalog.api.PlanPhasePriceOverride;
import org.killbill.billing.catalog.api.PlanPhaseSpecifier;
-import org.killbill.billing.catalog.api.PlanSpecifier;
import org.killbill.billing.catalog.api.ProductCategory;
import org.killbill.billing.entitlement.api.BaseEntitlementWithAddOnsSpecifier;
import org.killbill.billing.entitlement.api.BlockingStateType;
@@ -891,6 +890,22 @@ public class SubscriptionResource extends JaxRsResourceBase {
context.createCallContextNoAccountId(createdBy, reason, comment, request), uriInfo, request);
}
+ @PUT
+ @Path("/{subscriptionId:" + UUID_PATTERN + "}/" + CUSTOM_FIELDS)
+ @Consumes(APPLICATION_JSON)
+ @Produces(APPLICATION_JSON)
+ @ApiOperation(value = "Modify custom fields to subscription")
+ @ApiResponses(value = {@ApiResponse(code = 400, message = "Invalid subscription id supplied")})
+ public Response modifyCustomFields(@PathParam(ID_PARAM_NAME) final String id,
+ 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) throws CustomFieldApiException {
+ return super.modifyCustomFields(UUID.fromString(id), customFields,
+ context.createCallContextNoAccountId(createdBy, reason, comment, request));
+ }
+
@DELETE
@Path("/{subscriptionId:" + UUID_PATTERN + "}/" + CUSTOM_FIELDS)
@Consumes(APPLICATION_JSON)
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TransactionResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TransactionResource.java
index 963c6a6..414b01d 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TransactionResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TransactionResource.java
@@ -28,6 +28,7 @@ import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
@@ -174,6 +175,25 @@ public class TransactionResource extends JaxRsResourceBase {
context.createCallContextNoAccountId(createdBy, reason, comment, request), uriInfo, request);
}
+
+ @TimedResource
+ @PUT
+ @Path("/{transactionId:" + UUID_PATTERN + "}/" + CUSTOM_FIELDS)
+ @Consumes(APPLICATION_JSON)
+ @Produces(APPLICATION_JSON)
+ @ApiOperation(value = "Modify custom fields to payment transaction")
+ @ApiResponses(value = {@ApiResponse(code = 400, message = "Invalid transaction id supplied")})
+ public Response modifyCustomFields(@PathParam(ID_PARAM_NAME) final String id,
+ 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) throws CustomFieldApiException {
+ return super.modifyCustomFields(UUID.fromString(id), customFields,
+ context.createCallContextNoAccountId(createdBy, reason, comment, request));
+ }
+
+
@TimedResource
@DELETE
@Path("/{transactionId:" + UUID_PATTERN + "}/" + CUSTOM_FIELDS)
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCustomField.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCustomField.java
index 123bb59..c66ff3b 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCustomField.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCustomField.java
@@ -31,9 +31,40 @@ import org.killbill.billing.util.api.AuditLevel;
import org.testng.Assert;
import org.testng.annotations.Test;
+import com.google.common.collect.ImmutableList;
+
public class TestCustomField extends TestJaxrsBase {
- @Test(groups = "slow", description = "Can paginate through all custom fields")
+
+ @Test(groups = "slow", description = "Can create/modify/delete custom fields")
+ public void testBasicCustomFields() throws Exception {
+ final Account account = createAccount();
+ final CustomField customField = new CustomField();
+ customField.setName("MyName");
+ customField.setValue("InitialValue");
+ killBillClient.createAccountCustomField(account.getAccountId(), customField, requestOptions);
+
+ CustomFields allCustomFields = killBillClient.getCustomFields(requestOptions);
+ Assert.assertEquals(allCustomFields.size(), 1);
+ Assert.assertEquals(allCustomFields.get(0).getName(), "MyName");
+ Assert.assertEquals(allCustomFields.get(0).getValue(), "InitialValue");
+
+ final CustomField customFieldModified = new CustomField();
+ customFieldModified.setCustomFieldId(allCustomFields.get(0).getCustomFieldId());
+ customFieldModified.setValue("NewValue");
+ killBillClient.modifyAccountCustomFields(account.getAccountId(), ImmutableList.of(customFieldModified), requestOptions);
+
+ allCustomFields = killBillClient.getCustomFields(requestOptions);
+ Assert.assertEquals(allCustomFields.size(), 1);
+ Assert.assertEquals(allCustomFields.get(0).getName(), "MyName");
+ Assert.assertEquals(allCustomFields.get(0).getValue(), "NewValue");
+
+ killBillClient.deleteAccountCustomField(account.getAccountId(), allCustomFields.get(0).getCustomFieldId(), requestOptions);
+ allCustomFields = killBillClient.getCustomFields(requestOptions);
+ Assert.assertEquals(allCustomFields.size(), 0);
+ }
+
+ @Test(groups = "slow", description = "Can paginate through all custom fields")
public void testCustomFieldsPagination() throws Exception {
final Account account = createAccount();
for (int i = 0; i < 5; i++) {
diff --git a/util/src/main/java/org/killbill/billing/util/customfield/api/DefaultCustomFieldUserApi.java b/util/src/main/java/org/killbill/billing/util/customfield/api/DefaultCustomFieldUserApi.java
index c3d2f95..be16a38 100644
--- a/util/src/main/java/org/killbill/billing/util/customfield/api/DefaultCustomFieldUserApi.java
+++ b/util/src/main/java/org/killbill/billing/util/customfield/api/DefaultCustomFieldUserApi.java
@@ -100,6 +100,21 @@ public class DefaultCustomFieldUserApi implements CustomFieldUserApi {
}
@Override
+ public void updateCustomFields(final List<CustomField> customFields, final CallContext context) throws CustomFieldApiException {
+ if (!customFields.isEmpty()) {
+ final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(customFields.get(0).getObjectId(), customFields.get(0).getObjectType(), context);
+ final Iterable<CustomFieldModelDao> customFieldIds = Iterables.transform(customFields, new Function<CustomField, CustomFieldModelDao>() {
+ @Override
+ public CustomFieldModelDao apply(final CustomField input) {
+ return new CustomFieldModelDao(input.getId(), internalCallContext.getCreatedDate(), internalCallContext.getUpdatedDate(), input.getFieldName(), input.getFieldValue(), input.getObjectId(), input.getObjectType());
+ }
+ });
+ customFieldDao.updateCustomFields(customFieldIds, internalCallContext);
+
+ }
+ }
+
+ @Override
public void removeCustomFields(final List<CustomField> customFields, final CallContext context) throws CustomFieldApiException {
if (!customFields.isEmpty()) {
final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(customFields.get(0).getObjectId(), customFields.get(0).getObjectType(), context);
diff --git a/util/src/main/java/org/killbill/billing/util/customfield/dao/CustomFieldDao.java b/util/src/main/java/org/killbill/billing/util/customfield/dao/CustomFieldDao.java
index ca8f8b9..6dea17a 100644
--- a/util/src/main/java/org/killbill/billing/util/customfield/dao/CustomFieldDao.java
+++ b/util/src/main/java/org/killbill/billing/util/customfield/dao/CustomFieldDao.java
@@ -38,4 +38,6 @@ public interface CustomFieldDao extends EntityDao<CustomFieldModelDao, CustomFie
public List<CustomFieldModelDao> getCustomFieldsForAccount(final InternalTenantContext context);
void deleteCustomFields(Iterable<UUID> customFieldIds, InternalCallContext context) throws CustomFieldApiException;
+
+ void updateCustomFields(Iterable<CustomFieldModelDao> customFieldIds, InternalCallContext context) throws CustomFieldApiException;
}
diff --git a/util/src/main/java/org/killbill/billing/util/customfield/dao/CustomFieldSqlDao.java b/util/src/main/java/org/killbill/billing/util/customfield/dao/CustomFieldSqlDao.java
index f75fd4b..e3d88b2 100644
--- a/util/src/main/java/org/killbill/billing/util/customfield/dao/CustomFieldSqlDao.java
+++ b/util/src/main/java/org/killbill/billing/util/customfield/dao/CustomFieldSqlDao.java
@@ -19,11 +19,6 @@ package org.killbill.billing.util.customfield.dao;
import java.util.List;
import java.util.UUID;
-import org.skife.jdbi.v2.sqlobject.Bind;
-import org.killbill.commons.jdbi.binder.SmartBindBean;
-import org.skife.jdbi.v2.sqlobject.SqlQuery;
-import org.skife.jdbi.v2.sqlobject.SqlUpdate;
-
import org.killbill.billing.ObjectType;
import org.killbill.billing.callcontext.InternalCallContext;
import org.killbill.billing.callcontext.InternalTenantContext;
@@ -31,12 +26,23 @@ import org.killbill.billing.util.audit.ChangeType;
import org.killbill.billing.util.customfield.CustomField;
import org.killbill.billing.util.entity.dao.Audited;
import org.killbill.billing.util.entity.dao.EntitySqlDao;
+import org.killbill.commons.jdbi.binder.SmartBindBean;
import org.killbill.commons.jdbi.template.KillBillSqlDaoStringTemplate;
+import org.skife.jdbi.v2.sqlobject.Bind;
+import org.skife.jdbi.v2.sqlobject.SqlQuery;
+import org.skife.jdbi.v2.sqlobject.SqlUpdate;
@KillBillSqlDaoStringTemplate
public interface CustomFieldSqlDao extends EntitySqlDao<CustomFieldModelDao, CustomField> {
@SqlUpdate
+ @Audited(ChangeType.UPDATE)
+ void updateValue(@Bind("id") String customFieldId,
+ @Bind("fieldValue") String fieldValue,
+ @SmartBindBean InternalCallContext context);
+
+
+ @SqlUpdate
@Audited(ChangeType.DELETE)
void markTagAsDeleted(@Bind("id") String customFieldId,
@SmartBindBean InternalCallContext context);
diff --git a/util/src/main/java/org/killbill/billing/util/customfield/dao/DefaultCustomFieldDao.java b/util/src/main/java/org/killbill/billing/util/customfield/dao/DefaultCustomFieldDao.java
index c6bdff6..d89595a 100644
--- a/util/src/main/java/org/killbill/billing/util/customfield/dao/DefaultCustomFieldDao.java
+++ b/util/src/main/java/org/killbill/billing/util/customfield/dao/DefaultCustomFieldDao.java
@@ -124,6 +124,44 @@ public class DefaultCustomFieldDao extends EntityDaoBase<CustomFieldModelDao, Cu
}
@Override
+ public void updateCustomFields(final Iterable<CustomFieldModelDao> customFieldIds, final InternalCallContext context) throws CustomFieldApiException {
+
+ transactionalSqlDao.execute(CustomFieldApiException.class, new EntitySqlDaoTransactionWrapper<Void>() {
+
+ private void validateCustomField(final CustomFieldModelDao input, @Nullable CustomFieldModelDao existing) throws CustomFieldApiException {
+ if (existing == null) {
+ throw new CustomFieldApiException(ErrorCode.CUSTOM_FIELD_DOES_NOT_EXISTS_FOR_ID, input.getId());
+ }
+ if (input.getObjectId() != null & !input.getObjectId().equals(existing.getObjectId())) {
+ throw new CustomFieldApiException(ErrorCode.CUSTOM_FIELD_INVALID_UPDATE, input.getId(), input.getObjectId(), "ObjectId");
+ }
+ if (input.getObjectType() != null && input.getObjectType() != existing.getObjectType()) {
+ throw new CustomFieldApiException(ErrorCode.CUSTOM_FIELD_INVALID_UPDATE, input.getId(), input.getObjectType(), "ObjectType");
+ }
+ if (input.getFieldName() != null && !input.getFieldName().equals(existing.getFieldName())) {
+ throw new CustomFieldApiException(ErrorCode.CUSTOM_FIELD_INVALID_UPDATE, input.getId(), input.getFieldName(), "FieldName");
+ }
+ }
+
+ @Override
+ public Void inTransaction(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory) throws Exception {
+ final CustomFieldSqlDao sqlDao = entitySqlDaoWrapperFactory.become(CustomFieldSqlDao.class);
+
+ for (final CustomFieldModelDao cur : customFieldIds) {
+ final CustomFieldModelDao customField = sqlDao.getById(cur.getId().toString(), context);
+
+ validateCustomField(cur, customField);
+
+ sqlDao.updateValue(cur.getId().toString(), cur.getFieldValue(), context);
+ postBusEventFromTransaction(customField, customField, ChangeType.UPDATE, entitySqlDaoWrapperFactory, context);
+
+ }
+ return null;
+ }
+ });
+ }
+
+ @Override
protected CustomFieldApiException generateAlreadyExistsException(final CustomFieldModelDao entity, final InternalCallContext context) {
return new CustomFieldApiException(ErrorCode.CUSTOM_FIELD_ALREADY_EXISTS, entity.getId());
}
diff --git a/util/src/main/resources/org/killbill/billing/util/customfield/dao/CustomFieldSqlDao.sql.stg b/util/src/main/resources/org/killbill/billing/util/customfield/dao/CustomFieldSqlDao.sql.stg
index ca8defa..2df4d26 100644
--- a/util/src/main/resources/org/killbill/billing/util/customfield/dao/CustomFieldSqlDao.sql.stg
+++ b/util/src/main/resources/org/killbill/billing/util/customfield/dao/CustomFieldSqlDao.sql.stg
@@ -38,6 +38,14 @@ where <idField("")> = :id
;
>>
+updateValue() ::= <<
+update <tableName()>
+set field_value = :fieldValue
+where <idField("")> = :id
+<AND_CHECK_TENANT("")>
+;
+>>
+
getCustomFieldsForObject() ::= <<
select
diff --git a/util/src/test/java/org/killbill/billing/util/customfield/api/TestDefaultCustomFieldUserApi.java b/util/src/test/java/org/killbill/billing/util/customfield/api/TestDefaultCustomFieldUserApi.java
index 4798957..5037685 100644
--- a/util/src/test/java/org/killbill/billing/util/customfield/api/TestDefaultCustomFieldUserApi.java
+++ b/util/src/test/java/org/killbill/billing/util/customfield/api/TestDefaultCustomFieldUserApi.java
@@ -108,6 +108,42 @@ public class TestDefaultCustomFieldUserApi extends UtilTestSuiteWithEmbeddedDB {
}
+ @Test(groups = "slow")
+ public void testCustomFieldUpdate() throws Exception {
+
+ final CustomField customField1 = new StringCustomField("gtqre", "value1", ObjectType.ACCOUNT, accountId, callContext.getCreatedDate());
+ eventsListener.pushExpectedEvents(NextEvent.CUSTOM_FIELD);
+ customFieldUserApi.addCustomFields(ImmutableList.<CustomField>of(customField1), callContext);
+ assertListenerStatus();
+
+ final CustomField update1 = new StringCustomField(customField1.getId(), customField1.getFieldName(), "value2", customField1.getObjectType(), customField1.getObjectId(), callContext.getCreatedDate());
+ customFieldUserApi.updateCustomFields(ImmutableList.of(update1), callContext);
+
+ List<CustomField> all = customFieldUserApi.getCustomFieldsForAccount(accountId, callContext);
+ Assert.assertEquals(all.size(), 1);
+ Assert.assertEquals(all.get(0).getId(), update1.getId());
+ Assert.assertEquals(all.get(0).getObjectType(), update1.getObjectType());
+ Assert.assertEquals(all.get(0).getObjectId(), update1.getObjectId());
+ Assert.assertEquals(all.get(0).getFieldName(), update1.getFieldName());
+ Assert.assertEquals(all.get(0).getFieldValue(), "value2");
+
+ try {
+ customFieldUserApi.updateCustomFields(ImmutableList.<CustomField>of(new StringCustomField("gtqre", "value1", ObjectType.ACCOUNT, accountId, callContext.getCreatedDate())), callContext);
+ Assert.fail("Updating custom field should fail");
+ } catch (final CustomFieldApiException e) {
+ Assert.assertEquals(e.getCode(), ErrorCode.CUSTOM_FIELD_DOES_NOT_EXISTS_FOR_ID.getCode());
+ }
+
+ try {
+ customFieldUserApi.updateCustomFields(ImmutableList.<CustomField>of(new StringCustomField(customField1.getId(), "wrongName", "value2", customField1.getObjectType(), customField1.getObjectId(), callContext.getCreatedDate())), callContext);
+ Assert.fail("Updating custom field should fail");
+ } catch (final CustomFieldApiException e) {
+ Assert.assertEquals(e.getCode(), ErrorCode.CUSTOM_FIELD_INVALID_UPDATE.getCode());
+ }
+
+ }
+
+
@Test(groups = "slow")
public void testSaveCustomFieldWithAccountRecordId() throws Exception {
diff --git a/util/src/test/java/org/killbill/billing/util/customfield/dao/MockCustomFieldDao.java b/util/src/test/java/org/killbill/billing/util/customfield/dao/MockCustomFieldDao.java
index b9b1720..ae80cd4 100644
--- a/util/src/test/java/org/killbill/billing/util/customfield/dao/MockCustomFieldDao.java
+++ b/util/src/test/java/org/killbill/billing/util/customfield/dao/MockCustomFieldDao.java
@@ -58,6 +58,11 @@ public class MockCustomFieldDao extends MockEntityDaoBase<CustomFieldModelDao, C
}
@Override
+ public void updateCustomFields(final Iterable<CustomFieldModelDao> customFieldIds, final InternalCallContext context) throws CustomFieldApiException {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public Pagination<CustomFieldModelDao> searchCustomFields(final String searchKey, final Long offset, final Long limit, final InternalTenantContext context) {
throw new UnsupportedOperationException();
}