killbill-memoizeit

jaxrs: add endpoint to turn on and off email notifications Add

6/14/2012 3:31:08 PM

Details

diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceEmailJson.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceEmailJson.java
new file mode 100644
index 0000000..4bffaa6
--- /dev/null
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/InvoiceEmailJson.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning 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 com.ning.billing.jaxrs.json;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonGetter;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class InvoiceEmailJson {
+    private final String accountId;
+    private final boolean isNotifiedForInvoices;
+
+    @JsonCreator
+    public InvoiceEmailJson(@JsonProperty("accountId") final String accountId,
+                            @JsonProperty("isNotifiedForInvoices") final boolean isNotifiedForInvoices) {
+        this.accountId = accountId;
+        this.isNotifiedForInvoices = isNotifiedForInvoices;
+    }
+
+    public String getAccountId() {
+        return accountId;
+    }
+
+    @JsonGetter("isNotifiedForInvoices")
+    public boolean isNotifiedForInvoices() {
+        return isNotifiedForInvoices;
+    }
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder();
+        sb.append("InvoiceEmailJson");
+        sb.append("{accountId='").append(accountId).append('\'');
+        sb.append(", isNotifiedForInvoices=").append(isNotifiedForInvoices);
+        sb.append('}');
+        return sb.toString();
+    }
+
+    @Override
+    public boolean equals(final Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        final InvoiceEmailJson that = (InvoiceEmailJson) o;
+
+        if (isNotifiedForInvoices != that.isNotifiedForInvoices) {
+            return false;
+        }
+        if (accountId != null ? !accountId.equals(that.accountId) : that.accountId != null) {
+            return false;
+        }
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = accountId != null ? accountId.hashCode() : 0;
+        result = 31 * result + (isNotifiedForInvoices ? 1 : 0);
+        return result;
+    }
+}
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/AccountResource.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/AccountResource.java
index 445d46d..1b3f9ce 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/AccountResource.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/AccountResource.java
@@ -49,6 +49,7 @@ import com.ning.billing.account.api.AccountApiException;
 import com.ning.billing.account.api.AccountData;
 import com.ning.billing.account.api.AccountEmail;
 import com.ning.billing.account.api.AccountUserApi;
+import com.ning.billing.account.api.MutableAccountData;
 import com.ning.billing.entitlement.api.timeline.BundleTimeline;
 import com.ning.billing.entitlement.api.timeline.EntitlementRepairException;
 import com.ning.billing.entitlement.api.timeline.EntitlementTimelineApi;
@@ -61,6 +62,7 @@ import com.ning.billing.jaxrs.json.AccountJson;
 import com.ning.billing.jaxrs.json.AccountTimelineJson;
 import com.ning.billing.jaxrs.json.BundleJsonNoSubscriptions;
 import com.ning.billing.jaxrs.json.CustomFieldJson;
+import com.ning.billing.jaxrs.json.InvoiceEmailJson;
 import com.ning.billing.jaxrs.json.PaymentJsonSimple;
 import com.ning.billing.jaxrs.json.PaymentMethodJson;
 import com.ning.billing.jaxrs.util.Context;
@@ -261,7 +263,48 @@ public class AccountResource extends JaxRsResourceBase {
     }
 
     /*
-     * **************************  PAYMENTS ********************************
+     * ************************** EMAIL NOTIFICATIONS FOR INVOICES ********************************
+     */
+
+    @GET
+    @Path("/{accountId:" + UUID_PATTERN + "}/" + EMAIL_NOTIFICATIONS)
+    @Produces(APPLICATION_JSON)
+    public Response getEmailNotificationsForAccount(@PathParam("accountId") final String accountId) {
+        try {
+            final Account account = accountApi.getAccountById(UUID.fromString(accountId));
+            final InvoiceEmailJson invoiceEmailJson = new InvoiceEmailJson(accountId, account.isNotifiedForInvoices());
+
+            return Response.status(Status.OK).entity(invoiceEmailJson).build();
+        } catch (AccountApiException e) {
+            return Response.status(Status.NOT_FOUND).build();
+        }
+    }
+
+    @PUT
+    @Path("/{accountId:" + UUID_PATTERN + "}/" + EMAIL_NOTIFICATIONS)
+    @Consumes(APPLICATION_JSON)
+    @Produces(APPLICATION_JSON)
+    public Response getEmailNotificationsForAccount(final InvoiceEmailJson json,
+                                                    @PathParam("accountId") final String accountIdString,
+                                                    @HeaderParam(HDR_CREATED_BY) final String createdBy,
+                                                    @HeaderParam(HDR_REASON) final String reason,
+                                                    @HeaderParam(HDR_COMMENT) final String comment) {
+        try {
+            final UUID accountId = UUID.fromString(accountIdString);
+            final Account account = accountApi.getAccountById(accountId);
+
+            final MutableAccountData mutableAccountData = account.toMutableAccountData();
+            mutableAccountData.setIsNotifiedForInvoices(json.isNotifiedForInvoices());
+            accountApi.updateAccount(accountId, mutableAccountData, context.createContext(createdBy, reason, comment));
+
+            return Response.status(Status.OK).build();
+        } catch (AccountApiException e) {
+            return Response.status(Status.NOT_FOUND).build();
+        }
+    }
+
+    /*
+     * ************************** PAYMENTS ********************************
      */
 
     @GET
