From 24d670ca956f431bbfa1908a7e727baa864a2aad Mon Sep 17 00:00:00 2001 From: Segun Olaiya Date: Wed, 28 Oct 2026 12:58:26 +0100 Subject: [PATCH 1/2] ECO-600: Ecommerce Objects --- README.md | 504 +++++++++++------- .../java/com/mailerlite/sdk/MailerLite.java | 13 + .../sdk/automations/Automations.java | 13 + .../mailerlite/sdk/campaigns/Campaigns.java | 6 + .../mailerlite/sdk/ecommerce/CartBuilder.java | 63 +++ .../sdk/ecommerce/CartBuilderBody.java | 32 ++ .../sdk/ecommerce/CartItemBuilder.java | 89 ++++ .../sdk/ecommerce/CartItemBuilderBody.java | 37 ++ .../sdk/ecommerce/CartItemRetriever.java | 45 ++ .../mailerlite/sdk/ecommerce/CartItems.java | 47 ++ .../sdk/ecommerce/CartItemsList.java | 20 + .../sdk/ecommerce/CartRetriever.java | 43 ++ .../com/mailerlite/sdk/ecommerce/Carts.java | 41 ++ .../mailerlite/sdk/ecommerce/CartsList.java | 20 + .../mailerlite/sdk/ecommerce/Categories.java | 55 ++ .../sdk/ecommerce/CategoriesList.java | 20 + .../sdk/ecommerce/CategoryBuilder.java | 62 +++ .../sdk/ecommerce/CategoryBuilderBody.java | 25 + .../sdk/ecommerce/CategoryRetriever.java | 54 ++ .../sdk/ecommerce/CustomerBuilder.java | 92 ++++ .../sdk/ecommerce/CustomerBuilderBody.java | 40 ++ .../sdk/ecommerce/CustomerRetriever.java | 54 ++ .../mailerlite/sdk/ecommerce/Customers.java | 43 ++ .../sdk/ecommerce/CustomersList.java | 20 + .../mailerlite/sdk/ecommerce/Ecommerce.java | 64 +++ .../sdk/ecommerce/EcommerceApi.java | 46 ++ .../sdk/ecommerce/EcommerceCart.java | 31 ++ .../sdk/ecommerce/EcommerceCartItem.java | 37 ++ .../sdk/ecommerce/EcommerceCategory.java | 12 + .../sdk/ecommerce/EcommerceCustomer.java | 38 ++ .../sdk/ecommerce/EcommerceOrder.java | 49 ++ .../ecommerce/EcommerceOrderAttribution.java | 22 + .../sdk/ecommerce/EcommerceProduct.java | 39 ++ .../ecommerce/EcommerceProductVariant.java | 38 ++ .../sdk/ecommerce/EcommerceReport.java | 26 + .../sdk/ecommerce/EcommerceReportOrder.java | 32 ++ .../ecommerce/EcommerceReportOrdersList.java | 20 + .../ecommerce/EcommerceReportRetriever.java | 94 ++++ .../sdk/ecommerce/EcommerceRequest.java | 49 ++ .../sdk/ecommerce/EcommerceSettings.java | 25 + .../sdk/ecommerce/EcommerceShop.java | 28 + .../sdk/ecommerce/EcommerceStats.java | 28 + .../com/mailerlite/sdk/ecommerce/Imports.java | 53 ++ .../sdk/ecommerce/OrderBuilder.java | 99 ++++ .../sdk/ecommerce/OrderBuilderBody.java | 40 ++ .../sdk/ecommerce/OrderRetriever.java | 72 +++ .../com/mailerlite/sdk/ecommerce/Orders.java | 43 ++ .../mailerlite/sdk/ecommerce/OrdersList.java | 20 + .../sdk/ecommerce/ProductBuilder.java | 123 +++++ .../sdk/ecommerce/ProductBuilderBody.java | 53 ++ .../sdk/ecommerce/ProductRetriever.java | 78 +++ .../sdk/ecommerce/ProductVariantBuilder.java | 79 +++ .../ecommerce/ProductVariantBuilderBody.java | 35 ++ .../ecommerce/ProductVariantRetriever.java | 40 ++ .../sdk/ecommerce/ProductVariants.java | 54 ++ .../sdk/ecommerce/ProductVariantsList.java | 20 + .../mailerlite/sdk/ecommerce/Products.java | 68 +++ .../sdk/ecommerce/ProductsList.java | 20 + .../mailerlite/sdk/ecommerce/ShopBuilder.java | 89 ++++ .../sdk/ecommerce/ShopBuilderBody.java | 40 ++ .../sdk/ecommerce/ShopRetriever.java | 40 ++ .../com/mailerlite/sdk/ecommerce/Shops.java | 45 ++ .../mailerlite/sdk/ecommerce/ShopsList.java | 20 + .../mailerlite/sdk/ecommerce/SingleCart.java | 20 + .../sdk/ecommerce/SingleCartItem.java | 20 + .../sdk/ecommerce/SingleCategory.java | 20 + .../sdk/ecommerce/SingleCustomer.java | 20 + .../sdk/ecommerce/SingleEcommerceReport.java | 20 + .../ecommerce/SingleEcommerceSettings.java | 20 + .../mailerlite/sdk/ecommerce/SingleOrder.java | 20 + .../sdk/ecommerce/SingleProduct.java | 20 + .../mailerlite/sdk/ecommerce/SingleShop.java | 20 + .../sdk/susbcribers/Subscribers.java | 7 + .../mailerlite/sdk/tests/EcommerceTest.java | 189 +++++++ 74 files changed, 3425 insertions(+), 198 deletions(-) create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/CartBuilder.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/CartBuilderBody.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/CartItemBuilder.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/CartItemBuilderBody.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/CartItemRetriever.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/CartItems.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/CartItemsList.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/CartRetriever.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/Carts.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/CartsList.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/Categories.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/CategoriesList.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/CategoryBuilder.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/CategoryBuilderBody.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/CategoryRetriever.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/CustomerBuilder.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/CustomerBuilderBody.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/CustomerRetriever.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/Customers.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/CustomersList.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/Ecommerce.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/EcommerceApi.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/EcommerceCart.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/EcommerceCartItem.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/EcommerceCustomer.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/EcommerceOrder.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/EcommerceOrderAttribution.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/EcommerceProductVariant.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/EcommerceReport.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/EcommerceReportOrder.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/EcommerceReportOrdersList.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/EcommerceReportRetriever.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/EcommerceRequest.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/EcommerceSettings.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/EcommerceStats.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/Imports.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/OrderBuilder.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/OrderBuilderBody.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/OrderRetriever.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/Orders.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/OrdersList.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/ProductBuilder.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/ProductBuilderBody.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/ProductRetriever.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/ProductVariantBuilder.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/ProductVariantBuilderBody.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/ProductVariantRetriever.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/ProductVariants.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/ProductVariantsList.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/Products.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/ProductsList.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/ShopBuilder.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/ShopBuilderBody.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/ShopRetriever.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/Shops.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/ShopsList.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/SingleCart.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/SingleCartItem.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/SingleCategory.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/SingleCustomer.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/SingleEcommerceReport.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/SingleEcommerceSettings.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/SingleOrder.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/SingleProduct.java create mode 100644 src/main/java/com/mailerlite/sdk/ecommerce/SingleShop.java create mode 100644 src/test/java/com/mailerlite/sdk/tests/EcommerceTest.java diff --git a/README.md b/README.md index c3d2123..c7628d5 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 @@ -84,7 +91,7 @@ Start using the sdk by creating an instance of the `MailerLite` object and passi { MailerLite ml = new MailerLite(); ml.setToken("Your API token"); - + return ml; } ``` @@ -101,19 +108,19 @@ class Example { public void example() { try { - + SubscribersList subscribers = this.getMailerLite().subscribers().retriever().filter("status", "active").get(); - + for (Subscriber s : subscribers.subscribers) { - + System.out.println(s.id); System.out.println(s.email); System.out.println(s.createdAt.toString()); } - - + + } catch (MailerLiteException e) { - + e.printStackTrace(); } } @@ -130,13 +137,13 @@ class Example { public void example() { try { - + Subscriber subscriber = this.getMailerLite().subscribers().retriever().getSingle("subscriber id").subscriber; - + System.out.println(subscriber.email); - + } catch (MailerLiteException e) { - + e.printStackTrace(); } } @@ -153,13 +160,13 @@ class Example { public void example() { try { - + SubscriberCount count = this.getMailerLite().subscribers().retriever().filter("status", "active").count(); - + System.out.println(count.count); - + } catch (MailerLiteException e) { - + e.printStackTrace(); } } @@ -176,17 +183,17 @@ class Example { public void example() { try { - + Subscriber subscriber = this.getMailerLite().subscribers().builder().email("test+email@mailerlite.com") .addField("name", "test name") .create() .subscriber; - + System.out.println(subscriber.email); System.out.println(subscriber.fields.get("name")); - + } catch (MailerLiteException e) { - + e.printStackTrace(); } } @@ -203,19 +210,19 @@ class Example { public void example() { try { - + SubscribersList subscribers = this.getMailerLite().subscribers().retriever().filter("status", "active").get(); - + Subscriber subscriber = this.getMailerLite().subscribers().builder() .addField("name", "test name2") .update(subscribers.subscribers[0].id) .subscriber; - + System.out.println(subscriber.email); System.out.println(subscriber.fields.get("name")); - + } catch (MailerLiteException e) { - + e.printStackTrace(); } } @@ -234,17 +241,17 @@ class Example { public void example() { try { - + GroupsList groups = this.getMailerLite().groups().retriever().get(); - + for (Group g : groups.groups) { - + System.out.println(g.id); System.out.println(g.name); } - + } catch (MailerLiteException e) { - + e.printStackTrace(); } } @@ -261,14 +268,14 @@ class Example { public void example() { try { - + SingleGroup group = this.getMailerLite().groups().builder().create("new group name"); - + System.out.println(group.group.id); System.out.println(group.group.name); - + } catch (MailerLiteException e) { - + e.printStackTrace(); } } @@ -285,16 +292,16 @@ class Example { public void example() { try { - + GroupsList groups = this.getMailerLite().groups().retriever().get(); - + SingleGroup group = this.getMailerLite().groups().builder().update(groups.groups[0].id, "updated group name"); - + System.out.println(group.group.id); System.out.println(group.group.name); - + } catch (MailerLiteException e) { - + e.printStackTrace(); } } @@ -311,15 +318,15 @@ class Example { public void example() { try { - + GroupsList groups = this.getMailerLite().groups().retriever().get(); - + MailerLiteResponse deleteResponse = this.getMailerLite().groups().delete(groups.groups[0].id); - + System.out.println(deleteResponse.responseStatusCode); - + } catch (MailerLiteException e) { - + e.printStackTrace(); } } @@ -336,17 +343,17 @@ class Example { public void example() { try { - + GroupsList groups = this.getMailerLite().groups().retriever().get(); - + GroupSubscribersList subscribers = this.getMailerLite().groups().subscribers(groups.groups[0].id).get(); - + for (Subscriber subscriber : subscribers.subscribers) { System.out.println(subscriber.email); } - + } catch (MailerLiteException e) { - + e.printStackTrace(); } } @@ -363,16 +370,16 @@ class Example { public void example() { try { - + GroupsList groups = this.getMailerLite().groups().retriever().get(); SubscribersList subscribers = this.getMailerLite().subscribers().retriever().filter("status", "active").get(); - + SingleGroup group = this.getMailerLite().groups().subscribers(groups.groups[0].id).assign(subscribers.subscribers[0].id); - + System.out.println(group.group.name); - + } catch (MailerLiteException e) { - + e.printStackTrace(); } } @@ -389,16 +396,16 @@ class Example { public void example() { try { - + GroupsList groups = this.getMailerLite().groups().retriever().get(); GroupSubscribersList subscribers = this.getMailerLite().groups().subscribers(groups.groups[0].id).get(); - + MailerLiteResponse response = this.getMailerLite().groups().subscribers(groups.groups[0].id).unassign(subscribers.subscribers[0].id); - + System.out.println(response.responseStatusCode); - + } catch (MailerLiteException e) { - + e.printStackTrace(); } } @@ -417,17 +424,17 @@ class Example { public void example() { try { - + SegmentsList segments = this.getMailerLite().segments().retriever().get(); - + for (Segment s : segments.segments) { - + System.out.println(s.id); System.out.println(s.name); } - + } catch (MailerLiteException e) { - + e.printStackTrace(); } } @@ -444,15 +451,15 @@ class Example { public void example() { try { - + SegmentsList segments = this.getMailerLite().segments().retriever().get(); - + SingleSegment segment = this.getMailerLite().segments().update(segments.segments[0].id, "New segment name"); - + System.out.println(segment.segment.name); - + } catch (MailerLiteException e) { - + e.printStackTrace(); } } @@ -469,15 +476,15 @@ class Example { public void example() { try { - + SegmentsList segments = this.getMailerLite().segments().retriever().get(); - + MailerLiteResponse response = this.getMailerLite().segments().delete(segments.segments[0].id); - + System.out.println(response.responseStatusCode); - + } catch (MailerLiteException e) { - + e.printStackTrace(); } } @@ -494,18 +501,18 @@ class Example { public void example() { try { - + SegmentsList segments = this.getMailerLite().segments().retriever().get(); - + SegmentSubscribersList list = this.getMailerLite().segments().subscribers(segments.segments[0].id).get(); - + for (Subscriber s : list.subscribers) { - + System.out.println(s.email); } - + } catch (MailerLiteException e) { - + e.printStackTrace(); } } @@ -524,17 +531,17 @@ class Example { public void example() { try { - + FieldList fields = this.getMailerLite().fields().retriever().get(); - + for (Field f : fields.fields) { - + System.out.println(f.id); System.out.println(f.name); } - + } catch (MailerLiteException e) { - + e.printStackTrace(); } } @@ -551,14 +558,14 @@ class Example { public void example() { try { - + SingleField field = this.getMailerLite().fields().builder().create("test field", "text"); - + System.out.println(field.field.id); System.out.println(field.field.name); - + } catch (MailerLiteException e) { - + e.printStackTrace(); } } @@ -575,12 +582,12 @@ class Example { public void example() { try { - + SingleField field = this.getMailerLite().fields().builder().update("field id", "new field name"); - + System.out.println(field.field.id); System.out.println(field.field.name); - + } catch (MailerLiteException e) { e.printStackTrace(); } @@ -598,13 +605,13 @@ class Example { public void example() { try { - + MailerLiteResponse response = this.getMailerLite().fields().delete("field id"); - + System.out.println(response.responseStatusCode); - + } catch (MailerLiteException e) { - + e.printStackTrace(); } } @@ -623,20 +630,20 @@ class Example { public void example() { try { - + List automations = this.getMailerLite().automations().retriever().get(); - + for (Automation automation : automations) { System.out.println(automation.id); - + for (Object trigger : automation.triggers) { - + System.out.println(trigger.getClass()); } } - + } catch (MailerLiteException e) { - + e.printStackTrace(); } } @@ -653,24 +660,24 @@ class Example { public void example() { try { - + List automations = this.getMailerLite().automations().retriever().get(); - + Automation automation = this.getMailerLite().automations().retriever().getSingle(automations.get(0).id); - + System.out.println(automation.id); for (Object trigger : automation.triggers) { - + System.out.println(trigger.getClass()); } - + for (Object step : automation.steps) { - + System.out.println(step.getClass()); } - + } catch (MailerLiteException e) { - + e.printStackTrace(); } } @@ -687,22 +694,22 @@ class Example { public void example() { try { - + List automations = this.getMailerLite().automations().retriever().get(); - + List activity = this.getMailerLite() .automations() .subscriberActivityRetriever() .filter("status", "completed") .get(automations.get(0).id); - + for (SubscriberActivity act : activity) { System.out.println(act.id); System.out.println(act.status); } - + } catch (MailerLiteException e) { - + e.printStackTrace(); } } @@ -721,17 +728,17 @@ class Example { public void example() { try { - + CampaignsList campaigns = this.getMailerLite().campaigns().retriever().filter("status", "sent").get(); - + for (Campaign c : campaigns.campaigns) { - + System.out.println(c.id); System.out.println(c.createdAt.toString()); } - + } catch (MailerLiteException e) { - + e.printStackTrace(); } } @@ -748,15 +755,15 @@ class Example { public void example() { try { - + CampaignsList campaigns = this.getMailerLite().campaigns().retriever().filter("status", "sent").get(); - + Campaign campaign = this.getMailerLite().campaigns().retriever().getSingle(campaigns.campaigns[0].id).campaign; - + System.out.println(campaign.id); - + } catch (MailerLiteException e) { - + e.printStackTrace(); } } @@ -777,19 +784,19 @@ class Example { email.from = "from email"; email.fromName = "test from name"; email.subject = "test email subject"; - + try { - + SingleCampaign newCampaign = this.getMailerLite().campaigns().builder() .name("test campaign name") .email(email) .type("regular") .create(); - + System.out.println(newCampaign.campaign.id); - + } catch (MailerLiteException e) { - + e.printStackTrace(); } } @@ -806,7 +813,7 @@ class Example { public void example() { try { - + EmailBase email = new EmailBase(); email.content = "
Test email content
"; email.from = "from email"; @@ -821,13 +828,13 @@ class Example { .type("regular") .groupId("group id") .create(); - + SingleCampaign updatedCampaign = this.getMailerLite().campaigns().builder() .name("Updated campaign name") .email(email) .type("regular") .update(newCampaign.campaign.id); - + System.out.println(updatedCampaign.name); } catch (MailerLiteException e) { @@ -847,7 +854,7 @@ class Example { public void example() { try { - + SingleCampaign newCampaign = = this.getMailerLite() .campaigns() .builder() @@ -856,18 +863,18 @@ class Example { .type("regular") .groupId("group id") .create(); - + CampaignScheduler scheduler = this.getMailerLite().campaigns().scheduler(); - + scheduler.scheduleSettings() .date("2023-03-01") .hours("09:00") .minutes("00:00"); - + SingleCampaign campaign = scheduler .delivery(CampaignDelivery.SCHEDULED) .schedule(newCampaign.campaign.id); - + } catch (MailerLiteException e) { e.printStackTrace(); } @@ -885,7 +892,7 @@ class Example { public void example() { try { - + SingleCampaign newCampaign = this.getMailerLite() .campaigns() .builder() @@ -894,20 +901,20 @@ class Example { .type("regular") .groupId("group id") .create(); - + CampaignScheduler scheduler = this.getMailerLite().campaigns().scheduler(); - + scheduler.scheduleSettings() .date("2023-03-01") .hours("09") .minutes("00"); - + SingleCampaign campaign = scheduler .delivery(CampaignDelivery.SCHEDULED) .schedule(newCampaign.campaign.id); - + SingleCampaign canceledCampaign = this.getMailerLite().campaigns().scheduler().cancel(campaign.campaign.id); - + } catch (MailerLiteException e) { e.printStackTrace(); } @@ -925,12 +932,12 @@ class Example { public void example() { try { - + SingleCampaign newCampaign = this.createCampaign("Campaign to delete"); - - + + MailerLiteResponse response = this.getMailerLite().campaigns().delete(newCampaign.campaign.id); - + } catch (MailerLiteException e) { e.printStackTrace(); } @@ -948,11 +955,11 @@ class Example { public void example() { try { - + CampaignsList campaigns = this.getMailerLite().campaigns().retriever().filter("status", "sent").get(); - + CampaignSubscriberActivityList activity = this.getMailerLite().campaigns().subscriberActivity().get(campaigns.campaigns[0].id); - + } catch (MailerLiteException e) { e.printStackTrace(); } @@ -972,17 +979,17 @@ class Example { public void example() { try { - + FormsList forms = this.getMailerLite().forms().retriever().get("embedded"); - + for (Form f : forms.forms) { - + System.out.println(f.id); System.out.println(f.name); } - + } catch (MailerLiteException e) { - + e.printStackTrace(); } } @@ -999,17 +1006,17 @@ class Example { public void example() { try { - + FormsList forms = this.getMailerLite().forms().retriever().get("embedded"); - + SingleForm f = this.getMailerLite().forms().retriever().getSingle(forms.forms[0].id); - + System.out.println(f.form.id); System.out.println(f.form.name); - - + + } catch (MailerLiteException e) { - + e.printStackTrace(); } } @@ -1026,14 +1033,14 @@ class Example { public void example() { try { - + FormsList forms = this.getMailerLite().forms().retriever().get("embedded"); - + SingleForm form = this.getMailerLite().forms().update(forms.forms[0].id, "new form name"); - + System.out.println(form.form.id); System.out.println(form.form.name); - + } catch (MailerLiteException e) { e.printStackTrace(); } @@ -1051,15 +1058,15 @@ class Example { public void example() { try { - + FormsList forms = this.getMailerLite().forms().retriever().get("embedded"); - + MailerLiteResponse response = this.getMailerLite().forms().delete(forms.forms[0].id); - + System.out.println(response.responseStatusCode); - + } catch (MailerLiteException e) { - + e.printStackTrace(); } } @@ -1076,18 +1083,18 @@ class Example { public void example() { try { - + FormsList forms = this.getMailerLite().forms().retriever().get("embedded"); - + SubscribersList list = this.getMailerLite().forms().subscribers().get(forms.forms[0].id); - + for (Subscriber sub : list.subscribers) { System.out.println(sub.id); System.out.println(sub.email); } - + } catch (MailerLiteException e) { - + e.printStackTrace(); } } @@ -1106,18 +1113,18 @@ class Example { public void example() { try { - + WebhooksList webhooks = this.getMailerLite().webhooks().retriever().get(); - + for (Webhook w : webhooks.webhooks) { - + System.out.println(w.id); System.out.println(w.name); System.out.println(w.url); } - + } catch (MailerLiteException e) { - + e.printStackTrace(); } } @@ -1134,17 +1141,17 @@ class Example { public void example() { try { - + WebhooksList webhooks = this.getMailerLite().webhooks().retriever().get(); - + SingleWebhook webhook = this.getMailerLite().webhooks().retriever().getSingle(webhooks.webhooks[0].id); - + System.out.println(webhook.webhook.id); System.out.println(webhook.webhook.name); System.out.println(webhook.webhook.url); - + } catch (MailerLiteException e) { - + e.printStackTrace(); } } @@ -1161,7 +1168,7 @@ class Example { public void example() { try { - + SingleWebhook webhook = this.getMailerLite() .webhooks() .builder() @@ -1170,13 +1177,13 @@ class Example { .url("https://example.com") .enabled(true) .create(); - + System.out.println(webhook.webhook.id); System.out.println(webhook.webhook.name); System.out.println(webhook.webhook.url); - + } catch (MailerLiteException e) { - + e.printStackTrace(); } } @@ -1193,17 +1200,17 @@ class Example { public void example() { try { - + WebhooksList webhooks = this.getMailerLite().webhooks().retriever().get(); - + SingleWebhook webhook = this.getMailerLite().webhooks().builder().enabled(false).update(webhooks.webhooks[0].id); - + System.out.println(webhook.webhook.id); System.out.println(webhook.webhook.name); System.out.println(webhook.webhook.enabled); - + } catch (MailerLiteException e) { - + e.printStackTrace(); } } @@ -1220,21 +1227,122 @@ class Example { public void example() { try { - + WebhooksList webhooks = this.getMailerLite().webhooks().retriever().get(); - + MailerLiteResponse deleteResponse = this.getMailerLite().webhooks().delete(webhooks.webhooks[0].id); - + System.out.println(deleteResponse.responseStatusCode); } catch (MailerLiteException e) { - + e.printStackTrace(); } } } ``` +## 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(); +EcommerceReportOrdersList campaignOrders = ml.campaigns().ecommerceReport("campaignId").shopId("shopId").orders(); + +SingleEcommerceReport subscriberStats = ml.subscribers().ecommerceReport("subscriberId").shopId("shopId").stats(); + +SingleEcommerceReport automationStats = ml.automations().ecommerceReport("automationId").stats(); +EcommerceReportOrdersList automationOrders = ml.automations().ecommerceReport("automationId").timeFrame("all_time").orders(); +SingleEcommerceReport emailStats = ml.automations().ecommerceEmailReport("automationId", "emailId").stats(); + +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/automations/Automations.java b/src/main/java/com/mailerlite/sdk/automations/Automations.java index 5d09a5c..a1f9766 100644 --- a/src/main/java/com/mailerlite/sdk/automations/Automations.java +++ b/src/main/java/com/mailerlite/sdk/automations/Automations.java @@ -8,6 +8,7 @@ package com.mailerlite.sdk.automations; import com.mailerlite.sdk.MailerLite; +import com.mailerlite.sdk.ecommerce.EcommerceReportRetriever; import com.mailerlite.sdk.automations.activity.AutomationSubscriberActivityRetriever; /** @@ -47,4 +48,16 @@ public AutomationSubscriberActivityRetriever subscriberActivityRetriever() { return new AutomationSubscriberActivityRetriever(apiObjectReference); } + + public EcommerceReportRetriever ecommerceReport(String automationId) + { + String endpoint = "/automations/".concat(automationId); + return new EcommerceReportRetriever(apiObjectReference, endpoint.concat("/monthly-totals/ecommerce"), endpoint.concat("/order-activity"), "ecommerce_shop_id"); + } + + public EcommerceReportRetriever ecommerceEmailReport(String automationId, String emailId) + { + String endpoint = "/automations/".concat(automationId).concat("/emails/").concat(emailId).concat("/ecommerce-overview-stats"); + return new EcommerceReportRetriever(apiObjectReference, endpoint, null, null); + } } diff --git a/src/main/java/com/mailerlite/sdk/campaigns/Campaigns.java b/src/main/java/com/mailerlite/sdk/campaigns/Campaigns.java index f022049..bc49a3a 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,9 @@ public MailerLiteResponse delete(String campaignId) throws MailerLiteException return response; } + public EcommerceReportRetriever ecommerceReport(String campaignId) + { + String endpoint = "/campaigns/".concat(campaignId); + return new EcommerceReportRetriever(apiObjectReference, endpoint.concat("/reports/ecommerce"), endpoint.concat("/reports/ecommerce/orders"), "shop_id"); + } } 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..9624634 --- /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.json(builderBody), 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..026a004 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/CartItemsList.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 CartItemsList. + */ +public class CartItemsList extends PaginatedResponse { + + @SerializedName("data") + public EcommerceCartItem[] items; +} 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..5a20af0 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/CartsList.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 CartsList. + */ +public class CartsList extends PaginatedResponse { + + @SerializedName("data") + public EcommerceCart[] carts; +} 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..7144f89 --- /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 MailerLiteResponse 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, "{}", MailerLiteResponse.class); + } + + public MailerLiteResponse 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, MailerLiteResponse.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..a2aa978 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/CategoriesList.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 CategoriesList. + */ +public class CategoriesList extends PaginatedResponse { + + @SerializedName("data") + public EcommerceCategory[] categories; +} 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..9a5e65d --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/CustomersList.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 CustomersList. + */ +public class CustomersList extends PaginatedResponse { + + @SerializedName("data") + public EcommerceCustomer[] customers; +} 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..d4f4a4f --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceApi.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.Gson; +import com.google.gson.GsonBuilder; +import com.mailerlite.sdk.MailerLite; +import com.mailerlite.sdk.MailerLiteApi; +import com.mailerlite.sdk.util.JsonSerializationDeserializationStrategy; + +/** + * 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) + { + Gson gson = new GsonBuilder() + .addSerializationExclusionStrategy(new JsonSerializationDeserializationStrategy(false)) + .addDeserializationExclusionStrategy(new JsonSerializationDeserializationStrategy(true)) + .create(); + + return gson.toJson(body); + } + + 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..c714295 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceCart.java @@ -0,0 +1,31 @@ +/************************************************* + * 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 EcommerceCart. + */ +public class EcommerceCart { + + @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; +} 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..1cfaaf1 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceCartItem.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 EcommerceCartItem. + */ +public class EcommerceCartItem { + + @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; +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceCategory.java b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceCategory.java index f350a03..35526d0 100644 --- a/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceCategory.java +++ b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceCategory.java @@ -21,4 +21,16 @@ 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 createdAt; + + @SerializedName("updated_at") + public String 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..fb60205 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceCustomer.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.annotations.SerializedName; +import com.mailerlite.sdk.susbcribers.Subscriber; + +/** + * The Class EcommerceCustomer. + */ +public class EcommerceCustomer { + + @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; +} 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..0fc8a40 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceOrder.java @@ -0,0 +1,49 @@ +/************************************************* + * 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 EcommerceOrder. + */ +public class EcommerceOrder { + + @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 createdAt; + + @SerializedName("updated_at") + public String updatedAt; + + @SerializedName("completed_at") + public String completedAt; + + @SerializedName("attribution") + public EcommerceOrderAttribution attribution; +} 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..95c5a0c 100644 --- a/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceProduct.java +++ b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceProduct.java @@ -21,4 +21,43 @@ 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 createdAt; } 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/EcommerceReportOrder.java b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceReportOrder.java new file mode 100644 index 0000000..d9f732a --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceReportOrder.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.JsonElement; +import com.google.gson.annotations.SerializedName; + +/** + * The Class EcommerceReportOrder. + */ +public class EcommerceReportOrder { + + @SerializedName("subscriber") + public JsonElement subscriber; + + @SerializedName("total") + public Double total; + + @SerializedName("order") + public String order; + + @SerializedName("email") + public JsonElement email; + + @SerializedName("updated_at") + public String updatedAt; +} diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceReportOrdersList.java b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceReportOrdersList.java new file mode 100644 index 0000000..40e0405 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceReportOrdersList.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 EcommerceReportOrdersList. + */ +public class EcommerceReportOrdersList extends PaginatedResponse { + + @SerializedName("data") + public EcommerceReportOrder[] orders; +} 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..20358a1 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceReportRetriever.java @@ -0,0 +1,94 @@ +/************************************************* + * 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 EcommerceReportRetriever. + */ +public class EcommerceReportRetriever extends EcommerceRequest { + + private MailerLite apiObjectReference; + + private String statsEndpoint; + + private String ordersEndpoint; + + private String ordersShopParameter; + + private String shopId; + + public EcommerceReportRetriever(MailerLite apiRef, String statsEndpoint, String ordersEndpoint, String ordersShopParameter) + { + apiObjectReference = apiRef; + this.statsEndpoint = statsEndpoint; + this.ordersEndpoint = ordersEndpoint; + this.ordersShopParameter = ordersShopParameter; + } + + public EcommerceReportRetriever shopId(String shopId) + { + this.shopId = 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 + { + if (shopId != null) { + this.addQueryParameter("shop_id", shopId); + } + + return EcommerceApi.create(apiObjectReference).getRequest(statsEndpoint.concat(this.getQueryParameters()), SingleEcommerceReport.class); + } + + public EcommerceReportOrdersList orders() throws MailerLiteException + { + if (shopId != null) { + this.addQueryParameter(ordersShopParameter, shopId); + } + + return EcommerceApi.create(apiObjectReference).getRequest(ordersEndpoint.concat(this.getQueryParameters()), EcommerceReportOrdersList.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..15939e7 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceRequest.java @@ -0,0 +1,49 @@ +/************************************************* + * 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 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..5fb464f 100644 --- a/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceShop.java +++ b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceShop.java @@ -8,6 +8,7 @@ package com.mailerlite.sdk.ecommerce; import com.google.gson.annotations.SerializedName; +import com.mailerlite.sdk.groups.Group; /** * The Class EcommerceShop. @@ -25,4 +26,31 @@ 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 createdAt; + + @SerializedName("updated_at") + public String updatedAt; } 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..f89a279 --- /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 Double 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..d49915a --- /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.json(builderBody), 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..1485acc --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/OrdersList.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 OrdersList. + */ +public class OrdersList extends PaginatedResponse { + + @SerializedName("data") + public EcommerceOrder[] orders; +} 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..ffb86e2 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/ProductVariants.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.MailerLiteResponse; +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 MailerLiteResponse delete(String variantId) throws MailerLiteException + { + String endpoint = EcommerceApi.shopPath(shopId, "/products/").concat(productId).concat("/variants/").concat(variantId); + return EcommerceApi.create(apiObjectReference).deleteRequest(endpoint, MailerLiteResponse.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..7eac030 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/ProductsList.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 ProductsList. + */ +public class ProductsList extends PaginatedResponse { + + @SerializedName("data") + public EcommerceProduct[] products; +} 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..91bcddf --- /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, 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..4760974 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/ShopsList.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 ShopsList. + */ +public class ShopsList extends PaginatedResponse { + + @SerializedName("data") + public EcommerceShop[] shops; +} 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..af665a7 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/SingleCart.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 SingleCart. + */ +public class SingleCart extends MailerLiteResponse { + + @SerializedName("data") + public EcommerceCart cart; +} 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..c9de3bb --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/SingleCartItem.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 SingleCartItem. + */ +public class SingleCartItem extends MailerLiteResponse { + + @SerializedName("data") + public EcommerceCartItem item; +} 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..2237e50 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/SingleCategory.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 SingleCategory. + */ +public class SingleCategory extends MailerLiteResponse { + + @SerializedName("data") + public EcommerceCategory category; +} 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..3fb4c33 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/SingleCustomer.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 SingleCustomer. + */ +public class SingleCustomer extends MailerLiteResponse { + + @SerializedName("data") + public EcommerceCustomer customer; +} 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..bd9255f --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/SingleOrder.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 SingleOrder. + */ +public class SingleOrder extends MailerLiteResponse { + + @SerializedName("data") + public EcommerceOrder order; +} 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..962d4fb --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/SingleProduct.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 SingleProduct. + */ +public class SingleProduct extends MailerLiteResponse { + + @SerializedName("data") + public EcommerceProduct product; +} 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..4cdbcd1 --- /dev/null +++ b/src/main/java/com/mailerlite/sdk/ecommerce/SingleShop.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 SingleShop. + */ +public class SingleShop extends MailerLiteResponse { + + @SerializedName("data") + public EcommerceShop shop; +} diff --git a/src/main/java/com/mailerlite/sdk/susbcribers/Subscribers.java b/src/main/java/com/mailerlite/sdk/susbcribers/Subscribers.java index 72f3b99..910f254 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,4 +79,10 @@ public SubscriberImportsRetriever imports() { return new SubscriberImportsRetriever(apiObjectReference); } + + public EcommerceReportRetriever ecommerceReport(String subscriberId) + { + String endpoint = "/subscribers/".concat(subscriberId); + return new EcommerceReportRetriever(apiObjectReference, endpoint.concat("/reports/ecommerce"), endpoint.concat("/reports/ecommerce/orders"), "shop_id"); + } } 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..ab0fff8 --- /dev/null +++ b/src/test/java/com/mailerlite/sdk/tests/EcommerceTest.java @@ -0,0 +1,189 @@ +package com.mailerlite.sdk.tests; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.ByteArrayOutputStream; +import java.net.http.HttpRequest; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.concurrent.Flow; + +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.ecommerce.CategoryBuilderBody; +import com.mailerlite.sdk.ecommerce.CustomerBuilderBody; +import com.mailerlite.sdk.ecommerce.Ecommerce; +import com.mailerlite.sdk.ecommerce.ProductBuilderBody; +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 MailerLite ml; + + private Ecommerce ecommerce; + + interface ApiCall { + void run() throws MailerLiteException; + } + + @BeforeEach + public void setupEach() + { + VcrTape capturingTape = new VcrTape() { + @Override + public HttpClientVcrResponse getRecordedResponse(HttpRequest request) + { + lastRequest = request; + HttpClientVcrResponse response = new HttpClientVcrResponse(); + response.statusCode = 200; + response.body = "{}"; + response.headers = new HashMap>(); + return response; + } + }; + + HttpClientVcr client = new HttpClientVcr(); + client.setTape(capturingTape); + MailerLiteHttpClientFactory.getInstance().setClient(client); + + ml = this.getMailerLite(); + ecommerce = ml.ecommerce(); + } + + 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); + assertRequest(() -> ecommerce.orders("1").builder().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(() -> ecommerce.carts("1").builder().cartTotal(10.0).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\"}]"); + } + + @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?page=2&shop_id=1", 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(() -> ml.automations().ecommerceReport("8").stats(), "GET", API + "/automations/8/monthly-totals/ecommerce", null); + assertRequest(() -> ml.automations().ecommerceReport("8").timeFrame("all_time").shopId("1").orders(), "GET", API + "/automations/8/order-activity?time_frame=all_time&ecommerce_shop_id=1", null); + assertRequest(() -> ml.automations().ecommerceEmailReport("8", "9").shopId("1").stats(), "GET", API + "/automations/8/emails/9/ecommerce-overview-stats?shop_id=1", null); + } +} From 2b04762c5710eafa3c8c71e4114364f39d3d2732 Mon Sep 17 00:00:00 2001 From: Segun Olaiya Date: Wed, 28 Oct 2026 13:10:21 +0100 Subject: [PATCH 2/2] ECO-600: Nits --- .../sdk/ecommerce/EcommerceReportRetriever.java | 6 +++++- .../com/mailerlite/sdk/tests/EcommerceTest.java | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceReportRetriever.java b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceReportRetriever.java index 20358a1..1500787 100644 --- a/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceReportRetriever.java +++ b/src/main/java/com/mailerlite/sdk/ecommerce/EcommerceReportRetriever.java @@ -1,7 +1,7 @@ /************************************************* * MailerLite Java SDK * https://github.com/mailerlite/mailerlite-java - * + * * @author MailerLite * https://mailerlite.com **************************************************/ @@ -80,6 +80,10 @@ public SingleEcommerceReport stats() throws MailerLiteException public EcommerceReportOrdersList orders() throws MailerLiteException { + if (ordersEndpoint == null) { + throw new MailerLiteException("This report has no orders list. Use stats() instead."); + } + if (shopId != null) { this.addQueryParameter(ordersShopParameter, shopId); } diff --git a/src/test/java/com/mailerlite/sdk/tests/EcommerceTest.java b/src/test/java/com/mailerlite/sdk/tests/EcommerceTest.java index ab0fff8..f43e103 100644 --- a/src/test/java/com/mailerlite/sdk/tests/EcommerceTest.java +++ b/src/test/java/com/mailerlite/sdk/tests/EcommerceTest.java @@ -1,6 +1,7 @@ package com.mailerlite.sdk.tests; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; import java.io.ByteArrayOutputStream; import java.net.http.HttpRequest; @@ -11,6 +12,7 @@ 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; @@ -67,6 +69,12 @@ public HttpClientVcrResponse getRecordedResponse(HttpRequest request) 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(); @@ -186,4 +194,11 @@ public void TestRevenueReports() throws MailerLiteException assertRequest(() -> ml.automations().ecommerceReport("8").timeFrame("all_time").shopId("1").orders(), "GET", API + "/automations/8/order-activity?time_frame=all_time&ecommerce_shop_id=1", null); assertRequest(() -> ml.automations().ecommerceEmailReport("8", "9").shopId("1").stats(), "GET", API + "/automations/8/emails/9/ecommerce-overview-stats?shop_id=1", null); } + + @Test + public void TestReportsWithoutOrdersRejectOrders() + { + assertThrows(MailerLiteException.class, () -> ecommerce.shops().ecommerceReport("1").orders()); + assertThrows(MailerLiteException.class, () -> ml.automations().ecommerceEmailReport("8", "9").orders()); + } }