From d0f2dfa62fa542efb0dd78edbeaa74a5edc42bd4 Mon Sep 17 00:00:00 2001 From: Cavassoni Date: Fri, 11 Aug 2023 16:26:19 -0300 Subject: [PATCH] Commerce Settings Endpoint --- .../api/domain/config/CommerceDataItem.java | 54 +++++++++++++++ .../domain/config/GraphCommerceSettings.java | 14 ++++ .../impl/WhatsappBusinessManagementApi.java | 32 +++++++++ .../WhatsappBusinessManagementApiService.java | 20 ++++++ .../GetWhatsappCommerceSettingsExample.java | 27 ++++++++ ...UpdateWhatsappCommerceSettingsExample.java | 26 +++++++ .../WhatsappBusinessManagementApiTest.java | 68 +++++++++++++++++++ .../resources/config/commerceSettings.json | 9 +++ 8 files changed, 250 insertions(+) create mode 100644 src/main/java/com/whatsapp/api/domain/config/CommerceDataItem.java create mode 100644 src/main/java/com/whatsapp/api/domain/config/GraphCommerceSettings.java create mode 100644 src/test/java/com/whatsapp/api/examples/GetWhatsappCommerceSettingsExample.java create mode 100644 src/test/java/com/whatsapp/api/examples/UpdateWhatsappCommerceSettingsExample.java create mode 100644 src/test/resources/config/commerceSettings.json diff --git a/src/main/java/com/whatsapp/api/domain/config/CommerceDataItem.java b/src/main/java/com/whatsapp/api/domain/config/CommerceDataItem.java new file mode 100644 index 000000000..6d3aadfd4 --- /dev/null +++ b/src/main/java/com/whatsapp/api/domain/config/CommerceDataItem.java @@ -0,0 +1,54 @@ +package com.whatsapp.api.domain.config; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * The type Commerce data item. + * + *

