diff --git a/README.md b/README.md index c3d2123..48893f9 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,13 @@ MailerLite Java SDK - [Create a webhook](#update-a-webhook) - [Update a webhook](#update-a-webhook) - [Delete a webhook](#delete-a-webhook) + - [E-commerce](#e-commerce) + - [Shops](#shops) + - [Products and variants](#products-and-variants) + - [Categories](#categories) + - [Customers, orders and carts](#customers-orders-and-carts) + - [Imports](#imports) + - [Revenue reports and settings](#revenue-reports-and-settings) # Installation @@ -1235,6 +1242,107 @@ class Example { } ``` +## E-commerce + +Shop-level resources hang off `ecommerce()`, and everything inside a shop takes the shop ID first. Each resource follows the same pattern as the rest of the SDK: `retriever()` for reads, `builder()` for creates and updates, and `delete()`. Every call throws `MailerLiteException`. + +```java +MailerLite ml = new MailerLite(); +ml.setToken("Your API Token"); +Ecommerce ecommerce = ml.ecommerce(); +``` + +### Shops + +```java +ShopsList shops = ecommerce.shops().retriever().limit(25).get(); +SingleShop shop = ecommerce.shops().retriever().getSingle("shopId"); +ecommerce.shops().builder().name("My shop").url("https://shop.example.com").currency("EUR").create(); +ecommerce.shops().builder().name("New name").update("shopId"); +ecommerce.shops().delete("shopId"); +``` + +### Products and variants + +```java +ProductsList products = ecommerce.products("shopId").retriever().enabledFilter(true).sort("-created_at").get(); +SingleProduct product = ecommerce.products("shopId").retriever().getSingle("productId"); +ecommerce.products("shopId").builder().name("Red T-shirt").price(19.99).categoryId("categoryId").create(); +ecommerce.products("shopId").builder().price(24.99).update("productId"); +ecommerce.products("shopId").delete("productId"); +ecommerce.products("shopId").changeStatus("productId", false); +ecommerce.products("shopId").assignCategories("productId", new String[] {"categoryId"}, true); + +ProductVariantsList variants = ecommerce.products("shopId").variants("productId").retriever().get(); +ecommerce.products("shopId").variants("productId").builder().name("Extra large").attribute("size", "XL").update("variantId"); +ecommerce.products("shopId").variants("productId").delete("variantId"); +``` + +### Categories + +```java +CategoriesList categories = ecommerce.categories("shopId").retriever().get(); +ecommerce.categories("shopId").builder().name("Hats").create(); +ecommerce.categories("shopId").builder().name("Caps").update("categoryId"); +ecommerce.categories("shopId").delete("categoryId"); +ecommerce.categories("shopId").retriever().getProducts("categoryId"); +ecommerce.categories("shopId").assignProduct("categoryId", "productId"); +ecommerce.categories("shopId").unassignProduct("categoryId", "productId"); +``` + +### Customers, orders and carts + +```java +CustomersList customers = ecommerce.customers("shopId").retriever().emailFilter("customer@example.com").get(); +ecommerce.customers("shopId").builder().email("customer@example.com").createSubscriber(true).create(); +ecommerce.customers("shopId").builder().name("Jane").update("customerId"); +ecommerce.customers("shopId").delete("customerId"); + +OrdersList orders = ecommerce.orders("shopId").retriever().attributedFilter(true).emailIdFilter("emailId").get(); + +CustomerBuilderBody customer = new CustomerBuilderBody(); +customer.email = "customer@example.com"; +CartItemBuilderBody item = new CartItemBuilderBody(); +item.productId = "productId"; +item.quantity = 1; +ecommerce.orders("shopId").builder().customer(customer).item(item).status("complete").create(); +ecommerce.orders("shopId").builder().status("complete").update("orderId"); +ecommerce.orders("shopId").delete("orderId"); + +CartsList carts = ecommerce.carts("shopId").retriever().get(); +ecommerce.carts("shopId").builder().checkoutUrl("https://shop.example.com/cart").update("cartId"); +ecommerce.carts("shopId").items("cartId").retriever().get(); +ecommerce.carts("shopId").items("cartId").builder().quantity(2).update("itemId"); +ecommerce.carts("shopId").items("cartId").delete("itemId"); +``` + +### Imports + +```java +ProductBuilderBody product = new ProductBuilderBody(); +product.name = "Red T-shirt"; +ecommerce.imports("shopId").products(List.of(product)); +``` + +`categories()`, `customers()` and `orders()` work the same way with their builder bodies. + +### Revenue reports and settings + +```java +SingleEcommerceReport shopStats = ecommerce.shops().ecommerceReport("shopId").startDate("2026-10-01").endDate("2026-10-31").stats(); + +SingleEcommerceReport campaignStats = ml.campaigns().ecommerceReport("campaignId").shopId("shopId").stats(); +OrderActivityList campaignOrders = ml.campaigns().ecommerceReport("campaignId").shopId("shopId").orders(); + +SingleEcommerceReport subscriberStats = ml.subscribers().ecommerceReport("subscriberId").shopId("shopId").stats(); + +SingleAutomationEcommerceStats automationStats = ml.automations().reports("automationId").monthlyEcommerceTotals(); +OrderActivityList automationOrders = ml.automations().reports("automationId").orderActivity().timeFrame("all_time").get(); +SingleAutomationEcommerceStats emailStats = ml.automations().emails("automationId").ecommerceOverviewStats("emailId"); + +SingleEcommerceSettings settings = ecommerce.getSettings(); +``` + # Testing Change the properties in the `TestHelper` class of the `com.mailerlite.tests` package to correspond to your account details, then simply run diff --git a/src/main/java/com/mailerlite/sdk/MailerLite.java b/src/main/java/com/mailerlite/sdk/MailerLite.java index 0d98a94..a3e0d02 100644 --- a/src/main/java/com/mailerlite/sdk/MailerLite.java +++ b/src/main/java/com/mailerlite/sdk/MailerLite.java @@ -11,6 +11,7 @@ import com.mailerlite.sdk.campaigns.Campaigns; import com.mailerlite.sdk.fields.Fields; import com.mailerlite.sdk.forms.Forms; +import com.mailerlite.sdk.ecommerce.Ecommerce; import com.mailerlite.sdk.groups.Groups; import com.mailerlite.sdk.segments.Segments; import com.mailerlite.sdk.susbcribers.Subscribers; @@ -49,6 +50,8 @@ public class MailerLite /** The forms. */ protected Forms forms; + protected Ecommerce ecommerce; + /** * Campaigns. * @@ -173,6 +176,16 @@ public Forms forms() } + public Ecommerce ecommerce() + { + if (ecommerce == null) { + ecommerce = new Ecommerce(this); + } + + return ecommerce; + } + + /** * Sets the MailerLite API token. * diff --git a/src/main/java/com/mailerlite/sdk/campaigns/Campaigns.java b/src/main/java/com/mailerlite/sdk/campaigns/Campaigns.java index f022049..506165d 100644 --- a/src/main/java/com/mailerlite/sdk/campaigns/Campaigns.java +++ b/src/main/java/com/mailerlite/sdk/campaigns/Campaigns.java @@ -10,6 +10,7 @@ import com.mailerlite.sdk.MailerLite; import com.mailerlite.sdk.MailerLiteApi; import com.mailerlite.sdk.MailerLiteResponse; +import com.mailerlite.sdk.ecommerce.EcommerceReportRetriever; import com.mailerlite.sdk.exceptions.MailerLiteException; /** @@ -88,4 +89,15 @@ public MailerLiteResponse delete(String campaignId) throws MailerLiteException return response; } + /** + * E-commerce revenue report of a campaign. + * + * @param campaignId the campaign id + * @return the ecommerce report retriever + */ + public EcommerceReportRetriever ecommerceReport(String campaignId) + { + String endpoint = "/campaigns/".concat(campaignId); + return new EcommerceReportRetriever(apiObjectReference, endpoint.concat("/reports/ecommerce"), endpoint.concat("/reports/ecommerce/orders")); + } } diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/CartBuilder.java b/src/main/java/com/mailerlite/sdk/ecommerce/CartBuilder.java new file mode 100644 index 0000000..abd2212 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/CartBuilder.java @@ -0,0 +1,63 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.mailerlite.sdk.MailerLite; +import com.mailerlite.sdk.exceptions.MailerLiteException; + +/** + * The Class CartBuilder. + */ +public class CartBuilder { + + private MailerLite apiObjectReference; + + private String shopId; + + private CartBuilderBody builderBody = new CartBuilderBody(); + + public CartBuilder(MailerLite apiRef, String shopId) + { + apiObjectReference = apiRef; + this.shopId = shopId; + } + + public CartBuilderBody body() + { + return builderBody; + } + + public CartBuilder checkoutUrl(String checkoutUrl) + { + builderBody.checkoutUrl = checkoutUrl; + return this; + } + + public CartBuilder cartTotal(Double cartTotal) + { + builderBody.cartTotal = cartTotal; + return this; + } + + public CartBuilder customerId(String customerId) + { + builderBody.customerId = customerId; + return this; + } + + public CartBuilder resourceId(String resourceId) + { + builderBody.resourceId = resourceId; + return this; + } + + public SingleCart update(String cartId) throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).putRequest(EcommerceApi.shopPath(shopId, "/carts/").concat(cartId), EcommerceApi.jsonWithout(builderBody, "items"), SingleCart.class); + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/CartBuilderBody.java b/src/main/java/com/mailerlite/sdk/ecommerce/CartBuilderBody.java new file mode 100644 index 0000000..be4f635 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/CartBuilderBody.java @@ -0,0 +1,32 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.google.gson.annotations.SerializedName; +import java.util.ArrayList; + +/** + * The Class CartBuilderBody. + */ +public class CartBuilderBody { + + @SerializedName("checkout_url") + public String checkoutUrl; + + @SerializedName("cart_total") + public Double cartTotal; + + @SerializedName("ecommerce_customer_id") + public String customerId; + + @SerializedName("resource_id") + public String resourceId; + + @SerializedName("items") + public ArrayList items; +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/CartItemBuilder.java b/src/main/java/com/mailerlite/sdk/ecommerce/CartItemBuilder.java new file mode 100644 index 0000000..82e0b2f --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/CartItemBuilder.java @@ -0,0 +1,89 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.mailerlite.sdk.MailerLite; +import com.mailerlite.sdk.exceptions.MailerLiteException; + +/** + * The Class CartItemBuilder. + */ +public class CartItemBuilder { + + private MailerLite apiObjectReference; + + private String shopId; + + private String cartId; + + private CartItemBuilderBody builderBody = new CartItemBuilderBody(); + + public CartItemBuilder(MailerLite apiRef, String shopId, String cartId) + { + apiObjectReference = apiRef; + this.shopId = shopId; + this.cartId = cartId; + } + + public CartItemBuilderBody body() + { + return builderBody; + } + + public CartItemBuilder productId(String productId) + { + builderBody.productId = productId; + return this; + } + + public CartItemBuilder productResourceId(String productResourceId) + { + builderBody.productResourceId = productResourceId; + return this; + } + + public CartItemBuilder productVariantId(String productVariantId) + { + builderBody.productVariantId = productVariantId; + return this; + } + + public CartItemBuilder variant(String variant) + { + builderBody.variant = variant; + return this; + } + + public CartItemBuilder quantity(Integer quantity) + { + builderBody.quantity = quantity; + return this; + } + + public CartItemBuilder price(Double price) + { + builderBody.price = price; + return this; + } + + public CartItemBuilder resourceId(String resourceId) + { + builderBody.resourceId = resourceId; + return this; + } + + public SingleCartItem create() throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).postRequest(EcommerceApi.shopPath(shopId, "/carts/").concat(cartId).concat("/items"), EcommerceApi.json(builderBody), SingleCartItem.class); + } + + public SingleCartItem update(String itemId) throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).putRequest(EcommerceApi.shopPath(shopId, "/carts/").concat(cartId).concat("/items").concat("/").concat(itemId), EcommerceApi.json(builderBody), SingleCartItem.class); + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/CartItemBuilderBody.java b/src/main/java/com/mailerlite/sdk/ecommerce/CartItemBuilderBody.java new file mode 100644 index 0000000..c0054d0 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/CartItemBuilderBody.java @@ -0,0 +1,37 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.google.gson.annotations.SerializedName; + +/** + * The Class CartItemBuilderBody. + */ +public class CartItemBuilderBody { + + @SerializedName("ecommerce_product_id") + public String productId; + + @SerializedName("product_resource_id") + public String productResourceId; + + @SerializedName("ecommerce_product_variant_id") + public String productVariantId; + + @SerializedName("variant") + public String variant; + + @SerializedName("quantity") + public Integer quantity; + + @SerializedName("price") + public Double price; + + @SerializedName("resource_id") + public String resourceId; +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/CartItemRetriever.java b/src/main/java/com/mailerlite/sdk/ecommerce/CartItemRetriever.java new file mode 100644 index 0000000..6b1cf33 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/CartItemRetriever.java @@ -0,0 +1,45 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.mailerlite.sdk.MailerLite; +import com.mailerlite.sdk.exceptions.MailerLiteException; + +/** + * The Class CartItemRetriever. + */ +public class CartItemRetriever extends EcommerceRequest { + + private MailerLite apiObjectReference; + + private String shopId; + private String cartId; + + public CartItemRetriever(MailerLite apiRef, String shopId, String cartId) + { + apiObjectReference = apiRef; + this.shopId = shopId; + this.cartId = cartId; + } + + + public CartItemsList get() throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).getRequest(EcommerceApi.shopPath(shopId, "/carts/").concat(cartId).concat("/items").concat(this.getQueryParameters()), CartItemsList.class); + } + + public SingleCartItem getSingle(String itemId) throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).getRequest(EcommerceApi.shopPath(shopId, "/carts/").concat(cartId).concat("/items").concat("/").concat(itemId), SingleCartItem.class); + } + + @Override + protected CartItemRetriever getInstance() { + return this; + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/CartItems.java b/src/main/java/com/mailerlite/sdk/ecommerce/CartItems.java new file mode 100644 index 0000000..6695700 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/CartItems.java @@ -0,0 +1,47 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.mailerlite.sdk.MailerLite; +import com.mailerlite.sdk.MailerLiteResponse; +import com.mailerlite.sdk.exceptions.MailerLiteException; + +/** + * The Class CartItems. + */ +public class CartItems { + + private MailerLite apiObjectReference; + + private String shopId; + + private String cartId; + + public CartItems(MailerLite apiRef, String shopId, String cartId) + { + apiObjectReference = apiRef; + this.shopId = shopId; + this.cartId = cartId; + } + + public CartItemRetriever retriever() + { + return new CartItemRetriever(apiObjectReference, shopId, cartId); + } + + public CartItemBuilder builder() + { + return new CartItemBuilder(apiObjectReference, shopId, cartId); + } + + public MailerLiteResponse delete(String itemId) throws MailerLiteException + { + String endpoint = EcommerceApi.shopPath(shopId, "/carts/").concat(cartId).concat("/items/").concat(itemId); + return EcommerceApi.create(apiObjectReference).deleteRequest(endpoint, MailerLiteResponse.class); + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/CartItemsList.java b/src/main/java/com/mailerlite/sdk/ecommerce/CartItemsList.java new file mode 100644 index 0000000..c1e05e2 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/CartItemsList.java @@ -0,0 +1,32 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.google.gson.annotations.SerializedName; +import com.mailerlite.sdk.util.PaginatedResponse; + +/** + * The Class CartItemsList. + */ +public class CartItemsList extends PaginatedResponse { + + @SerializedName("data") + public EcommerceCartItem[] items; + + @Override + public void postDeserialize() + { + if (items == null) { + return; + } + + for (EcommerceCartItem item : items) { + item.parseDates(); + } + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/CartRetriever.java b/src/main/java/com/mailerlite/sdk/ecommerce/CartRetriever.java new file mode 100644 index 0000000..a66abb6 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/CartRetriever.java @@ -0,0 +1,43 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.mailerlite.sdk.MailerLite; +import com.mailerlite.sdk.exceptions.MailerLiteException; + +/** + * The Class CartRetriever. + */ +public class CartRetriever extends EcommerceRequest { + + private MailerLite apiObjectReference; + + private String shopId; + + public CartRetriever(MailerLite apiRef, String shopId) + { + apiObjectReference = apiRef; + this.shopId = shopId; + } + + + public CartsList get() throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).getRequest(EcommerceApi.shopPath(shopId, "/carts").concat(this.getQueryParameters()), CartsList.class); + } + + public SingleCart getSingle(String cartId) throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).getRequest(EcommerceApi.shopPath(shopId, "/carts").concat("/").concat(cartId), SingleCart.class); + } + + @Override + protected CartRetriever getInstance() { + return this; + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/Carts.java b/src/main/java/com/mailerlite/sdk/ecommerce/Carts.java new file mode 100644 index 0000000..bd09542 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/Carts.java @@ -0,0 +1,41 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.mailerlite.sdk.MailerLite; + +/** + * The Class Carts. + */ +public class Carts { + + private MailerLite apiObjectReference; + + private String shopId; + + public Carts(MailerLite apiRef, String shopId) + { + apiObjectReference = apiRef; + this.shopId = shopId; + } + + public CartRetriever retriever() + { + return new CartRetriever(apiObjectReference, shopId); + } + + public CartBuilder builder() + { + return new CartBuilder(apiObjectReference, shopId); + } + + public CartItems items(String cartId) + { + return new CartItems(apiObjectReference, shopId, cartId); + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/CartsList.java b/src/main/java/com/mailerlite/sdk/ecommerce/CartsList.java new file mode 100644 index 0000000..92b31c5 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/CartsList.java @@ -0,0 +1,32 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.google.gson.annotations.SerializedName; +import com.mailerlite.sdk.util.PaginatedResponse; + +/** + * The Class CartsList. + */ +public class CartsList extends PaginatedResponse { + + @SerializedName("data") + public EcommerceCart[] carts; + + @Override + public void postDeserialize() + { + if (carts == null) { + return; + } + + for (EcommerceCart item : carts) { + item.parseDates(); + } + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/Categories.java b/src/main/java/com/mailerlite/sdk/ecommerce/Categories.java new file mode 100644 index 0000000..8bb79f8 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/Categories.java @@ -0,0 +1,55 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.mailerlite.sdk.MailerLite; +import com.mailerlite.sdk.MailerLiteResponse; +import com.mailerlite.sdk.exceptions.MailerLiteException; + +/** + * The Class Categories. + */ +public class Categories { + + private MailerLite apiObjectReference; + + private String shopId; + + public Categories(MailerLite apiRef, String shopId) + { + apiObjectReference = apiRef; + this.shopId = shopId; + } + + public CategoryRetriever retriever() + { + return new CategoryRetriever(apiObjectReference, shopId); + } + + public CategoryBuilder builder() + { + return new CategoryBuilder(apiObjectReference, shopId); + } + + public SingleProduct assignProduct(String categoryId, String productId) throws MailerLiteException + { + String endpoint = EcommerceApi.shopPath(shopId, "/categories/").concat(categoryId).concat("/products/").concat(productId); + return EcommerceApi.create(apiObjectReference).putRequest(endpoint, "{}", SingleProduct.class); + } + + public SingleProduct unassignProduct(String categoryId, String productId) throws MailerLiteException + { + String endpoint = EcommerceApi.shopPath(shopId, "/categories/").concat(categoryId).concat("/products/").concat(productId); + return EcommerceApi.create(apiObjectReference).deleteRequest(endpoint, SingleProduct.class); + } + + public MailerLiteResponse delete(String categoryId) throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).deleteRequest(EcommerceApi.shopPath(shopId, "/categories/").concat(categoryId), MailerLiteResponse.class); + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/CategoriesList.java b/src/main/java/com/mailerlite/sdk/ecommerce/CategoriesList.java new file mode 100644 index 0000000..f6f4c68 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/CategoriesList.java @@ -0,0 +1,32 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.google.gson.annotations.SerializedName; +import com.mailerlite.sdk.util.PaginatedResponse; + +/** + * The Class CategoriesList. + */ +public class CategoriesList extends PaginatedResponse { + + @SerializedName("data") + public EcommerceCategory[] categories; + + @Override + public void postDeserialize() + { + if (categories == null) { + return; + } + + for (EcommerceCategory item : categories) { + item.parseDates(); + } + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/CategoryBuilder.java b/src/main/java/com/mailerlite/sdk/ecommerce/CategoryBuilder.java new file mode 100644 index 0000000..b057d83 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/CategoryBuilder.java @@ -0,0 +1,62 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.mailerlite.sdk.MailerLite; +import com.mailerlite.sdk.exceptions.MailerLiteException; + +/** + * The Class CategoryBuilder. + */ +public class CategoryBuilder { + + private MailerLite apiObjectReference; + + private String shopId; + + private CategoryBuilderBody builderBody = new CategoryBuilderBody(); + + public CategoryBuilder(MailerLite apiRef, String shopId) + { + apiObjectReference = apiRef; + this.shopId = shopId; + } + + public CategoryBuilderBody body() + { + return builderBody; + } + + public CategoryBuilder name(String name) + { + builderBody.name = name; + return this; + } + + public CategoryBuilder resourceId(String resourceId) + { + builderBody.resourceId = resourceId; + return this; + } + + public CategoryBuilder excludeFromAutomations(Boolean excludeFromAutomations) + { + builderBody.excludeFromAutomations = excludeFromAutomations; + return this; + } + + public SingleCategory create() throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).postRequest(EcommerceApi.shopPath(shopId, "/categories"), EcommerceApi.json(builderBody), SingleCategory.class); + } + + public SingleCategory update(String categoryId) throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).putRequest(EcommerceApi.shopPath(shopId, "/categories").concat("/").concat(categoryId), EcommerceApi.json(builderBody), SingleCategory.class); + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/CategoryBuilderBody.java b/src/main/java/com/mailerlite/sdk/ecommerce/CategoryBuilderBody.java new file mode 100644 index 0000000..241dfeb --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/CategoryBuilderBody.java @@ -0,0 +1,25 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.google.gson.annotations.SerializedName; + +/** + * The Class CategoryBuilderBody. + */ +public class CategoryBuilderBody { + + @SerializedName("name") + public String name; + + @SerializedName("resource_id") + public String resourceId; + + @SerializedName("exclude_from_automations") + public Boolean excludeFromAutomations; +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/CategoryRetriever.java b/src/main/java/com/mailerlite/sdk/ecommerce/CategoryRetriever.java new file mode 100644 index 0000000..b10093a --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/CategoryRetriever.java @@ -0,0 +1,54 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.mailerlite.sdk.MailerLite; +import com.mailerlite.sdk.exceptions.MailerLiteException; + +/** + * The Class CategoryRetriever. + */ +public class CategoryRetriever extends EcommerceRequest { + + private MailerLite apiObjectReference; + + private String shopId; + + public CategoryRetriever(MailerLite apiRef, String shopId) + { + apiObjectReference = apiRef; + this.shopId = shopId; + } + + public CategoryRetriever excludeFromAutomationsFilter(boolean value) + { + this.addQueryParameter("filter[exclude_from_automations]", String.valueOf(value)); + return this; + } + + public CategoriesList get() throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).getRequest(EcommerceApi.shopPath(shopId, "/categories").concat(this.getQueryParameters()), CategoriesList.class); + } + + public SingleCategory getSingle(String categoryId) throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).getRequest(EcommerceApi.shopPath(shopId, "/categories").concat("/").concat(categoryId), SingleCategory.class); + } + + public ProductsList getProducts(String categoryId) throws MailerLiteException + { + String endpoint = EcommerceApi.shopPath(shopId, "/categories/").concat(categoryId).concat("/products").concat(this.getQueryParameters()); + return EcommerceApi.create(apiObjectReference).getRequest(endpoint, ProductsList.class); + } + + @Override + protected CategoryRetriever getInstance() { + return this; + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/CustomerBuilder.java b/src/main/java/com/mailerlite/sdk/ecommerce/CustomerBuilder.java new file mode 100644 index 0000000..feea6b5 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/CustomerBuilder.java @@ -0,0 +1,92 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.mailerlite.sdk.MailerLite; +import com.mailerlite.sdk.exceptions.MailerLiteException; + +/** + * The Class CustomerBuilder. + */ +public class CustomerBuilder { + + private MailerLite apiObjectReference; + + private String shopId; + + private CustomerBuilderBody builderBody = new CustomerBuilderBody(); + + public CustomerBuilder(MailerLite apiRef, String shopId) + { + apiObjectReference = apiRef; + this.shopId = shopId; + } + + public CustomerBuilderBody body() + { + return builderBody; + } + + public CustomerBuilder email(String email) + { + builderBody.email = email; + return this; + } + + public CustomerBuilder name(String name) + { + builderBody.name = name; + return this; + } + + public CustomerBuilder lastName(String lastName) + { + builderBody.lastName = lastName; + return this; + } + + public CustomerBuilder acceptsMarketing(Boolean acceptsMarketing) + { + builderBody.acceptsMarketing = acceptsMarketing; + return this; + } + + public CustomerBuilder totalSpent(Double totalSpent) + { + builderBody.totalSpent = totalSpent; + return this; + } + + public CustomerBuilder ordersCount(Integer ordersCount) + { + builderBody.ordersCount = ordersCount; + return this; + } + + public CustomerBuilder createSubscriber(Boolean createSubscriber) + { + builderBody.createSubscriber = createSubscriber; + return this; + } + + public CustomerBuilder resourceId(String resourceId) + { + builderBody.resourceId = resourceId; + return this; + } + + public SingleCustomer create() throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).postRequest(EcommerceApi.shopPath(shopId, "/customers"), EcommerceApi.json(builderBody), SingleCustomer.class); + } + + public SingleCustomer update(String customerId) throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).putRequest(EcommerceApi.shopPath(shopId, "/customers").concat("/").concat(customerId), EcommerceApi.json(builderBody), SingleCustomer.class); + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/CustomerBuilderBody.java b/src/main/java/com/mailerlite/sdk/ecommerce/CustomerBuilderBody.java new file mode 100644 index 0000000..a9df0a5 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/CustomerBuilderBody.java @@ -0,0 +1,40 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.google.gson.annotations.SerializedName; + +/** + * The Class CustomerBuilderBody. + */ +public class CustomerBuilderBody { + + @SerializedName("email") + public String email; + + @SerializedName("name") + public String name; + + @SerializedName("last_name") + public String lastName; + + @SerializedName("accepts_marketing") + public Boolean acceptsMarketing; + + @SerializedName("total_spent") + public Double totalSpent; + + @SerializedName("orders_count") + public Integer ordersCount; + + @SerializedName("create_subscriber") + public Boolean createSubscriber; + + @SerializedName("resource_id") + public String resourceId; +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/CustomerRetriever.java b/src/main/java/com/mailerlite/sdk/ecommerce/CustomerRetriever.java new file mode 100644 index 0000000..49458a2 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/CustomerRetriever.java @@ -0,0 +1,54 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.mailerlite.sdk.MailerLite; +import com.mailerlite.sdk.exceptions.MailerLiteException; + +/** + * The Class CustomerRetriever. + */ +public class CustomerRetriever extends EcommerceRequest { + + private MailerLite apiObjectReference; + + private String shopId; + + public CustomerRetriever(MailerLite apiRef, String shopId) + { + apiObjectReference = apiRef; + this.shopId = shopId; + } + + public CustomerRetriever emailFilter(String value) + { + this.addQueryParameter("filter[email]", String.valueOf(value)); + return this; + } + + public CustomerRetriever sort(String value) + { + this.addQueryParameter("sort", String.valueOf(value)); + return this; + } + + public CustomersList get() throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).getRequest(EcommerceApi.shopPath(shopId, "/customers").concat(this.getQueryParameters()), CustomersList.class); + } + + public SingleCustomer getSingle(String customerId) throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).getRequest(EcommerceApi.shopPath(shopId, "/customers").concat("/").concat(customerId), SingleCustomer.class); + } + + @Override + protected CustomerRetriever getInstance() { + return this; + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/Customers.java b/src/main/java/com/mailerlite/sdk/ecommerce/Customers.java new file mode 100644 index 0000000..6f4606e --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/Customers.java @@ -0,0 +1,43 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.mailerlite.sdk.MailerLite; +import com.mailerlite.sdk.MailerLiteResponse; +import com.mailerlite.sdk.exceptions.MailerLiteException; + +/** + * The Class Customers. + */ +public class Customers { + + private MailerLite apiObjectReference; + + private String shopId; + + public Customers(MailerLite apiRef, String shopId) + { + apiObjectReference = apiRef; + this.shopId = shopId; + } + + public CustomerRetriever retriever() + { + return new CustomerRetriever(apiObjectReference, shopId); + } + + public CustomerBuilder builder() + { + return new CustomerBuilder(apiObjectReference, shopId); + } + + public MailerLiteResponse delete(String customerId) throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).deleteRequest(EcommerceApi.shopPath(shopId, "/customers/").concat(customerId), MailerLiteResponse.class); + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/CustomersList.java b/src/main/java/com/mailerlite/sdk/ecommerce/CustomersList.java new file mode 100644 index 0000000..2bf570b --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/CustomersList.java @@ -0,0 +1,32 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.google.gson.annotations.SerializedName; +import com.mailerlite.sdk.util.PaginatedResponse; + +/** + * The Class CustomersList. + */ +public class CustomersList extends PaginatedResponse { + + @SerializedName("data") + public EcommerceCustomer[] customers; + + @Override + public void postDeserialize() + { + if (customers == null) { + return; + } + + for (EcommerceCustomer item : customers) { + item.parseDates(); + } + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/Ecommerce.java b/src/main/java/com/mailerlite/sdk/ecommerce/Ecommerce.java new file mode 100644 index 0000000..4447c1e --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/Ecommerce.java @@ -0,0 +1,64 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.mailerlite.sdk.MailerLite; +import com.mailerlite.sdk.exceptions.MailerLiteException; + +/** + * The Class Ecommerce. + */ +public class Ecommerce { + + private MailerLite apiObjectReference; + + public Ecommerce(MailerLite apiRef) + { + apiObjectReference = apiRef; + } + + public Shops shops() + { + return new Shops(apiObjectReference); + } + + public Products products(String shopId) + { + return new Products(apiObjectReference, shopId); + } + + public Categories categories(String shopId) + { + return new Categories(apiObjectReference, shopId); + } + + public Customers customers(String shopId) + { + return new Customers(apiObjectReference, shopId); + } + + public Orders orders(String shopId) + { + return new Orders(apiObjectReference, shopId); + } + + public Carts carts(String shopId) + { + return new Carts(apiObjectReference, shopId); + } + + public Imports imports(String shopId) + { + return new Imports(apiObjectReference, shopId); + } + + public SingleEcommerceSettings getSettings() throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).getRequest("/ecommerce/settings", SingleEcommerceSettings.class); + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceApi.java b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceApi.java new file mode 100644 index 0000000..bb4ed42 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceApi.java @@ -0,0 +1,52 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.google.gson.JsonObject; +import com.mailerlite.sdk.MailerLite; +import com.mailerlite.sdk.MailerLiteApi; +import com.mailerlite.sdk.util.JsonBody; +import com.mailerlite.sdk.util.SdkGson; + +/** + * The Class EcommerceApi. + */ +final class EcommerceApi { + + private EcommerceApi() + { + } + + static MailerLiteApi create(MailerLite apiRef) + { + MailerLiteApi api = new MailerLiteApi(); + api.setToken(apiRef.getToken()); + return api; + } + + static String json(Object body) + { + return JsonBody.toJson(body); + } + + static String jsonWithout(Object body, String... fields) + { + JsonObject json = SdkGson.plain().toJsonTree(body).getAsJsonObject(); + + for (String field : fields) { + json.remove(field); + } + + return json.toString(); + } + + static String shopPath(String shopId, String path) + { + return "/ecommerce/shops/".concat(shopId).concat(path); + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceCart.java b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceCart.java new file mode 100644 index 0000000..c9a018f --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceCart.java @@ -0,0 +1,42 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.google.gson.annotations.SerializedName; +import com.mailerlite.sdk.util.ApiResource; + +/** + * The Class EcommerceCart. + */ +public class EcommerceCart extends ApiResource { + + @SerializedName("id") + public String id; + + @SerializedName("resource_id") + public String resourceId; + + @SerializedName("checkout_url") + public String checkoutUrl; + + @SerializedName("cart_total") + public Double cartTotal; + + @SerializedName("items") + public EcommerceCartItem[] items; + + @Override + public void parseDates() + { + if (items != null) { + for (EcommerceCartItem item : items) { + item.parseDates(); + } + } + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceCartItem.java b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceCartItem.java new file mode 100644 index 0000000..28a6ab8 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceCartItem.java @@ -0,0 +1,46 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.google.gson.annotations.SerializedName; +import com.mailerlite.sdk.util.ApiResource; + +/** + * The Class EcommerceCartItem. + */ +public class EcommerceCartItem extends ApiResource { + + @SerializedName("id") + public String id; + + @SerializedName("resource_id") + public String resourceId; + + @SerializedName("product") + public EcommerceProduct product; + + @SerializedName("ecommerce_product_variant_id") + public String productVariantId; + + @SerializedName("variant") + public String variant; + + @SerializedName("quantity") + public Integer quantity; + + @SerializedName("price") + public Double price; + + @Override + public void parseDates() + { + if (product != null) { + product.parseDates(); + } + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceCategory.java b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceCategory.java index f350a03..1ac8f9e 100644 --- a/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceCategory.java +++ b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceCategory.java @@ -7,12 +7,16 @@ **************************************************/ package com.mailerlite.sdk.ecommerce; +import java.util.Date; + import com.google.gson.annotations.SerializedName; +import com.mailerlite.sdk.util.ApiResource; +import com.mailerlite.sdk.util.ParseDate; /** * The Class EcommerceCategory. */ -public class EcommerceCategory { +public class EcommerceCategory extends ApiResource { /** The id. */ @SerializedName("id") @@ -21,4 +25,22 @@ public class EcommerceCategory { /** The name. */ @SerializedName("name") public String name; + + @SerializedName("resource_id") + public String resourceId; + + @SerializedName("exclude_from_automations") + public Boolean excludeFromAutomations; + + @SerializedName("created_at") + public String createdAtStr; + + @ParseDate("createdAtStr") + public Date createdAt; + + @SerializedName("updated_at") + public String updatedAtStr; + + @ParseDate("updatedAtStr") + public Date updatedAt; } diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceCustomer.java b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceCustomer.java new file mode 100644 index 0000000..664fd74 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceCustomer.java @@ -0,0 +1,47 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.google.gson.annotations.SerializedName; +import com.mailerlite.sdk.susbcribers.Subscriber; +import com.mailerlite.sdk.util.ApiResource; + +/** + * The Class EcommerceCustomer. + */ +public class EcommerceCustomer extends ApiResource { + + @SerializedName("id") + public String id; + + @SerializedName("resource_id") + public String resourceId; + + @SerializedName("email") + public String email; + + @SerializedName("accepts_marketing") + public Boolean acceptsMarketing; + + @SerializedName("total_spent") + public Double totalSpent; + + @SerializedName("orders_count") + public Integer ordersCount; + + @SerializedName("subscriber") + public Subscriber subscriber; + + @Override + public void parseDates() + { + if (subscriber != null) { + subscriber.parseDates(); + } + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceOrder.java b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceOrder.java new file mode 100644 index 0000000..63b618b --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceOrder.java @@ -0,0 +1,76 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import java.util.Date; + +import com.google.gson.annotations.SerializedName; +import com.mailerlite.sdk.util.ApiResource; +import com.mailerlite.sdk.util.ParseDate; + +/** + * The Class EcommerceOrder. + */ +public class EcommerceOrder extends ApiResource { + + @SerializedName("id") + public String id; + + @SerializedName("resource_id") + public String resourceId; + + @SerializedName("customer") + public EcommerceCustomer customer; + + @SerializedName("cart") + public EcommerceCart cart; + + @SerializedName("total") + public Double total; + + @SerializedName("status") + public String status; + + @SerializedName("stage") + public String stage; + + @SerializedName("created_at") + public String createdAtStr; + + @ParseDate("createdAtStr") + public Date createdAt; + + @SerializedName("updated_at") + public String updatedAtStr; + + @ParseDate("updatedAtStr") + public Date updatedAt; + + @SerializedName("completed_at") + public String completedAtStr; + + @ParseDate("completedAtStr") + public Date completedAt; + + @SerializedName("attribution") + public EcommerceOrderAttribution attribution; + + @Override + public void parseDates() + { + super.parseDates(); + + if (customer != null) { + customer.parseDates(); + } + + if (cart != null) { + cart.parseDates(); + } + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceOrderAttribution.java b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceOrderAttribution.java new file mode 100644 index 0000000..1bff1ac --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceOrderAttribution.java @@ -0,0 +1,22 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.google.gson.annotations.SerializedName; + +/** + * The Class EcommerceOrderAttribution. + */ +public class EcommerceOrderAttribution { + + @SerializedName("email_id") + public String emailId; + + @SerializedName("type") + public String type; +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceProduct.java b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceProduct.java index 4acf692..58a8737 100644 --- a/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceProduct.java +++ b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceProduct.java @@ -7,12 +7,16 @@ **************************************************/ package com.mailerlite.sdk.ecommerce; +import java.util.Date; + import com.google.gson.annotations.SerializedName; +import com.mailerlite.sdk.util.ApiResource; +import com.mailerlite.sdk.util.ParseDate; /** * The Class EcommerceProduct. */ -public class EcommerceProduct { +public class EcommerceProduct extends ApiResource { /** The id. */ @SerializedName("id") @@ -21,4 +25,58 @@ public class EcommerceProduct { /** The name. */ @SerializedName("name") public String name; + + @SerializedName("resource_id") + public String resourceId; + + @SerializedName("price") + public Double price; + + @SerializedName("currency") + public String currency; + + @SerializedName("url") + public String url; + + @SerializedName("image") + public String image; + + @SerializedName("short_description") + public String shortDescription; + + @SerializedName("description") + public String description; + + @SerializedName("type") + public String type; + + @SerializedName("enabled") + public Boolean enabled; + + @SerializedName("exclude_from_automations") + public Boolean excludeFromAutomations; + + @SerializedName("categories") + public EcommerceCategory[] categories; + + @SerializedName("variants") + public EcommerceProductVariant[] variants; + + @SerializedName("created_at") + public String createdAtStr; + + @ParseDate("createdAtStr") + public Date createdAt; + + @Override + public void parseDates() + { + super.parseDates(); + + if (categories != null) { + for (EcommerceCategory category : categories) { + category.parseDates(); + } + } + } } diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceProductVariant.java b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceProductVariant.java new file mode 100644 index 0000000..17e92d2 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceProductVariant.java @@ -0,0 +1,38 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.google.gson.JsonElement; +import com.google.gson.annotations.SerializedName; + +/** + * The Class EcommerceProductVariant. + */ +public class EcommerceProductVariant { + + @SerializedName("id") + public String id; + + @SerializedName("resource_id") + public String resourceId; + + @SerializedName("name") + public String name; + + @SerializedName("attributes") + public JsonElement attributes; + + @SerializedName("price") + public Double price; + + @SerializedName("price_type") + public String priceType; + + @SerializedName("image_url") + public String imageUrl; +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceReport.java b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceReport.java new file mode 100644 index 0000000..f1c8617 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceReport.java @@ -0,0 +1,26 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.google.gson.JsonElement; +import com.google.gson.annotations.SerializedName; + +/** + * The Class EcommerceReport. + */ +public class EcommerceReport { + + @SerializedName("ecommerce") + public EcommerceStats ecommerce; + + @SerializedName("best_performing_email") + public JsonElement bestPerformingEmail; + + @SerializedName("series") + public JsonElement series; +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceReportRetriever.java b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceReportRetriever.java new file mode 100644 index 0000000..3027cae --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceReportRetriever.java @@ -0,0 +1,86 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.mailerlite.sdk.MailerLite; +import com.mailerlite.sdk.automations.reports.OrderActivityList; +import com.mailerlite.sdk.exceptions.MailerLiteException; + +/** + * The Class EcommerceReportRetriever. + */ +public class EcommerceReportRetriever extends EcommerceRequest { + + private MailerLite apiObjectReference; + + private String statsEndpoint; + + private String ordersEndpoint; + + public EcommerceReportRetriever(MailerLite apiRef, String statsEndpoint, String ordersEndpoint) + { + apiObjectReference = apiRef; + this.statsEndpoint = statsEndpoint; + this.ordersEndpoint = ordersEndpoint; + } + + public EcommerceReportRetriever shopId(String shopId) + { + this.addQueryParameter("shop_id", shopId); + return this; + } + + public EcommerceReportRetriever startDate(String startDate) + { + this.addQueryParameter("start_date", startDate); + return this; + } + + public EcommerceReportRetriever endDate(String endDate) + { + this.addQueryParameter("end_date", endDate); + return this; + } + + public EcommerceReportRetriever timeFrame(String timeFrame) + { + this.addQueryParameter("time_frame", timeFrame); + return this; + } + + public EcommerceReportRetriever timeFrameStart(String timeFrameStart) + { + this.addQueryParameter("time_frame_start", timeFrameStart); + return this; + } + + public EcommerceReportRetriever timeFrameEnd(String timeFrameEnd) + { + this.addQueryParameter("time_frame_end", timeFrameEnd); + return this; + } + + public SingleEcommerceReport stats() throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).getRequest(statsEndpoint.concat(this.getQueryParameters()), SingleEcommerceReport.class); + } + + public OrderActivityList orders() throws MailerLiteException + { + if (ordersEndpoint == null) { + throw new MailerLiteException("This report has no orders list. Use stats() instead."); + } + + return EcommerceApi.create(apiObjectReference).getRequest(ordersEndpoint.concat(this.getQueryParameters()), OrderActivityList.class); + } + + @Override + protected EcommerceReportRetriever getInstance() { + return this; + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceRequest.java b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceRequest.java new file mode 100644 index 0000000..3686627 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceRequest.java @@ -0,0 +1,55 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.mailerlite.sdk.util.PaginatedRequest; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * The Class EcommerceRequest. + */ +public abstract class EcommerceRequest> extends PaginatedRequest { + + private Map queryParameters = new LinkedHashMap(); + + public T page(int page) + { + this.addQueryParameter("page", Integer.toString(page)); + return getInstance(); + } + + @Override + public void addQueryParameter(String name, String value) + { + queryParameters.put(name, value); + } + + @Override + public void removeQueryParameter(String name) + { + queryParameters.remove(name); + } + + @Override + public String getQueryParameters() + { + String query = ""; + + for (Map.Entry parameter : queryParameters.entrySet()) { + query = query.concat(query.isEmpty() ? "?" : "&") + .concat(URLEncoder.encode(parameter.getKey(), StandardCharsets.UTF_8)) + .concat("=") + .concat(URLEncoder.encode(parameter.getValue(), StandardCharsets.UTF_8)); + } + + return query; + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceSettings.java b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceSettings.java new file mode 100644 index 0000000..961d8de --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceSettings.java @@ -0,0 +1,25 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.google.gson.annotations.SerializedName; + +/** + * The Class EcommerceSettings. + */ +public class EcommerceSettings { + + @SerializedName("ecommerce_tracking_in_campaigns") + public Boolean trackingInCampaigns; + + @SerializedName("ecommerce_tracking_in_automations") + public Boolean trackingInAutomations; + + @SerializedName("ecommerce_attribution_window") + public Integer attributionWindow; +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceShop.java b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceShop.java index ef2c65c..f9c77ea 100644 --- a/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceShop.java +++ b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceShop.java @@ -7,12 +7,17 @@ **************************************************/ package com.mailerlite.sdk.ecommerce; +import java.util.Date; + import com.google.gson.annotations.SerializedName; +import com.mailerlite.sdk.groups.Group; +import com.mailerlite.sdk.util.ApiResource; +import com.mailerlite.sdk.util.ParseDate; /** * The Class EcommerceShop. */ -public class EcommerceShop { +public class EcommerceShop extends ApiResource { /** The id. */ @SerializedName("id") @@ -25,4 +30,47 @@ public class EcommerceShop { /** The url. */ @SerializedName("url") public String url; + + @SerializedName("currency") + public String currency; + + @SerializedName("currency_sign") + public String currencySign; + + @SerializedName("platform") + public String platform; + + @SerializedName("enabled") + public Boolean enabled; + + @SerializedName("enable_popups") + public Boolean enablePopups; + + @SerializedName("enable_resubscribe") + public Boolean enableResubscribe; + + @SerializedName("group") + public Group group; + + @SerializedName("created_at") + public String createdAtStr; + + @ParseDate("createdAtStr") + public Date createdAt; + + @SerializedName("updated_at") + public String updatedAtStr; + + @ParseDate("updatedAtStr") + public Date updatedAt; + + @Override + public void parseDates() + { + super.parseDates(); + + if (group != null) { + group.parseDates(); + } + } } diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceStats.java b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceStats.java new file mode 100644 index 0000000..20ad570 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceStats.java @@ -0,0 +1,28 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.google.gson.annotations.SerializedName; + +/** + * The Class EcommerceStats. + */ +public class EcommerceStats { + + @SerializedName("orders_count") + public Integer ordersCount; + + @SerializedName("revenue") + public Double revenue; + + @SerializedName("average_order_value") + public Double averageOrderValue; + + @SerializedName("conversion_rate") + public String conversionRate; +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/Imports.java b/src/main/java/com/mailerlite/sdk/ecommerce/Imports.java new file mode 100644 index 0000000..03e0034 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/Imports.java @@ -0,0 +1,53 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.mailerlite.sdk.MailerLite; +import com.mailerlite.sdk.MailerLiteResponse; +import com.mailerlite.sdk.exceptions.MailerLiteException; +import java.util.HashMap; +import java.util.List; + +/** + * The Class Imports. + */ +public class Imports { + + private MailerLite apiObjectReference; + + private String shopId; + + public Imports(MailerLite apiRef, String shopId) + { + apiObjectReference = apiRef; + this.shopId = shopId; + } + + public MailerLiteResponse products(List products) throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).postRequest(EcommerceApi.shopPath(shopId, "/products/import"), EcommerceApi.json(products), MailerLiteResponse.class); + } + + public MailerLiteResponse categories(List categories) throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).postRequest(EcommerceApi.shopPath(shopId, "/categories/import"), EcommerceApi.json(categories), MailerLiteResponse.class); + } + + public MailerLiteResponse customers(List customers) throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).postRequest(EcommerceApi.shopPath(shopId, "/customers/import"), EcommerceApi.json(customers), MailerLiteResponse.class); + } + + public MailerLiteResponse orders(List orders) throws MailerLiteException + { + HashMap body = new HashMap(); + body.put("orders", orders); + + return EcommerceApi.create(apiObjectReference).postRequest(EcommerceApi.shopPath(shopId, "/orders/import"), EcommerceApi.json(body), MailerLiteResponse.class); + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/OrderBuilder.java b/src/main/java/com/mailerlite/sdk/ecommerce/OrderBuilder.java new file mode 100644 index 0000000..b7a703f --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/OrderBuilder.java @@ -0,0 +1,99 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.mailerlite.sdk.MailerLite; +import com.mailerlite.sdk.exceptions.MailerLiteException; +import java.util.ArrayList; + +/** + * The Class OrderBuilder. + */ +public class OrderBuilder { + + private MailerLite apiObjectReference; + + private String shopId; + + private OrderBuilderBody builderBody = new OrderBuilderBody(); + + public OrderBuilder(MailerLite apiRef, String shopId) + { + apiObjectReference = apiRef; + this.shopId = shopId; + } + + public OrderBuilderBody body() + { + return builderBody; + } + + public OrderBuilder customer(CustomerBuilderBody customer) + { + builderBody.customer = customer; + return this; + } + + public OrderBuilder status(String status) + { + builderBody.status = status; + return this; + } + + public OrderBuilder stage(String stage) + { + builderBody.stage = stage; + return this; + } + + public OrderBuilder totalPrice(Double totalPrice) + { + builderBody.totalPrice = totalPrice; + return this; + } + + public OrderBuilder resourceId(String resourceId) + { + builderBody.resourceId = resourceId; + return this; + } + + public OrderBuilder createdAt(String createdAt) + { + builderBody.createdAt = createdAt; + return this; + } + + public OrderBuilder withoutAutomations(Boolean withoutAutomations) + { + builderBody.withoutAutomations = withoutAutomations; + return this; + } + + public OrderBuilder item(CartItemBuilderBody item) + { + if (builderBody.cart == null) { + builderBody.cart = new CartBuilderBody(); + } + if (builderBody.cart.items == null) { + builderBody.cart.items = new ArrayList(); + } + builderBody.cart.items.add(item); + return this; + } + + public SingleOrder create() throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).postRequest(EcommerceApi.shopPath(shopId, "/orders"), EcommerceApi.json(builderBody), SingleOrder.class); + } + + public SingleOrder update(String orderId) throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).putRequest(EcommerceApi.shopPath(shopId, "/orders").concat("/").concat(orderId), EcommerceApi.jsonWithout(builderBody, "customer", "cart"), SingleOrder.class); + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/OrderBuilderBody.java b/src/main/java/com/mailerlite/sdk/ecommerce/OrderBuilderBody.java new file mode 100644 index 0000000..25b7231 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/OrderBuilderBody.java @@ -0,0 +1,40 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.google.gson.annotations.SerializedName; + +/** + * The Class OrderBuilderBody. + */ +public class OrderBuilderBody { + + @SerializedName("customer") + public CustomerBuilderBody customer; + + @SerializedName("cart") + public CartBuilderBody cart; + + @SerializedName("status") + public String status; + + @SerializedName("stage") + public String stage; + + @SerializedName("total_price") + public Double totalPrice; + + @SerializedName("resource_id") + public String resourceId; + + @SerializedName("created_at") + public String createdAt; + + @SerializedName("without_automations") + public Boolean withoutAutomations; +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/OrderRetriever.java b/src/main/java/com/mailerlite/sdk/ecommerce/OrderRetriever.java new file mode 100644 index 0000000..3fc38c0 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/OrderRetriever.java @@ -0,0 +1,72 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.mailerlite.sdk.MailerLite; +import com.mailerlite.sdk.exceptions.MailerLiteException; + +/** + * The Class OrderRetriever. + */ +public class OrderRetriever extends EcommerceRequest { + + private MailerLite apiObjectReference; + + private String shopId; + + public OrderRetriever(MailerLite apiRef, String shopId) + { + apiObjectReference = apiRef; + this.shopId = shopId; + } + + public OrderRetriever statusFilter(String value) + { + this.addQueryParameter("filter[status]", String.valueOf(value)); + return this; + } + + public OrderRetriever customerFilter(String value) + { + this.addQueryParameter("filter[customer]", String.valueOf(value)); + return this; + } + + public OrderRetriever attributedFilter(boolean value) + { + this.addQueryParameter("filter[attributed]", String.valueOf(value)); + return this; + } + + public OrderRetriever emailIdFilter(String value) + { + this.addQueryParameter("filter[email_id]", String.valueOf(value)); + return this; + } + + public OrderRetriever sort(String value) + { + this.addQueryParameter("sort", String.valueOf(value)); + return this; + } + + public OrdersList get() throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).getRequest(EcommerceApi.shopPath(shopId, "/orders").concat(this.getQueryParameters()), OrdersList.class); + } + + public SingleOrder getSingle(String orderId) throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).getRequest(EcommerceApi.shopPath(shopId, "/orders").concat("/").concat(orderId), SingleOrder.class); + } + + @Override + protected OrderRetriever getInstance() { + return this; + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/Orders.java b/src/main/java/com/mailerlite/sdk/ecommerce/Orders.java new file mode 100644 index 0000000..373bc3b --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/Orders.java @@ -0,0 +1,43 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.mailerlite.sdk.MailerLite; +import com.mailerlite.sdk.MailerLiteResponse; +import com.mailerlite.sdk.exceptions.MailerLiteException; + +/** + * The Class Orders. + */ +public class Orders { + + private MailerLite apiObjectReference; + + private String shopId; + + public Orders(MailerLite apiRef, String shopId) + { + apiObjectReference = apiRef; + this.shopId = shopId; + } + + public OrderRetriever retriever() + { + return new OrderRetriever(apiObjectReference, shopId); + } + + public OrderBuilder builder() + { + return new OrderBuilder(apiObjectReference, shopId); + } + + public MailerLiteResponse delete(String orderId) throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).deleteRequest(EcommerceApi.shopPath(shopId, "/orders/").concat(orderId), MailerLiteResponse.class); + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/OrdersList.java b/src/main/java/com/mailerlite/sdk/ecommerce/OrdersList.java new file mode 100644 index 0000000..b0b7e87 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/OrdersList.java @@ -0,0 +1,32 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.google.gson.annotations.SerializedName; +import com.mailerlite.sdk.util.PaginatedResponse; + +/** + * The Class OrdersList. + */ +public class OrdersList extends PaginatedResponse { + + @SerializedName("data") + public EcommerceOrder[] orders; + + @Override + public void postDeserialize() + { + if (orders == null) { + return; + } + + for (EcommerceOrder item : orders) { + item.parseDates(); + } + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/ProductBuilder.java b/src/main/java/com/mailerlite/sdk/ecommerce/ProductBuilder.java new file mode 100644 index 0000000..aadd0f4 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/ProductBuilder.java @@ -0,0 +1,123 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.mailerlite.sdk.MailerLite; +import com.mailerlite.sdk.exceptions.MailerLiteException; +import java.util.ArrayList; + +/** + * The Class ProductBuilder. + */ +public class ProductBuilder { + + private MailerLite apiObjectReference; + + private String shopId; + + private ProductBuilderBody builderBody = new ProductBuilderBody(); + + public ProductBuilder(MailerLite apiRef, String shopId) + { + apiObjectReference = apiRef; + this.shopId = shopId; + } + + public ProductBuilderBody body() + { + return builderBody; + } + + public ProductBuilder name(String name) + { + builderBody.name = name; + return this; + } + + public ProductBuilder resourceId(String resourceId) + { + builderBody.resourceId = resourceId; + return this; + } + + public ProductBuilder price(Double price) + { + builderBody.price = price; + return this; + } + + public ProductBuilder url(String url) + { + builderBody.url = url; + return this; + } + + public ProductBuilder image(String image) + { + builderBody.image = image; + return this; + } + + public ProductBuilder shortDescription(String shortDescription) + { + builderBody.shortDescription = shortDescription; + return this; + } + + public ProductBuilder description(String description) + { + builderBody.description = description; + return this; + } + + public ProductBuilder excludeFromAutomations(Boolean excludeFromAutomations) + { + builderBody.excludeFromAutomations = excludeFromAutomations; + return this; + } + + public ProductBuilder enabled(Boolean enabled) + { + builderBody.enabled = enabled; + return this; + } + + public ProductBuilder type(String type) + { + builderBody.type = type; + return this; + } + + public ProductBuilder categoryId(String categoryId) + { + if (builderBody.categories == null) { + builderBody.categories = new ArrayList(); + } + builderBody.categories.add(categoryId); + return this; + } + + public ProductBuilder variant(ProductVariantBuilderBody variant) + { + if (builderBody.variants == null) { + builderBody.variants = new ArrayList(); + } + builderBody.variants.add(variant); + return this; + } + + public SingleProduct create() throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).postRequest(EcommerceApi.shopPath(shopId, "/products"), EcommerceApi.json(builderBody), SingleProduct.class); + } + + public SingleProduct update(String productId) throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).putRequest(EcommerceApi.shopPath(shopId, "/products").concat("/").concat(productId), EcommerceApi.json(builderBody), SingleProduct.class); + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/ProductBuilderBody.java b/src/main/java/com/mailerlite/sdk/ecommerce/ProductBuilderBody.java new file mode 100644 index 0000000..d486367 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/ProductBuilderBody.java @@ -0,0 +1,53 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.google.gson.annotations.SerializedName; +import java.util.ArrayList; + +/** + * The Class ProductBuilderBody. + */ +public class ProductBuilderBody { + + @SerializedName("name") + public String name; + + @SerializedName("resource_id") + public String resourceId; + + @SerializedName("price") + public Double price; + + @SerializedName("url") + public String url; + + @SerializedName("image") + public String image; + + @SerializedName("short_description") + public String shortDescription; + + @SerializedName("description") + public String description; + + @SerializedName("exclude_from_automations") + public Boolean excludeFromAutomations; + + @SerializedName("enabled") + public Boolean enabled; + + @SerializedName("type") + public String type; + + @SerializedName("categories") + public ArrayList categories; + + @SerializedName("variants") + public ArrayList variants; +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/ProductRetriever.java b/src/main/java/com/mailerlite/sdk/ecommerce/ProductRetriever.java new file mode 100644 index 0000000..e4677f2 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/ProductRetriever.java @@ -0,0 +1,78 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.mailerlite.sdk.MailerLite; +import com.mailerlite.sdk.exceptions.MailerLiteException; + +/** + * The Class ProductRetriever. + */ +public class ProductRetriever extends EcommerceRequest { + + private MailerLite apiObjectReference; + + private String shopId; + + public ProductRetriever(MailerLite apiRef, String shopId) + { + apiObjectReference = apiRef; + this.shopId = shopId; + } + + public ProductRetriever nameFilter(String value) + { + this.addQueryParameter("filter[name]", String.valueOf(value)); + return this; + } + + public ProductRetriever typeFilter(String value) + { + this.addQueryParameter("filter[type]", String.valueOf(value)); + return this; + } + + public ProductRetriever enabledFilter(boolean value) + { + this.addQueryParameter("filter[enabled]", String.valueOf(value)); + return this; + } + + public ProductRetriever categoryFilter(String value) + { + this.addQueryParameter("filter[category]", String.valueOf(value)); + return this; + } + + public ProductRetriever excludeFromAutomationsFilter(boolean value) + { + this.addQueryParameter("filter[exclude_from_automations]", String.valueOf(value)); + return this; + } + + public ProductRetriever sort(String value) + { + this.addQueryParameter("sort", String.valueOf(value)); + return this; + } + + public ProductsList get() throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).getRequest(EcommerceApi.shopPath(shopId, "/products").concat(this.getQueryParameters()), ProductsList.class); + } + + public SingleProduct getSingle(String productId) throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).getRequest(EcommerceApi.shopPath(shopId, "/products").concat("/").concat(productId), SingleProduct.class); + } + + @Override + protected ProductRetriever getInstance() { + return this; + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/ProductVariantBuilder.java b/src/main/java/com/mailerlite/sdk/ecommerce/ProductVariantBuilder.java new file mode 100644 index 0000000..1a127ae --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/ProductVariantBuilder.java @@ -0,0 +1,79 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.mailerlite.sdk.MailerLite; +import com.mailerlite.sdk.exceptions.MailerLiteException; + +/** + * The Class ProductVariantBuilder. + */ +public class ProductVariantBuilder { + + private MailerLite apiObjectReference; + + private String shopId; + + private String productId; + + private ProductVariantBuilderBody builderBody = new ProductVariantBuilderBody(); + + public ProductVariantBuilder(MailerLite apiRef, String shopId, String productId) + { + apiObjectReference = apiRef; + this.shopId = shopId; + this.productId = productId; + } + + public ProductVariantBuilderBody body() + { + return builderBody; + } + + public ProductVariantBuilder name(String name) + { + builderBody.name = name; + return this; + } + + public ProductVariantBuilder priceType(String priceType) + { + builderBody.priceType = priceType; + return this; + } + + public ProductVariantBuilder price(Double price) + { + builderBody.price = price; + return this; + } + + public ProductVariantBuilder resourceId(String resourceId) + { + builderBody.resourceId = resourceId; + return this; + } + + public ProductVariantBuilder imageUrl(String imageUrl) + { + builderBody.imageUrl = imageUrl; + return this; + } + + public ProductVariantBuilder attribute(String name, String value) + { + builderBody.attributes.put(name, value); + return this; + } + + public SingleProduct update(String variantId) throws MailerLiteException + { + String endpoint = EcommerceApi.shopPath(shopId, "/products/").concat(productId).concat("/variants/").concat(variantId); + return EcommerceApi.create(apiObjectReference).putRequest(endpoint, EcommerceApi.json(builderBody), SingleProduct.class); + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/ProductVariantBuilderBody.java b/src/main/java/com/mailerlite/sdk/ecommerce/ProductVariantBuilderBody.java new file mode 100644 index 0000000..3ecf47a --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/ProductVariantBuilderBody.java @@ -0,0 +1,35 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.google.gson.annotations.SerializedName; +import java.util.HashMap; + +/** + * The Class ProductVariantBuilderBody. + */ +public class ProductVariantBuilderBody { + + @SerializedName("name") + public String name; + + @SerializedName("attributes") + public HashMap attributes = new HashMap(); + + @SerializedName("price_type") + public String priceType; + + @SerializedName("price") + public Double price; + + @SerializedName("resource_id") + public String resourceId; + + @SerializedName("image_url") + public String imageUrl; +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/ProductVariantRetriever.java b/src/main/java/com/mailerlite/sdk/ecommerce/ProductVariantRetriever.java new file mode 100644 index 0000000..f097fd8 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/ProductVariantRetriever.java @@ -0,0 +1,40 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.mailerlite.sdk.MailerLite; +import com.mailerlite.sdk.exceptions.MailerLiteException; + +/** + * The Class ProductVariantRetriever. + */ +public class ProductVariantRetriever extends EcommerceRequest { + + private MailerLite apiObjectReference; + + private String shopId; + private String productId; + + public ProductVariantRetriever(MailerLite apiRef, String shopId, String productId) + { + apiObjectReference = apiRef; + this.shopId = shopId; + this.productId = productId; + } + + + public ProductVariantsList get() throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).getRequest(EcommerceApi.shopPath(shopId, "/products/").concat(productId).concat("/variants").concat(this.getQueryParameters()), ProductVariantsList.class); + } + + @Override + protected ProductVariantRetriever getInstance() { + return this; + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/ProductVariants.java b/src/main/java/com/mailerlite/sdk/ecommerce/ProductVariants.java new file mode 100644 index 0000000..f6a312c --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/ProductVariants.java @@ -0,0 +1,53 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.mailerlite.sdk.MailerLite; +import com.mailerlite.sdk.exceptions.MailerLiteException; +import java.util.List; + +/** + * The Class ProductVariants. + */ +public class ProductVariants { + + private MailerLite apiObjectReference; + + private String shopId; + + private String productId; + + public ProductVariants(MailerLite apiRef, String shopId, String productId) + { + apiObjectReference = apiRef; + this.shopId = shopId; + this.productId = productId; + } + + public ProductVariantRetriever retriever() + { + return new ProductVariantRetriever(apiObjectReference, shopId, productId); + } + + public ProductVariantBuilder builder() + { + return new ProductVariantBuilder(apiObjectReference, shopId, productId); + } + + public SingleProduct sync(List variants) throws MailerLiteException + { + String endpoint = EcommerceApi.shopPath(shopId, "/products/").concat(productId).concat("/variants"); + return EcommerceApi.create(apiObjectReference).postRequest(endpoint, EcommerceApi.json(variants), SingleProduct.class); + } + + public SingleProduct delete(String variantId) throws MailerLiteException + { + String endpoint = EcommerceApi.shopPath(shopId, "/products/").concat(productId).concat("/variants/").concat(variantId); + return EcommerceApi.create(apiObjectReference).deleteRequest(endpoint, SingleProduct.class); + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/ProductVariantsList.java b/src/main/java/com/mailerlite/sdk/ecommerce/ProductVariantsList.java new file mode 100644 index 0000000..f013844 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/ProductVariantsList.java @@ -0,0 +1,20 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.google.gson.annotations.SerializedName; +import com.mailerlite.sdk.util.PaginatedResponse; + +/** + * The Class ProductVariantsList. + */ +public class ProductVariantsList extends PaginatedResponse { + + @SerializedName("data") + public EcommerceProductVariant[] variants; +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/Products.java b/src/main/java/com/mailerlite/sdk/ecommerce/Products.java new file mode 100644 index 0000000..4363941 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/Products.java @@ -0,0 +1,68 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.mailerlite.sdk.MailerLite; +import com.mailerlite.sdk.MailerLiteResponse; +import com.mailerlite.sdk.exceptions.MailerLiteException; +import java.util.HashMap; + +/** + * The Class Products. + */ +public class Products { + + private MailerLite apiObjectReference; + + private String shopId; + + public Products(MailerLite apiRef, String shopId) + { + apiObjectReference = apiRef; + this.shopId = shopId; + } + + public ProductRetriever retriever() + { + return new ProductRetriever(apiObjectReference, shopId); + } + + public ProductBuilder builder() + { + return new ProductBuilder(apiObjectReference, shopId); + } + + public ProductVariants variants(String productId) + { + return new ProductVariants(apiObjectReference, shopId, productId); + } + + public SingleProduct changeStatus(String productId, boolean enabled) throws MailerLiteException + { + HashMap body = new HashMap(); + body.put("status", enabled); + + String endpoint = EcommerceApi.shopPath(shopId, "/products/").concat(productId).concat("/change-status"); + return EcommerceApi.create(apiObjectReference).putRequest(endpoint, EcommerceApi.json(body), SingleProduct.class); + } + + public SingleProduct assignCategories(String productId, String[] categoryIds, boolean replace) throws MailerLiteException + { + HashMap body = new HashMap(); + body.put("categories", categoryIds); + body.put("replace", replace); + + String endpoint = EcommerceApi.shopPath(shopId, "/products/").concat(productId).concat("/categories/multiple"); + return EcommerceApi.create(apiObjectReference).putRequest(endpoint, EcommerceApi.json(body), SingleProduct.class); + } + + public MailerLiteResponse delete(String productId) throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).deleteRequest(EcommerceApi.shopPath(shopId, "/products/").concat(productId), MailerLiteResponse.class); + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/ProductsList.java b/src/main/java/com/mailerlite/sdk/ecommerce/ProductsList.java new file mode 100644 index 0000000..6b44d90 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/ProductsList.java @@ -0,0 +1,32 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.google.gson.annotations.SerializedName; +import com.mailerlite.sdk.util.PaginatedResponse; + +/** + * The Class ProductsList. + */ +public class ProductsList extends PaginatedResponse { + + @SerializedName("data") + public EcommerceProduct[] products; + + @Override + public void postDeserialize() + { + if (products == null) { + return; + } + + for (EcommerceProduct item : products) { + item.parseDates(); + } + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/ShopBuilder.java b/src/main/java/com/mailerlite/sdk/ecommerce/ShopBuilder.java new file mode 100644 index 0000000..39b6bd0 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/ShopBuilder.java @@ -0,0 +1,89 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.mailerlite.sdk.MailerLite; +import com.mailerlite.sdk.exceptions.MailerLiteException; + +/** + * The Class ShopBuilder. + */ +public class ShopBuilder { + + private MailerLite apiObjectReference; + + private ShopBuilderBody builderBody = new ShopBuilderBody(); + + public ShopBuilder(MailerLite apiRef) + { + apiObjectReference = apiRef; + } + + public ShopBuilderBody body() + { + return builderBody; + } + + public ShopBuilder name(String name) + { + builderBody.name = name; + return this; + } + + public ShopBuilder url(String url) + { + builderBody.url = url; + return this; + } + + public ShopBuilder currency(String currency) + { + builderBody.currency = currency; + return this; + } + + public ShopBuilder platform(String platform) + { + builderBody.platform = platform; + return this; + } + + public ShopBuilder groupId(String groupId) + { + builderBody.groupId = groupId; + return this; + } + + public ShopBuilder enablePopups(Boolean enablePopups) + { + builderBody.enablePopups = enablePopups; + return this; + } + + public ShopBuilder enabled(Boolean enabled) + { + builderBody.enabled = enabled; + return this; + } + + public ShopBuilder accessData(String accessData) + { + builderBody.accessData = accessData; + return this; + } + + public SingleShop create() throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).postRequest("/ecommerce/shops", EcommerceApi.json(builderBody), SingleShop.class); + } + + public SingleShop update(String shopId) throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).putRequest("/ecommerce/shops".concat("/").concat(shopId), EcommerceApi.json(builderBody), SingleShop.class); + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/ShopBuilderBody.java b/src/main/java/com/mailerlite/sdk/ecommerce/ShopBuilderBody.java new file mode 100644 index 0000000..b106103 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/ShopBuilderBody.java @@ -0,0 +1,40 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.google.gson.annotations.SerializedName; + +/** + * The Class ShopBuilderBody. + */ +public class ShopBuilderBody { + + @SerializedName("name") + public String name; + + @SerializedName("url") + public String url; + + @SerializedName("currency") + public String currency; + + @SerializedName("platform") + public String platform; + + @SerializedName("group_id") + public String groupId; + + @SerializedName("enable_popups") + public Boolean enablePopups; + + @SerializedName("enabled") + public Boolean enabled; + + @SerializedName("access_data") + public String accessData; +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/ShopRetriever.java b/src/main/java/com/mailerlite/sdk/ecommerce/ShopRetriever.java new file mode 100644 index 0000000..8b5a9b3 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/ShopRetriever.java @@ -0,0 +1,40 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.mailerlite.sdk.MailerLite; +import com.mailerlite.sdk.exceptions.MailerLiteException; + +/** + * The Class ShopRetriever. + */ +public class ShopRetriever extends EcommerceRequest { + + private MailerLite apiObjectReference; + + public ShopRetriever(MailerLite apiRef) + { + apiObjectReference = apiRef; + } + + + public ShopsList get() throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).getRequest("/ecommerce/shops".concat(this.getQueryParameters()), ShopsList.class); + } + + public SingleShop getSingle(String shopId) throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).getRequest("/ecommerce/shops".concat("/").concat(shopId), SingleShop.class); + } + + @Override + protected ShopRetriever getInstance() { + return this; + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/Shops.java b/src/main/java/com/mailerlite/sdk/ecommerce/Shops.java new file mode 100644 index 0000000..62862ff --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/Shops.java @@ -0,0 +1,45 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.mailerlite.sdk.MailerLite; +import com.mailerlite.sdk.MailerLiteResponse; +import com.mailerlite.sdk.exceptions.MailerLiteException; + +/** + * The Class Shops. + */ +public class Shops { + + private MailerLite apiObjectReference; + + public Shops(MailerLite apiRef) + { + apiObjectReference = apiRef; + } + + public ShopRetriever retriever() + { + return new ShopRetriever(apiObjectReference); + } + + public ShopBuilder builder() + { + return new ShopBuilder(apiObjectReference); + } + + public EcommerceReportRetriever ecommerceReport(String shopId) + { + return new EcommerceReportRetriever(apiObjectReference, EcommerceApi.shopPath(shopId, "/reports/stats"), null); + } + + public MailerLiteResponse delete(String shopId) throws MailerLiteException + { + return EcommerceApi.create(apiObjectReference).deleteRequest(EcommerceApi.shopPath(shopId, ""), MailerLiteResponse.class); + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/ShopsList.java b/src/main/java/com/mailerlite/sdk/ecommerce/ShopsList.java new file mode 100644 index 0000000..15eefc5 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/ShopsList.java @@ -0,0 +1,32 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.google.gson.annotations.SerializedName; +import com.mailerlite.sdk.util.PaginatedResponse; + +/** + * The Class ShopsList. + */ +public class ShopsList extends PaginatedResponse { + + @SerializedName("data") + public EcommerceShop[] shops; + + @Override + public void postDeserialize() + { + if (shops == null) { + return; + } + + for (EcommerceShop item : shops) { + item.parseDates(); + } + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/SingleCart.java b/src/main/java/com/mailerlite/sdk/ecommerce/SingleCart.java new file mode 100644 index 0000000..0947263 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/SingleCart.java @@ -0,0 +1,28 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.google.gson.annotations.SerializedName; +import com.mailerlite.sdk.MailerLiteResponse; + +/** + * The Class SingleCart. + */ +public class SingleCart extends MailerLiteResponse { + + @SerializedName("data") + public EcommerceCart cart; + + @Override + public void postDeserialize() + { + if (cart != null) { + cart.parseDates(); + } + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/SingleCartItem.java b/src/main/java/com/mailerlite/sdk/ecommerce/SingleCartItem.java new file mode 100644 index 0000000..da23910 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/SingleCartItem.java @@ -0,0 +1,28 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.google.gson.annotations.SerializedName; +import com.mailerlite.sdk.MailerLiteResponse; + +/** + * The Class SingleCartItem. + */ +public class SingleCartItem extends MailerLiteResponse { + + @SerializedName("data") + public EcommerceCartItem item; + + @Override + public void postDeserialize() + { + if (item != null) { + item.parseDates(); + } + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/SingleCategory.java b/src/main/java/com/mailerlite/sdk/ecommerce/SingleCategory.java new file mode 100644 index 0000000..b74004e --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/SingleCategory.java @@ -0,0 +1,28 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.google.gson.annotations.SerializedName; +import com.mailerlite.sdk.MailerLiteResponse; + +/** + * The Class SingleCategory. + */ +public class SingleCategory extends MailerLiteResponse { + + @SerializedName("data") + public EcommerceCategory category; + + @Override + public void postDeserialize() + { + if (category != null) { + category.parseDates(); + } + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/SingleCustomer.java b/src/main/java/com/mailerlite/sdk/ecommerce/SingleCustomer.java new file mode 100644 index 0000000..90ab178 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/SingleCustomer.java @@ -0,0 +1,28 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.google.gson.annotations.SerializedName; +import com.mailerlite.sdk.MailerLiteResponse; + +/** + * The Class SingleCustomer. + */ +public class SingleCustomer extends MailerLiteResponse { + + @SerializedName("data") + public EcommerceCustomer customer; + + @Override + public void postDeserialize() + { + if (customer != null) { + customer.parseDates(); + } + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/SingleEcommerceReport.java b/src/main/java/com/mailerlite/sdk/ecommerce/SingleEcommerceReport.java new file mode 100644 index 0000000..73ea09a --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/SingleEcommerceReport.java @@ -0,0 +1,20 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.google.gson.annotations.SerializedName; +import com.mailerlite.sdk.MailerLiteResponse; + +/** + * The Class SingleEcommerceReport. + */ +public class SingleEcommerceReport extends MailerLiteResponse { + + @SerializedName("data") + public EcommerceReport report; +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/SingleEcommerceSettings.java b/src/main/java/com/mailerlite/sdk/ecommerce/SingleEcommerceSettings.java new file mode 100644 index 0000000..f617ebb --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/SingleEcommerceSettings.java @@ -0,0 +1,20 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.google.gson.annotations.SerializedName; +import com.mailerlite.sdk.MailerLiteResponse; + +/** + * The Class SingleEcommerceSettings. + */ +public class SingleEcommerceSettings extends MailerLiteResponse { + + @SerializedName("data") + public EcommerceSettings settings; +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/SingleOrder.java b/src/main/java/com/mailerlite/sdk/ecommerce/SingleOrder.java new file mode 100644 index 0000000..c4f5d77 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/SingleOrder.java @@ -0,0 +1,28 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.google.gson.annotations.SerializedName; +import com.mailerlite.sdk.MailerLiteResponse; + +/** + * The Class SingleOrder. + */ +public class SingleOrder extends MailerLiteResponse { + + @SerializedName("data") + public EcommerceOrder order; + + @Override + public void postDeserialize() + { + if (order != null) { + order.parseDates(); + } + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/SingleProduct.java b/src/main/java/com/mailerlite/sdk/ecommerce/SingleProduct.java new file mode 100644 index 0000000..4684897 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/SingleProduct.java @@ -0,0 +1,28 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.google.gson.annotations.SerializedName; +import com.mailerlite.sdk.MailerLiteResponse; + +/** + * The Class SingleProduct. + */ +public class SingleProduct extends MailerLiteResponse { + + @SerializedName("data") + public EcommerceProduct product; + + @Override + public void postDeserialize() + { + if (product != null) { + product.parseDates(); + } + } +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/SingleShop.java b/src/main/java/com/mailerlite/sdk/ecommerce/SingleShop.java new file mode 100644 index 0000000..b2484bf --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/SingleShop.java @@ -0,0 +1,28 @@ +/************************************************* + * MailerLite Java SDK + * https://github.com/mailerlite/mailerlite-java + * + * @author MailerLite + * https://mailerlite.com + **************************************************/ +package com.mailerlite.sdk.ecommerce; + +import com.google.gson.annotations.SerializedName; +import com.mailerlite.sdk.MailerLiteResponse; + +/** + * The Class SingleShop. + */ +public class SingleShop extends MailerLiteResponse { + + @SerializedName("data") + public EcommerceShop shop; + + @Override + public void postDeserialize() + { + if (shop != null) { + shop.parseDates(); + } + } +} diff --git a/src/main/java/com/mailerlite/sdk/susbcribers/Subscribers.java b/src/main/java/com/mailerlite/sdk/susbcribers/Subscribers.java index 7538e92..81d6145 100644 --- a/src/main/java/com/mailerlite/sdk/susbcribers/Subscribers.java +++ b/src/main/java/com/mailerlite/sdk/susbcribers/Subscribers.java @@ -10,6 +10,7 @@ import com.mailerlite.sdk.MailerLite; import com.mailerlite.sdk.MailerLiteApi; import com.mailerlite.sdk.MailerLiteResponse; +import com.mailerlite.sdk.ecommerce.EcommerceReportRetriever; import com.mailerlite.sdk.exceptions.MailerLiteException; /** @@ -78,6 +79,18 @@ public SubscriberImportsRetriever imports() { return new SubscriberImportsRetriever(apiObjectReference); } + + /** + * E-commerce revenue report of a subscriber. Takes a subscriber id, not an email. + * + * @param subscriberId the subscriber id + * @return the ecommerce report retriever + */ + public EcommerceReportRetriever ecommerceReport(String subscriberId) + { + String endpoint = "/subscribers/".concat(subscriberId); + return new EcommerceReportRetriever(apiObjectReference, endpoint.concat("/reports/ecommerce"), endpoint.concat("/reports/ecommerce/orders")); + } /** * Forgets a subscriber. The API deletes the subscriber data within 30 days. diff --git a/src/test/java/com/mailerlite/sdk/tests/EcommerceTest.java b/src/test/java/com/mailerlite/sdk/tests/EcommerceTest.java new file mode 100644 index 0000000..4c8c515 --- /dev/null +++ b/src/test/java/com/mailerlite/sdk/tests/EcommerceTest.java @@ -0,0 +1,263 @@ +package com.mailerlite.sdk.tests; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.io.ByteArrayOutputStream; +import java.net.http.HttpRequest; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.concurrent.Flow; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import com.google.gson.JsonParser; +import com.mailerlite.sdk.MailerLite; +import com.mailerlite.sdk.automations.reports.OrderActivityList; +import com.mailerlite.sdk.ecommerce.CartBuilder; +import com.mailerlite.sdk.ecommerce.CartItemBuilderBody; +import com.mailerlite.sdk.ecommerce.CategoryBuilderBody; +import com.mailerlite.sdk.ecommerce.CustomerBuilderBody; +import com.mailerlite.sdk.ecommerce.Ecommerce; +import com.mailerlite.sdk.ecommerce.EcommerceReportRetriever; +import com.mailerlite.sdk.ecommerce.OrderBuilderBody; +import com.mailerlite.sdk.ecommerce.ProductBuilderBody; +import com.mailerlite.sdk.ecommerce.ShopsList; +import com.mailerlite.sdk.ecommerce.SingleEcommerceReport; +import com.mailerlite.sdk.ecommerce.SingleOrder; +import com.mailerlite.sdk.ecommerce.ProductVariantBuilderBody; +import com.mailerlite.sdk.exceptions.MailerLiteException; +import com.mailerlite.sdk.util.MailerLiteHttpClientFactory; +import com.mailerlite.sdk.vcr.HttpClientVcr; +import com.mailerlite.sdk.vcr.HttpClientVcrResponse; +import com.mailerlite.sdk.vcr.VcrTape; + +public class EcommerceTest extends TestBase { + + private static final String API = "https://connect.mailerlite.com/api"; + + private static final String SHOP = API + "/ecommerce/shops/1"; + + private HttpRequest lastRequest; + + private String responseBody; + + private MailerLite ml; + + private Ecommerce ecommerce; + + interface ApiCall { + void run() throws MailerLiteException; + } + + @BeforeEach + public void setupEach() + { + responseBody = "{}"; + + VcrTape capturingTape = new VcrTape() { + @Override + public HttpClientVcrResponse getRecordedResponse(HttpRequest request) + { + lastRequest = request; + HttpClientVcrResponse response = new HttpClientVcrResponse(); + response.statusCode = 200; + response.body = responseBody; + response.headers = new HashMap>(); + return response; + } + }; + + HttpClientVcr client = new HttpClientVcr(); + client.setTape(capturingTape); + MailerLiteHttpClientFactory.getInstance().setClient(client); + + ml = this.getMailerLite(); + ecommerce = ml.ecommerce(); + } + + @AfterEach + public void afterEach() + { + MailerLiteHttpClientFactory.getInstance().setClient(null); + } + + private void assertRequest(ApiCall call, String method, String url, String body) throws MailerLiteException + { + call.run(); + + assertEquals(method, lastRequest.method()); + assertEquals(url, lastRequest.uri().toString()); + if (body != null) { + assertEquals(JsonParser.parseString(body), JsonParser.parseString(readBody(lastRequest))); + } + } + + private static String readBody(HttpRequest request) + { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + request.bodyPublisher().get().subscribe(new Flow.Subscriber() { + public void onSubscribe(Flow.Subscription subscription) { subscription.request(Long.MAX_VALUE); } + public void onNext(ByteBuffer item) { byte[] bytes = new byte[item.remaining()]; item.get(bytes); out.write(bytes, 0, bytes.length); } + public void onError(Throwable throwable) { } + public void onComplete() { } + }); + return new String(out.toByteArray(), StandardCharsets.UTF_8); + } + + @Test + public void TestShopsAndSettings() throws MailerLiteException + { + assertRequest(() -> ecommerce.shops().retriever().limit(10).get(), "GET", API + "/ecommerce/shops?limit=10", null); + assertRequest(() -> ecommerce.shops().retriever().getSingle("1"), "GET", SHOP, null); + assertRequest(() -> ecommerce.shops().builder().name("Shop").currency("EUR").create(), "POST", API + "/ecommerce/shops", "{\"name\":\"Shop\",\"currency\":\"EUR\"}"); + assertRequest(() -> ecommerce.shops().builder().name("New").update("1"), "PUT", SHOP, "{\"name\":\"New\"}"); + assertRequest(() -> ecommerce.shops().delete("1"), "DELETE", SHOP, null); + assertRequest(() -> ecommerce.shops().ecommerceReport("1").startDate("2026-10-01").endDate("2026-10-31").stats(), "GET", SHOP + "/reports/stats?start_date=2026-10-01&end_date=2026-10-31", null); + assertRequest(() -> ecommerce.getSettings(), "GET", API + "/ecommerce/settings", null); + } + + @Test + public void TestProductsAndVariants() throws MailerLiteException + { + assertRequest(() -> ecommerce.products("1").retriever().enabledFilter(true).sort("-name").get(), "GET", SHOP + "/products?filter%5Benabled%5D=true&sort=-name", null); + assertRequest(() -> ecommerce.products("1").retriever().getSingle("7"), "GET", SHOP + "/products/7", null); + assertRequest(() -> ecommerce.products("1").builder().name("Hat").price(19.99).categoryId("5").create(), "POST", SHOP + "/products", "{\"name\":\"Hat\",\"price\":19.99,\"categories\":[\"5\"]}"); + assertRequest(() -> ecommerce.products("1").builder().name("Cap").update("7"), "PUT", SHOP + "/products/7", "{\"name\":\"Cap\"}"); + assertRequest(() -> ecommerce.products("1").delete("7"), "DELETE", SHOP + "/products/7", null); + assertRequest(() -> ecommerce.products("1").changeStatus("7", false), "PUT", SHOP + "/products/7/change-status", "{\"status\":false}"); + assertRequest(() -> ecommerce.products("1").assignCategories("7", new String[] {"5"}, true), "PUT", SHOP + "/products/7/categories/multiple", "{\"categories\":[\"5\"],\"replace\":true}"); + + ProductVariantBuilderBody variant = new ProductVariantBuilderBody(); + variant.name = "Large"; + variant.attributes.put("size", "L"); + + assertRequest(() -> ecommerce.products("1").variants("7").retriever().get(), "GET", SHOP + "/products/7/variants", null); + assertRequest(() -> ecommerce.products("1").variants("7").sync(Arrays.asList(variant)), "POST", SHOP + "/products/7/variants", "[{\"name\":\"Large\",\"attributes\":{\"size\":\"L\"}}]"); + assertRequest(() -> ecommerce.products("1").variants("7").builder().name("Large").attribute("size", "L").update("3"), "PUT", SHOP + "/products/7/variants/3", "{\"name\":\"Large\",\"attributes\":{\"size\":\"L\"}}"); + assertRequest(() -> ecommerce.products("1").variants("7").delete("3"), "DELETE", SHOP + "/products/7/variants/3", null); + } + + @Test + public void TestCategories() throws MailerLiteException + { + assertRequest(() -> ecommerce.categories("1").retriever().get(), "GET", SHOP + "/categories", null); + assertRequest(() -> ecommerce.categories("1").retriever().getSingle("5"), "GET", SHOP + "/categories/5", null); + assertRequest(() -> ecommerce.categories("1").builder().name("Hats").create(), "POST", SHOP + "/categories", "{\"name\":\"Hats\"}"); + assertRequest(() -> ecommerce.categories("1").builder().name("Caps").update("5"), "PUT", SHOP + "/categories/5", "{\"name\":\"Caps\"}"); + assertRequest(() -> ecommerce.categories("1").delete("5"), "DELETE", SHOP + "/categories/5", null); + assertRequest(() -> ecommerce.categories("1").retriever().getProducts("5"), "GET", SHOP + "/categories/5/products", null); + assertRequest(() -> ecommerce.categories("1").assignProduct("5", "7"), "PUT", SHOP + "/categories/5/products/7", null); + assertRequest(() -> ecommerce.categories("1").unassignProduct("5", "7"), "DELETE", SHOP + "/categories/5/products/7", null); + } + + @Test + public void TestCustomersOrdersAndCarts() throws MailerLiteException + { + assertRequest(() -> ecommerce.customers("1").retriever().emailFilter("a@b.test").get(), "GET", SHOP + "/customers?filter%5Bemail%5D=a%40b.test", null); + assertRequest(() -> ecommerce.customers("1").retriever().getSingle("3"), "GET", SHOP + "/customers/3", null); + assertRequest(() -> ecommerce.customers("1").builder().email("a@b.test").create(), "POST", SHOP + "/customers", "{\"email\":\"a@b.test\"}"); + assertRequest(() -> ecommerce.customers("1").builder().name("Jane").update("3"), "PUT", SHOP + "/customers/3", "{\"name\":\"Jane\"}"); + assertRequest(() -> ecommerce.customers("1").delete("3"), "DELETE", SHOP + "/customers/3", null); + + assertRequest(() -> ecommerce.orders("1").retriever().attributedFilter(true).emailIdFilter("55").get(), "GET", SHOP + "/orders?filter%5Battributed%5D=true&filter%5Bemail_id%5D=55", null); + assertRequest(() -> ecommerce.orders("1").retriever().getSingle("9"), "GET", SHOP + "/orders/9", null); + CustomerBuilderBody customer = new CustomerBuilderBody(); + customer.email = "a@b.test"; + CartItemBuilderBody item = new CartItemBuilderBody(); + item.productId = "7"; + item.quantity = 1; + + assertRequest(() -> ecommerce.orders("1").builder().customer(customer).item(item).status("complete").create(), "POST", SHOP + "/orders", "{\"customer\":{\"email\":\"a@b.test\"},\"cart\":{\"items\":[{\"ecommerce_product_id\":\"7\",\"quantity\":1}]},\"status\":\"complete\"}"); + assertRequest(() -> ecommerce.orders("1").builder().customer(customer).item(item).status("complete").update("9"), "PUT", SHOP + "/orders/9", "{\"status\":\"complete\"}"); + assertRequest(() -> ecommerce.orders("1").delete("9"), "DELETE", SHOP + "/orders/9", null); + + assertRequest(() -> ecommerce.carts("1").retriever().get(), "GET", SHOP + "/carts", null); + assertRequest(() -> ecommerce.carts("1").retriever().getSingle("4"), "GET", SHOP + "/carts/4", null); + assertRequest(() -> { + CartBuilder cart = ecommerce.carts("1").builder().cartTotal(10.0); + cart.body().items = new ArrayList(Arrays.asList(item)); + cart.update("4"); + }, "PUT", SHOP + "/carts/4", "{\"cart_total\":10.0}"); + assertRequest(() -> ecommerce.carts("1").items("4").retriever().get(), "GET", SHOP + "/carts/4/items", null); + assertRequest(() -> ecommerce.carts("1").items("4").retriever().getSingle("8"), "GET", SHOP + "/carts/4/items/8", null); + assertRequest(() -> ecommerce.carts("1").items("4").builder().productId("7").create(), "POST", SHOP + "/carts/4/items", "{\"ecommerce_product_id\":\"7\"}"); + assertRequest(() -> ecommerce.carts("1").items("4").builder().quantity(2).update("8"), "PUT", SHOP + "/carts/4/items/8", "{\"quantity\":2}"); + assertRequest(() -> ecommerce.carts("1").items("4").delete("8"), "DELETE", SHOP + "/carts/4/items/8", null); + } + + @Test + public void TestImports() throws MailerLiteException + { + ProductBuilderBody product = new ProductBuilderBody(); + product.name = "Hat"; + CategoryBuilderBody category = new CategoryBuilderBody(); + category.name = "Hats"; + CustomerBuilderBody customer = new CustomerBuilderBody(); + customer.email = "a@b.test"; + + assertRequest(() -> ecommerce.imports("1").products(Arrays.asList(product)), "POST", SHOP + "/products/import", "[{\"name\":\"Hat\"}]"); + assertRequest(() -> ecommerce.imports("1").categories(Arrays.asList(category)), "POST", SHOP + "/categories/import", "[{\"name\":\"Hats\"}]"); + assertRequest(() -> ecommerce.imports("1").customers(Arrays.asList(customer)), "POST", SHOP + "/customers/import", "[{\"email\":\"a@b.test\"}]"); + + OrderBuilderBody order = new OrderBuilderBody(); + order.status = "complete"; + order.customer = customer; + + assertRequest(() -> ecommerce.imports("1").orders(Arrays.asList(order)), "POST", SHOP + "/orders/import", "{\"orders\":[{\"customer\":{\"email\":\"a@b.test\"},\"status\":\"complete\"}]}"); + } + + @Test + public void TestRevenueReports() throws MailerLiteException + { + assertRequest(() -> ml.campaigns().ecommerceReport("2").shopId("1").stats(), "GET", API + "/campaigns/2/reports/ecommerce?shop_id=1", null); + assertRequest(() -> ml.campaigns().ecommerceReport("2").shopId("1").page(2).orders(), "GET", API + "/campaigns/2/reports/ecommerce/orders?shop_id=1&page=2", null); + assertRequest(() -> ml.subscribers().ecommerceReport("6").shopId("1").stats(), "GET", API + "/subscribers/6/reports/ecommerce?shop_id=1", null); + assertRequest(() -> ml.subscribers().ecommerceReport("6").shopId("1").orders(), "GET", API + "/subscribers/6/reports/ecommerce/orders?shop_id=1", null); + assertRequest(() -> { + EcommerceReportRetriever report = ml.campaigns().ecommerceReport("2").shopId("1").limit(10); + report.removeQueryParameter("limit"); + report.stats(); + }, "GET", API + "/campaigns/2/reports/ecommerce?shop_id=1", null); + } + + @Test + public void TestReportsWithoutOrdersRejectOrders() + { + assertThrows(MailerLiteException.class, () -> ecommerce.shops().ecommerceReport("1").orders()); + } + + @Test + public void TestResponsesAreParsed() throws MailerLiteException + { + responseBody = "{\"data\":{\"ecommerce\":{\"orders_count\":4,\"revenue\":100.5,\"average_order_value\":25.125,\"conversion_rate\":\"2.5%\"},\"best_performing_email\":null}}"; + SingleEcommerceReport report = ml.campaigns().ecommerceReport("2").shopId("1").stats(); + assertEquals("2.5%", report.report.ecommerce.conversionRate); + assertEquals(4, report.report.ecommerce.ordersCount); + + responseBody = "{\"data\":[{\"subscriber\":{\"email\":\"a@b.test\",\"id\":\"6\"},\"total\":25.5,\"updated_at\":\"2026-10-01 10:00:00\",\"order\":\"Hat x1\"}]}"; + OrderActivityList orders = ml.campaigns().ecommerceReport("2").shopId("1").orders(); + assertEquals("a@b.test", orders.orders[0].subscriber.email); + assertNotNull(orders.orders[0].updatedAt); + + responseBody = "{\"data\":{\"id\":\"9\",\"total\":25.5,\"status\":\"complete\",\"created_at\":\"2026-10-01T10:00:00.000000Z\",\"updated_at\":\"2026-10-01 10:00:00\",\"cart\":{\"items\":[{\"quantity\":1,\"product\":{\"name\":\"Hat\",\"created_at\":\"2026-09-01 10:00:00\",\"categories\":[{\"name\":\"Hats\",\"created_at\":\"2026-08-01 10:00:00\"}]}}]}}}"; + SingleOrder order = ecommerce.orders("1").retriever().getSingle("9"); + assertEquals("complete", order.order.status); + assertNotNull(order.order.createdAt); + assertNotNull(order.order.updatedAt); + assertNotNull(order.order.cart.items[0].product.createdAt); + assertNotNull(order.order.cart.items[0].product.categories[0].createdAt); + + responseBody = "{\"data\":[{\"id\":\"1\",\"name\":\"Shop\",\"created_at\":\"2026-10-01 10:00:00\",\"group\":{\"id\":\"3\",\"created_at\":\"2026-10-01 10:00:00\"}}]}"; + ShopsList shops = ecommerce.shops().retriever().get(); + assertNotNull(shops.shops[0].createdAt); + assertNotNull(shops.shops[0].group.createdAt); + } +}