killbill-memoizeit

jaxrs: Add new endpoint to block/unblock a bundle The test

10/31/2015 10:42:32 PM

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();