+ *

  • is_catalog_visibleOptional. Set to true to enable cart and display cart-related buttons in the business phone number's messages, catalogs, and product details. + * Set to false to disable cart. When disabled, customers can see products and their details in messages, but all cart related buttons will not appear in any message view. + *
    + *

    + *

  • is_cart_enabledOptional. Set to true to enable catalog. When enabled, catalog storefront icon and catalog-related buttons appear in the business phone number's messages and business profile. + * Set to false to disable catalog. If disabled, the storefront icon and catalog-related buttons will not appear in any views and the catalog preview with thumbnails will not appear in the business profile view. + * In addition, wa.me links to the business's catalog, as well as the View catalog button that appears when sending catalog links in a message will display an Invalid catalog link warning when tapped. + *

    + */ +@JsonInclude(JsonInclude.Include.NON_NULL) +public class CommerceDataItem { + @JsonProperty("id") + private String id; + + @JsonProperty("is_catalog_visible") + private Boolean isCatalogVisible; + + @JsonProperty("is_cart_enabled") + private Boolean isCartEnabled; + + public CommerceDataItem() { + } + + public String getId() { + return id; + } + + public Boolean isCatalogVisible() { + return isCatalogVisible; + } + + public CommerceDataItem setCatalogVisible(Boolean catalogVisible) { + isCatalogVisible = catalogVisible; + return this; + } + + public Boolean isCartEnabled() { + return isCartEnabled; + } + + public CommerceDataItem setCartEnabled(Boolean cartEnabled) { + isCartEnabled = cartEnabled; + return this; + } +} \ No newline at end of file diff --git a/src/main/java/com/whatsapp/api/domain/config/GraphCommerceSettings.java b/src/main/java/com/whatsapp/api/domain/config/GraphCommerceSettings.java new file mode 100644 index 000000000..49dfb646f --- /dev/null +++ b/src/main/java/com/whatsapp/api/domain/config/GraphCommerceSettings.java @@ -0,0 +1,14 @@ +package com.whatsapp.api.domain.config; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; + +@JsonInclude(JsonInclude.Include.NON_NULL) +public record GraphCommerceSettings( + + @JsonProperty("data") + List data +) { +} \ No newline at end of file diff --git a/src/main/java/com/whatsapp/api/impl/WhatsappBusinessManagementApi.java b/src/main/java/com/whatsapp/api/impl/WhatsappBusinessManagementApi.java index fbdd20899..411ac6c3f 100644 --- a/src/main/java/com/whatsapp/api/impl/WhatsappBusinessManagementApi.java +++ b/src/main/java/com/whatsapp/api/impl/WhatsappBusinessManagementApi.java @@ -1,5 +1,7 @@ package com.whatsapp.api.impl; +import com.whatsapp.api.domain.config.CommerceDataItem; +import com.whatsapp.api.domain.config.GraphCommerceSettings; import com.whatsapp.api.domain.phone.PhoneNumber; import com.whatsapp.api.domain.phone.PhoneNumbers; import com.whatsapp.api.domain.phone.RequestCode; @@ -188,4 +190,34 @@ public Response verifyCode(String phoneNumberId, VerifyCode verifyCode) { return executeSync(whatsappBusinessManagementApiService.verifyCode(phoneNumberId, verifyCode)); } + + /** + * Get a business phone number's WhatsApp Commerce Settings. Returns empty if commerce settings have not been set. + * + * @param phoneNumberId the phone number id + * @param fields the fields. Available options: + *

    + * @return the response + * @see api docs + */ + public GraphCommerceSettings getWhatsappCommerceSettings(String phoneNumberId, String... fields) { + return executeSync(whatsappBusinessManagementApiService.getWhatsappCommerceSettings(phoneNumberId, Map.of("fields", String.join(",", fields)))); + } + + /** + * Update a business WhatsApp Commerce Settings. + * + * @param phoneNumberId the phone number id + * @param commerceDataItem the commerce configuration fields + * @return the response + * @see api docs + */ + public Response updateWhatsappCommerceSettings(String phoneNumberId, CommerceDataItem commerceDataItem) { + return executeSync(whatsappBusinessManagementApiService.updateWhatsappCommerceSettings(phoneNumberId, commerceDataItem)); + } + } diff --git a/src/main/java/com/whatsapp/api/service/WhatsappBusinessManagementApiService.java b/src/main/java/com/whatsapp/api/service/WhatsappBusinessManagementApiService.java index 207d92f72..bb98d6570 100644 --- a/src/main/java/com/whatsapp/api/service/WhatsappBusinessManagementApiService.java +++ b/src/main/java/com/whatsapp/api/service/WhatsappBusinessManagementApiService.java @@ -1,5 +1,7 @@ package com.whatsapp.api.service; +import com.whatsapp.api.domain.config.CommerceDataItem; +import com.whatsapp.api.domain.config.GraphCommerceSettings; import com.whatsapp.api.domain.phone.PhoneNumber; import com.whatsapp.api.domain.phone.PhoneNumbers; import com.whatsapp.api.domain.phone.RequestCode; @@ -118,5 +120,23 @@ public interface WhatsappBusinessManagementApiService { @POST("/" + API_VERSION + "/{phone-number-ID}/verify_code") Call verifyCode(@Path("phone-number-ID") String phoneNumberId, @Body VerifyCode verifyCode); + /** + * Business phone number's whatsApp commerce settings call. + * + * @param phoneNumberId the phone number id + * @param queryParams the query params + * @return the call + */ + @GET("/" + API_VERSION + "/{phone-number-ID}/whatsapp_commerce_settings") + Call getWhatsappCommerceSettings(@Path("phone-number-ID") String phoneNumberId, @QueryMap Map queryParams); + /** + * Business phone number's whatsApp commerce settings call. + * + * @param phoneNumberId the phone number id + * @param commerceDataItem the query params + * @return the call + */ + @POST("/" + API_VERSION + "/{phone-number-ID}/whatsapp_commerce_settings") + Call updateWhatsappCommerceSettings(@Path("phone-number-ID") String phoneNumberId, @Body CommerceDataItem commerceDataItem); } diff --git a/src/test/java/com/whatsapp/api/examples/GetWhatsappCommerceSettingsExample.java b/src/test/java/com/whatsapp/api/examples/GetWhatsappCommerceSettingsExample.java new file mode 100644 index 000000000..36095d245 --- /dev/null +++ b/src/test/java/com/whatsapp/api/examples/GetWhatsappCommerceSettingsExample.java @@ -0,0 +1,27 @@ +package com.whatsapp.api.examples; + +import com.whatsapp.api.WhatsappApiFactory; +import com.whatsapp.api.impl.WhatsappBusinessManagementApi; + +import static com.whatsapp.api.TestConstants.PHONE_NUMBER_ID; +import static com.whatsapp.api.TestConstants.TOKEN; + +public class GetWhatsappCommerceSettingsExample { + + public static void main(String[] args) { + + WhatsappApiFactory factory = WhatsappApiFactory.newInstance(TOKEN); + + WhatsappBusinessManagementApi whatsappBusinessManagementApi = factory.newBusinessManagementApi(); + //request without parameters + var response = whatsappBusinessManagementApi.getWhatsappCommerceSettings(PHONE_NUMBER_ID); + + System.out.println(response); + + //request with parameters + var response2 = whatsappBusinessManagementApi.getWhatsappCommerceSettings(PHONE_NUMBER_ID, "id", "is_cart_enabled"); + + System.out.println(response2); + + } +} \ No newline at end of file diff --git a/src/test/java/com/whatsapp/api/examples/UpdateWhatsappCommerceSettingsExample.java b/src/test/java/com/whatsapp/api/examples/UpdateWhatsappCommerceSettingsExample.java new file mode 100644 index 000000000..c5ac4986d --- /dev/null +++ b/src/test/java/com/whatsapp/api/examples/UpdateWhatsappCommerceSettingsExample.java @@ -0,0 +1,26 @@ +package com.whatsapp.api.examples; + +import com.whatsapp.api.WhatsappApiFactory; +import com.whatsapp.api.domain.config.CommerceDataItem; +import com.whatsapp.api.impl.WhatsappBusinessManagementApi; + +import static com.whatsapp.api.TestConstants.PHONE_NUMBER_ID; +import static com.whatsapp.api.TestConstants.TOKEN; + +public class UpdateWhatsappCommerceSettingsExample { + + public static void main(String[] args) { + + WhatsappApiFactory factory = WhatsappApiFactory.newInstance(TOKEN); + + WhatsappBusinessManagementApi whatsappBusinessManagementApi = factory.newBusinessManagementApi(); + + CommerceDataItem dataItem = new CommerceDataItem() + .setCatalogVisible(true); + + var response = whatsappBusinessManagementApi.updateWhatsappCommerceSettings(PHONE_NUMBER_ID, dataItem); + + System.out.println(response); + + } +} \ No newline at end of file diff --git a/src/test/java/com/whatsapp/api/impl/WhatsappBusinessManagementApiTest.java b/src/test/java/com/whatsapp/api/impl/WhatsappBusinessManagementApiTest.java index bff98676b..5161834b5 100644 --- a/src/test/java/com/whatsapp/api/impl/WhatsappBusinessManagementApiTest.java +++ b/src/test/java/com/whatsapp/api/impl/WhatsappBusinessManagementApiTest.java @@ -4,6 +4,7 @@ import com.whatsapp.api.MockServerUtilsTest; import com.whatsapp.api.TestConstants; import com.whatsapp.api.WhatsappApiFactory; +import com.whatsapp.api.domain.config.CommerceDataItem; import com.whatsapp.api.domain.phone.RequestCode; import com.whatsapp.api.domain.phone.VerifyCode; import com.whatsapp.api.domain.phone.type.CodeMethodType; @@ -502,6 +503,22 @@ void testRetrieveMessageTemplate3() throws IOException, URISyntaxException { } + @Test + void testRetrieveMessageTemplate3WithLimit() throws IOException, URISyntaxException { + WhatsappApiFactory factory = WhatsappApiFactory.newInstance(TOKEN); + + WhatsappBusinessManagementApi whatsappBusinessCloudApi = factory.newBusinessManagementApi(); + mockWebServer.enqueue(new MockResponse().setResponseCode(200).setBody(fromResource("/retTemplate3.json"))); + + var templates = whatsappBusinessCloudApi.retrieveTemplates(WABA_ID, 1, "10"); + + + Assertions.assertEquals(1, templates.data().size()); + Assertions.assertEquals("welcome_template3", templates.data().get(0).name()); + Assertions.assertEquals("Hello {{1}}, welcome to our {{2}} test.", templates.data().get(0).components().get(1).getText()); + + } + @Test void testRetrievePhoneNumber() throws IOException, URISyntaxException, InterruptedException { mockWebServer.enqueue(new MockResponse().setResponseCode(200).setBody(fromResource("/phone/phoneNumber.json"))); @@ -681,5 +698,56 @@ void verifyCodeError() throws IOException, URISyntaxException, InterruptedExcept } + /** + * Method under test: {@link WhatsappBusinessManagementApi#getWhatsappCommerceSettings(String, String...)} + */ + @Test + void getWhatsappCommerceSettings() throws IOException, URISyntaxException, InterruptedException { + mockWebServer.enqueue(new MockResponse() + .setResponseCode(200) + .setBody(fromResource("/config/commerceSettings.json"))); + + WhatsappApiFactory factory = WhatsappApiFactory.newInstance(TestConstants.TOKEN); + + WhatsappBusinessManagementApi businessManagementApi = factory.newBusinessManagementApi(); + + var response = businessManagementApi.getWhatsappCommerceSettings(PHONE_NUMBER_ID, "is_catalog_visible"); + + RecordedRequest recordedRequest = mockWebServer.takeRequest(); + Assertions.assertEquals("GET", recordedRequest.getMethod()); + Assertions.assertEquals("/" + API_VERSION + "/" + PHONE_NUMBER_ID + "/whatsapp_commerce_settings?fields=is_catalog_visible", recordedRequest.getPath()); + + Assertions.assertFalse(response.data().isEmpty()); + Assertions.assertEquals("1001185490903808", response.data().get(0).getId()); + Assertions.assertTrue(response.data().get(0).isCatalogVisible()); + } + + /** + * Method under test: {@link WhatsappBusinessManagementApi#updateWhatsappCommerceSettings(String, CommerceDataItem)} + */ + @Test + void updateWhatsappCommerceSettings() throws IOException, URISyntaxException, InterruptedException { + mockWebServer.enqueue(new MockResponse() + .setResponseCode(200) + .setBody(fromResource("/reponse.json")) + ); + + WhatsappApiFactory factory = WhatsappApiFactory.newInstance(TestConstants.TOKEN); + + WhatsappBusinessManagementApi businessManagementApi = factory.newBusinessManagementApi(); + + CommerceDataItem commerceDataItem = new CommerceDataItem() + .setCartEnabled(true) + .setCatalogVisible(true); + + var response = businessManagementApi.updateWhatsappCommerceSettings(PHONE_NUMBER_ID, commerceDataItem); + + RecordedRequest recordedRequest = mockWebServer.takeRequest(); + Assertions.assertEquals("POST", recordedRequest.getMethod()); + Assertions.assertEquals("/" + API_VERSION + "/" + PHONE_NUMBER_ID + "/whatsapp_commerce_settings", recordedRequest.getPath()); + + Assertions.assertTrue(response.success()); + } + } diff --git a/src/test/resources/config/commerceSettings.json b/src/test/resources/config/commerceSettings.json new file mode 100644 index 000000000..e9930c250 --- /dev/null +++ b/src/test/resources/config/commerceSettings.json @@ -0,0 +1,9 @@ +{ + "data": [ + { + "is_cart_enabled": true, + "is_catalog_visible": true, + "id": "1001185490903808" + } + ] +} \ No newline at end of file