@@ -397,7 +440,7 @@ public class AccountResource extends JaxRsResourceBase {
     }
 
     /*
-     * *************************      TAGS     *****************************
+     * *************************     TAGS     *****************************
      */
 
     @GET
@@ -435,7 +478,7 @@ public class AccountResource extends JaxRsResourceBase {
     }
 
     /*
-     * *************************      EMAILS     *****************************
+     * *************************     EMAILS     *****************************
      */
 
     @GET
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/JaxrsResource.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/JaxrsResource.java
index 023f47a..16c6bc5 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/JaxrsResource.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/JaxrsResource.java
@@ -83,7 +83,6 @@ public interface JaxrsResource {
     public static final String PAYMENT_METHODS_PATH = PREFIX + "/" + PAYMENT_METHODS;
     public static final String PAYMENT_METHODS_DEFAULT_PATH_POSTFIX = "setDefault";
 
-
     public static final String CREDITS = "credits";
     public static final String CREDITS_PATH = PREFIX + "/" + CREDITS;
 
@@ -93,6 +92,7 @@ public interface JaxrsResource {
     public static final String TAGS = "tags";
     public static final String CUSTOM_FIELDS = "customFields";
     public static final String EMAILS = "emails";
+    public static final String EMAIL_NOTIFICATIONS = "emailNotifications";
 
     public static final String CATALOG = "catalog";
     public static final String CATALOG_PATH = PREFIX + "/" + CATALOG;
diff --git a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceEmailJson.java b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceEmailJson.java
new file mode 100644
index 0000000..c859596
--- /dev/null
+++ b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestInvoiceEmailJson.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning 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 com.ning.billing.jaxrs.json;
+
+import java.util.UUID;
+
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class TestInvoiceEmailJson {
+    private static final ObjectMapper mapper = new ObjectMapper();
+
+    @Test(groups = "fast")
+    public void testJson() throws Exception {
+        final String accountId = UUID.randomUUID().toString();
+        final boolean isNotifiedForInvoices = true;
+
+        final InvoiceEmailJson invoiceEmailJson = new InvoiceEmailJson(accountId, isNotifiedForInvoices);
+        Assert.assertEquals(invoiceEmailJson.getAccountId(), accountId);
+        Assert.assertEquals(invoiceEmailJson.isNotifiedForInvoices(), isNotifiedForInvoices);
+
+        final String asJson = mapper.writeValueAsString(invoiceEmailJson);
+        Assert.assertEquals(asJson, "{\"accountId\":\"" + accountId + "\"," +
+                "\"isNotifiedForInvoices\":" + isNotifiedForInvoices + "}");
+
+        final InvoiceEmailJson fromJson = mapper.readValue(asJson, InvoiceEmailJson.class);
+        Assert.assertEquals(fromJson, invoiceEmailJson);
+    }
+}
diff --git a/server/src/test/java/com/ning/billing/jaxrs/TestAccountEmailNotifications.java b/server/src/test/java/com/ning/billing/jaxrs/TestAccountEmailNotifications.java
new file mode 100644
index 0000000..9982032
--- /dev/null
+++ b/server/src/test/java/com/ning/billing/jaxrs/TestAccountEmailNotifications.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning 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 com.ning.billing.jaxrs;
+
+import java.util.UUID;
+
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.ning.billing.jaxrs.json.AccountJson;
+import com.ning.billing.jaxrs.json.InvoiceEmailJson;
+import com.ning.billing.jaxrs.resources.JaxrsResource;
+import com.ning.http.client.Response;
+
+import static org.testng.Assert.assertEquals;
+
+public class TestAccountEmailNotifications extends TestJaxrsBase {
+    @Test(groups = "slow")
+    public void testSetAndUnsetEmailNotifications() throws Exception {
+        final AccountJson input = createAccount(UUID.randomUUID().toString(), UUID.randomUUID().toString(), UUID.randomUUID().toString());
+        final String accountId = input.getAccountId();
+
+        final InvoiceEmailJson invoiceEmailJsonWithNotifications = new InvoiceEmailJson(accountId, true);
+        final InvoiceEmailJson invoiceEmailJsonWithoutNotifications = new InvoiceEmailJson(accountId, false);
+        final String baseUri = JaxrsResource.ACCOUNTS_PATH + "/" + accountId + "/" + JaxrsResource.EMAIL_NOTIFICATIONS;
+
+        // Verify the initial state
+        final Response firstResponse = doGet(baseUri, DEFAULT_EMPTY_QUERY, DEFAULT_HTTP_TIMEOUT_SEC);
+        Assert.assertEquals(firstResponse.getStatusCode(), javax.ws.rs.core.Response.Status.OK.getStatusCode());
+        final InvoiceEmailJson firstInvoiceEmailJson = mapper.readValue(firstResponse.getResponseBody(), new TypeReference<InvoiceEmailJson>() {});
+        Assert.assertEquals(firstInvoiceEmailJson.getAccountId(), accountId);
+        Assert.assertFalse(firstInvoiceEmailJson.isNotifiedForInvoices());
+
+        // Enable email notifications
+        final String firstEmailString = mapper.writeValueAsString(invoiceEmailJsonWithNotifications);
+        final Response secondResponse = doPut(baseUri, firstEmailString, DEFAULT_EMPTY_QUERY, DEFAULT_HTTP_TIMEOUT_SEC);
+        assertEquals(secondResponse.getStatusCode(), javax.ws.rs.core.Response.Status.OK.getStatusCode());
+
+        // Verify we can retrieve it
+        final Response thirdResponse = doGet(baseUri, DEFAULT_EMPTY_QUERY, DEFAULT_HTTP_TIMEOUT_SEC);
+        Assert.assertEquals(thirdResponse.getStatusCode(), javax.ws.rs.core.Response.Status.OK.getStatusCode());
+        final InvoiceEmailJson secondInvoiceEmailJson = mapper.readValue(thirdResponse.getResponseBody(), new TypeReference<InvoiceEmailJson>() {});
+        Assert.assertEquals(secondInvoiceEmailJson.getAccountId(), accountId);
+        Assert.assertTrue(secondInvoiceEmailJson.isNotifiedForInvoices());
+
+        // Disable email notifications
+        final String secondEmailString = mapper.writeValueAsString(invoiceEmailJsonWithoutNotifications);
+        final Response fourthResponse = doPut(baseUri, secondEmailString, DEFAULT_EMPTY_QUERY, DEFAULT_HTTP_TIMEOUT_SEC);
+        assertEquals(fourthResponse.getStatusCode(), javax.ws.rs.core.Response.Status.OK.getStatusCode());
+
+        // Verify we can retrieve it
+        final Response fifthResponse = doGet(baseUri, DEFAULT_EMPTY_QUERY, DEFAULT_HTTP_TIMEOUT_SEC);
+        Assert.assertEquals(fifthResponse.getStatusCode(), javax.ws.rs.core.Response.Status.OK.getStatusCode());
+        final InvoiceEmailJson thirdInvoiceEmailJson = mapper.readValue(fifthResponse.getResponseBody(), new TypeReference<InvoiceEmailJson>() {});
+        Assert.assertEquals(thirdInvoiceEmailJson.getAccountId(), accountId);
+        Assert.assertFalse(thirdInvoiceEmailJson.isNotifiedForInvoices());
+    }
+}