Details
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/BlockingStateJson.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/BlockingStateJson.java
new file mode 100644
index 0000000..3d4cd25
--- /dev/null
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/BlockingStateJson.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright 2014-2015 Groupon, Inc
+ * Copyright 2014-2015 The Billing Project, LLC
+ *
+ * The Billing Project licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.killbill.billing.jaxrs.json;
+
+import java.util.List;
+import java.util.UUID;
+
+import javax.annotation.Nullable;
+
+import org.joda.time.LocalDate;
+import org.killbill.billing.entitlement.api.BlockingStateType;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.wordnik.swagger.annotations.ApiModelProperty;
+
+public class BlockingStateJson extends JsonBase {
+
+ @ApiModelProperty(dataType = "java.util.UUID")
+ private final String blockedId;
+ private final String stateName;
+ private final String service;
+ private final Boolean blockChange;
+ private final Boolean blockEntitlement;
+ private final Boolean blockBilling;
+ private final LocalDate effectiveDate;
+ private final BlockingStateType type;
+
+ @JsonCreator
+ public BlockingStateJson(@JsonProperty("blockedId") final String blockedId,
+ @JsonProperty("stateName") final String stateName,
+ @JsonProperty("service") final String service,
+ @JsonProperty("blockChange") final Boolean blockChange,
+ @JsonProperty("blockEntitlement") final Boolean blockEntitlement,
+ @JsonProperty("blockBilling") final Boolean blockBilling,
+ @JsonProperty("effectiveDate") final LocalDate effectiveDate,
+ @JsonProperty("type") final BlockingStateType type,
+ @JsonProperty("auditLogs") @Nullable final List<AuditLogJson> auditLogs) {
+ super(auditLogs);
+ this.blockedId = blockedId;
+ this.stateName = stateName;
+ this.service = service;
+ this.blockChange = blockChange;
+ this.blockEntitlement = blockEntitlement;
+ this.blockBilling = blockBilling;
+ this.effectiveDate = effectiveDate;
+ this.type = type;
+ }
+
+ public String getBlockedId() {
+ return blockedId;
+ }
+
+ public String getStateName() {
+ return stateName;
+ }
+
+ public String getService() {
+ return service;
+ }
+
+ public Boolean isBlockChange() {
+ return blockChange;
+ }
+
+ public Boolean isBlockEntitlement() {
+ return blockEntitlement;
+ }
+
+ public Boolean isBlockBilling() {
+ return blockBilling;
+ }
+
+ public LocalDate getEffectiveDate() {
+ return effectiveDate;
+ }
+
+ public BlockingStateType getType() {
+ return type;
+ }
+
+ @Override
+ public boolean equals(final Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof BlockingStateJson)) {
+ return false;
+ }
+
+ final BlockingStateJson that = (BlockingStateJson) o;
+
+ if (blockChange != that.blockChange) {
+ return false;
+ }
+ if (blockEntitlement != that.blockEntitlement) {
+ return false;
+ }
+ if (blockBilling != that.blockBilling) {
+ return false;
+ }
+ if (blockedId != null ? !blockedId.equals(that.blockedId) : that.blockedId != null) {
+ return false;
+ }
+ if (stateName != null ? !stateName.equals(that.stateName) : that.stateName != null) {
+ return false;
+ }
+ if (service != null ? !service.equals(that.service) : that.service != null) {
+ return false;
+ }
+ if (effectiveDate != null ? effectiveDate.compareTo(that.effectiveDate) != 0 : that.effectiveDate != null) {
+ return false;
+ }
+ return type == that.type;
+
+ }
+
+ @Override
+ public int hashCode() {
+ int result = blockedId != null ? blockedId.hashCode() : 0;
+ result = 31 * result + (stateName != null ? stateName.hashCode() : 0);
+ result = 31 * result + (service != null ? service.hashCode() : 0);
+ result = 31 * result + (blockChange ? 1 : 0);
+ result = 31 * result + (blockEntitlement ? 1 : 0);
+ result = 31 * result + (blockBilling ? 1 : 0);
+ result = 31 * result + (effectiveDate != null ? effectiveDate.hashCode() : 0);
+ result = 31 * result + (type != null ? type.hashCode() : 0);
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return "BlockingStateJson{" +
+ "blockedId='" + blockedId + '\'' +
+ ", stateName='" + stateName + '\'' +
+ ", service='" + service + '\'' +
+ ", blockChange=" + blockChange +
+ ", blockEntitlement=" + blockEntitlement +
+ ", blockBilling=" + blockBilling +
+ ", effectiveDate=" + effectiveDate +
+ ", type=" + type +
+ '}';
+ }
+}
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 96c4678..e4adb95 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
@@ -49,6 +49,7 @@ import org.killbill.billing.entitlement.api.EntitlementApiException;
import org.killbill.billing.entitlement.api.SubscriptionApi;
import org.killbill.billing.entitlement.api.SubscriptionApiException;
import org.killbill.billing.entitlement.api.SubscriptionBundle;
+import org.killbill.billing.jaxrs.json.BlockingStateJson;
import org.killbill.billing.jaxrs.json.BundleJson;
import org.killbill.billing.jaxrs.json.CustomFieldJson;
import org.killbill.billing.jaxrs.json.TagJson;
@@ -240,6 +241,41 @@ public class BundleResource extends JaxRsResourceBase {
}
@Timed
+ @PUT
+ @Path("/{bundleId:" + UUID_PATTERN + "}/" + BLOCK)
+ @Consumes(APPLICATION_JSON)
+ @ApiOperation(value = "Block a bundle")
+ @ApiResponses(value = {@ApiResponse(code = 400, message = "Invalid bundle id supplied"),
+ @ApiResponse(code = 404, message = "Bundle not found")})
+ public Response addBundleBlockingState(final BlockingStateJson json,
+ @PathParam(ID_PARAM_NAME) final String id,
+ @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 HttpServletRequest request) throws SubscriptionApiException, EntitlementApiException, AccountApiException {
+
+ final Iterable<PluginProperty> pluginProperties = extractPluginProperties(pluginPropertiesString);
+ final CallContext callContext = context.createContext(createdBy, reason, comment, request);
+ final UUID bundleId = UUID.fromString(id);
+
+ final boolean isBlockBilling = (json.isBlockBilling() != null && json.isBlockBilling());
+ final boolean isBlockEntitlement = (json.isBlockEntitlement() != null && json.isBlockEntitlement());
+ final boolean isBlockChange = (json.isBlockChange() != null && json.isBlockChange());
+
+ final boolean isBlockOperation = isBlockBilling || isBlockEntitlement || isBlockChange;
+
+ if (isBlockOperation) {
+ entitlementApi.block(bundleId, json.getStateName(), json.getService(), json.getEffectiveDate(), isBlockBilling, isBlockEntitlement, isBlockChange, pluginProperties, callContext);
+ } else {
+ entitlementApi.unblock(bundleId, json.getStateName(), json.getService(), json.getEffectiveDate(), pluginProperties, callContext);
+ }
+ return Response.status(Status.OK).build();
+ }
+
+
+
+ @Timed
@GET
@Path("/{bundleId:" + UUID_PATTERN + "}/" + CUSTOM_FIELDS)
@Produces(APPLICATION_JSON)
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxrsResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxrsResource.java
index abfe3c7..518b402 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxrsResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxrsResource.java
@@ -216,6 +216,7 @@ public interface JaxrsResource {
public static final String PAUSE = "pause";
public static final String RESUME = "resume";
+ public static final String BLOCK = "block";
public static final String AUTHORIZATION = "authorization";
public static final String CAPTURE = "capture";
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestBundle.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestBundle.java
index 6a36f3c..dcc2f9a 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestBundle.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestBundle.java
@@ -22,13 +22,17 @@ import java.util.List;
import java.util.UUID;
import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
import org.killbill.billing.catalog.api.BillingPeriod;
import org.killbill.billing.catalog.api.ProductCategory;
import org.killbill.billing.client.KillBillClientException;
import org.killbill.billing.client.model.Account;
+import org.killbill.billing.client.model.BlockingState;
import org.killbill.billing.client.model.Bundle;
import org.killbill.billing.client.model.Bundles;
import org.killbill.billing.client.model.Subscription;
+import org.killbill.billing.entitlement.api.BlockingStateType;
+import org.killbill.billing.entitlement.api.Entitlement.EntitlementState;
import org.testng.Assert;
import org.testng.annotations.Test;
@@ -116,6 +120,42 @@ public class TestBundle extends TestJaxrsBase {
assertEquals(newBundle.getAccountId(), newAccount.getAccountId());
}
+
+ @Test(groups = "slow", description = "Block a bundle")
+ public void testBlockBundle() throws Exception {
+ final DateTime initialDate = new DateTime(2012, 4, 25, 0, 3, 42, 0);
+ clock.setDeltaFromReality(initialDate.getMillis() - clock.getUTCNow().getMillis());
+
+ final Account accountJson = createAccountWithDefaultPaymentMethod();
+
+ final String productName = "Shotgun";
+ final BillingPeriod term = BillingPeriod.MONTHLY;
+ final String bundleExternalKey = "93199";
+
+ final Subscription entitlement = createEntitlement(accountJson.getAccountId(), bundleExternalKey, productName,
+ ProductCategory.BASE, term, true);
+
+ final Bundle bundle = killBillClient.getBundle(bundleExternalKey);
+ assertEquals(bundle.getAccountId(), accountJson.getAccountId());
+ assertEquals(bundle.getExternalKey(), bundleExternalKey);
+
+ final BlockingState blockingState = new BlockingState(bundle.getBundleId(), "state", "service", false, true, true, clock.getToday(DateTimeZone.forID(accountJson.getTimeZone())), BlockingStateType.SUBSCRIPTION_BUNDLE, null);
+ killBillClient.blockBundle(bundle.getBundleId(), blockingState, createdBy, reason, comment);
+
+ final Subscription subscription = killBillClient.getSubscription(entitlement.getSubscriptionId());
+ assertEquals(subscription.getState(), EntitlementState.BLOCKED);
+
+ clock.addDays(1);
+
+ final BlockingState unblockingState = new BlockingState(bundle.getBundleId(), "state", "service", false, false, false, clock.getToday(DateTimeZone.forID(accountJson.getTimeZone())), BlockingStateType.SUBSCRIPTION_BUNDLE, null);
+ killBillClient.blockBundle(bundle.getBundleId(), unblockingState, createdBy, reason, comment);
+
+ final Subscription subscription2 = killBillClient.getSubscription(entitlement.getSubscriptionId());
+ assertEquals(subscription2.getState(), EntitlementState.ACTIVE);
+ }
+
+
+
@Test(groups = "slow", description = "Can paginate and search through all bundles")
public void testBundlesPagination() throws Exception {
final Account accountJson = createAccount();