From d5d5dae55c4d1d2feb2234f6aa122e232e862866 Mon Sep 17 00:00:00 2001 From: Alyona Akulshyna <165909017+alyona007@users.noreply.github.com> Date: Fri, 6 Sep 2024 14:54:25 +0200 Subject: [PATCH 1/5] Add unpause method support --- .../com/messagebird/MessageBirdClient.java | 18 +++++++++++++++++ .../messagebird/MessageBirdServiceImpl.java | 3 +++ .../messagebird/MessageBirdClientTest.java | 20 +++++++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/api/src/main/java/com/messagebird/MessageBirdClient.java b/api/src/main/java/com/messagebird/MessageBirdClient.java index 7011ab1..bf574c1 100644 --- a/api/src/main/java/com/messagebird/MessageBirdClient.java +++ b/api/src/main/java/com/messagebird/MessageBirdClient.java @@ -105,6 +105,7 @@ public class MessageBirdClient { private static final String VOICELEGS_SUFFIX_PATH = "/legs"; static final String FILES_PATH = "/files"; static final String TEMPLATES_PATH = "/templates"; + static final String UNPAUSE_TEMAPLATE_PATH = "/unpause"; static final String OUTBOUND_SMS_PRICING_PATH = "/pricing/sms/outbound"; static final String OUTBOUND_SMS_PRICING_SMPP_PATH = "/pricing/sms/outbound/smpp/%s"; @@ -2145,6 +2146,23 @@ public void deleteTemplatesBy(final String templateName) messageBirdService.delete(url, null); } + public void unpauseTemplatesBy(final String templateName) + throws UnauthorizedException, GeneralException { + if (templateName == null) { + throw new IllegalArgumentException("Template name must be specified."); + } + + String url = String.format( + "%s%s%s%s/%s", + INTEGRATIONS_BASE_URL_V2, + INTEGRATIONS_WHATSAPP_PATH, + TEMPLATES_PATH, + UNPAUSE_TEMAPLATE_PATH, + templateName + ); + messageBirdService.sendPayLoad("POST", url, "", null); + } + /** * Function to create a child account * diff --git a/api/src/main/java/com/messagebird/MessageBirdServiceImpl.java b/api/src/main/java/com/messagebird/MessageBirdServiceImpl.java index f8e30a8..0f0a818 100644 --- a/api/src/main/java/com/messagebird/MessageBirdServiceImpl.java +++ b/api/src/main/java/com/messagebird/MessageBirdServiceImpl.java @@ -382,6 +382,9 @@

APIResponse doRequest(final String method, final String url, final Map Date: Wed, 18 Sep 2024 11:43:49 +0200 Subject: [PATCH 2/5] Add support for LTO templates and messages --- .../conversations/MessageComponentType.java | 24 +++-- .../objects/conversations/MessageParam.java | 43 +++++++-- .../conversations/TemplateMediaType.java | 26 +++-- .../objects/integrations/HSMComponent.java | 51 +++++++--- .../integrations/HSMComponentType.java | 25 +++-- .../messagebird/MessageBirdClientTest.java | 2 + .../MessageComponentTypeTest.java | 28 ++++++ .../conversations/MessageParamTest.java | 30 ++++++ .../conversations/TemplateMediaTypeTest.java | 27 ++++++ .../integrations/HSMComponentTest.java | 26 +++++ .../integrations/HSMComponentTypeTest.java | 23 +++++ ...sationSendHSMLimitedTimeOfferTemplate.java | 90 ++++++++++++++++++ ...ExampleCreateLimitedTimeOfferTemplate.java | 95 +++++++++++++++++++ 13 files changed, 444 insertions(+), 46 deletions(-) create mode 100644 api/src/test/java/com/messagebird/objects/conversations/MessageComponentTypeTest.java create mode 100644 api/src/test/java/com/messagebird/objects/conversations/MessageParamTest.java create mode 100644 api/src/test/java/com/messagebird/objects/conversations/TemplateMediaTypeTest.java create mode 100644 api/src/test/java/com/messagebird/objects/integrations/HSMComponentTest.java create mode 100644 api/src/test/java/com/messagebird/objects/integrations/HSMComponentTypeTest.java create mode 100644 examples/src/main/java/ExampleConversationSendHSMLimitedTimeOfferTemplate.java create mode 100644 examples/src/main/java/ExampleCreateLimitedTimeOfferTemplate.java diff --git a/api/src/main/java/com/messagebird/objects/conversations/MessageComponentType.java b/api/src/main/java/com/messagebird/objects/conversations/MessageComponentType.java index c2be69b..620b4c4 100644 --- a/api/src/main/java/com/messagebird/objects/conversations/MessageComponentType.java +++ b/api/src/main/java/com/messagebird/objects/conversations/MessageComponentType.java @@ -2,6 +2,9 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; +import java.util.Map; +import java.util.HashMap; +import java.util.Collections; public enum MessageComponentType { @@ -10,8 +13,18 @@ public enum MessageComponentType { FOOTER("footer"), BUTTON("button"), CARD("card"), - CAROUSEL("carousel"); + CAROUSEL("carousel"), + LIMITED_TIME_OFFER("limited_time_offer"); + private static final Map TYPE_MAP; + + static { + Map map = new HashMap<>(); + for (MessageComponentType componentType : MessageComponentType.values()) { + map.put(componentType.getType().toLowerCase(), componentType); + } + TYPE_MAP = Collections.unmodifiableMap(map); + } private final String type; @@ -21,13 +34,10 @@ public enum MessageComponentType { @JsonCreator public static MessageComponentType forValue(String value) { - for (MessageComponentType componentType: MessageComponentType.values()) { - if (componentType.getType().equals(value)) { - return componentType; - } + if (value == null) { + throw new IllegalArgumentException("Value cannot be null"); } - - return null; + return TYPE_MAP.get(value.toLowerCase()); } @JsonValue diff --git a/api/src/main/java/com/messagebird/objects/conversations/MessageParam.java b/api/src/main/java/com/messagebird/objects/conversations/MessageParam.java index 069c3f6..812493e 100644 --- a/api/src/main/java/com/messagebird/objects/conversations/MessageParam.java +++ b/api/src/main/java/com/messagebird/objects/conversations/MessageParam.java @@ -1,5 +1,7 @@ package com.messagebird.objects.conversations; +import com.fasterxml.jackson.annotation.JsonProperty; + public class MessageParam { private TemplateMediaType type; @@ -10,6 +12,8 @@ public class MessageParam { private Media document; private Media image; private Media video; + @JsonProperty("expiration_time") + private String expirationTime; public TemplateMediaType getType() { return type; @@ -24,6 +28,9 @@ public String getText() { } public void setText(String text) { + if (text == null || text.isEmpty()) { + throw new IllegalArgumentException("Text cannot be null or empty"); + } this.text = text; } @@ -48,6 +55,9 @@ public String getDateTime() { } public void setDateTime(String dateTime) { + if (dateTime == null || dateTime.isEmpty()) { + throw new IllegalArgumentException("dateTime cannot be null or empty"); + } this.dateTime = dateTime; } @@ -71,17 +81,30 @@ public void setImage(Media image) { public void setVideo(Media video) { this.video = video; } + public String getExpirationTime() { + return expirationTime; + } + + public void setExpirationTime(String expirationTime) { + if (expirationTime == null || expirationTime.isEmpty()) { + throw new IllegalArgumentException("expirationTime cannot be null or empty"); + } + this.expirationTime = expirationTime; + } + @Override public String toString() { - return "MessageParam{" + - "type=" + type + '\'' + - ", text='" + text + '\'' + - ", payload='" + payload + '\'' + - ", currency=" + currency + '\'' + - ", dateTime='" + dateTime + '\'' + - ", document=" + document + '\'' + - ", image=" + image + '\'' + - ", video=" + video + - '}'; + StringBuilder sb = new StringBuilder("MessageParam{"); + sb.append("type=").append(type) + .append(", text='").append(text).append('\'') + .append(", payload='").append(payload).append('\'') + .append(", currency=").append(currency) + .append(", dateTime='").append(dateTime).append('\'') + .append(", document=").append(document) + .append(", image=").append(image) + .append(", video=").append(video) + .append(", expirationTime='").append(expirationTime).append('\'') + .append('}'); + return sb.toString(); } } diff --git a/api/src/main/java/com/messagebird/objects/conversations/TemplateMediaType.java b/api/src/main/java/com/messagebird/objects/conversations/TemplateMediaType.java index fe5494f..fd600ab 100644 --- a/api/src/main/java/com/messagebird/objects/conversations/TemplateMediaType.java +++ b/api/src/main/java/com/messagebird/objects/conversations/TemplateMediaType.java @@ -2,6 +2,9 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; +import java.util.Map; +import java.util.HashMap; +import java.util.Collections; public enum TemplateMediaType { @@ -11,7 +14,19 @@ public enum TemplateMediaType { TEXT("text"), CURRENCY("currency"), DATETIME("date_time"), - PAYLOAD("payload"); + PAYLOAD("payload"), + EXPIRATION_TIME("expiration_time"); + + private static final Map TYPE_MAP; + + static { + Map map = new HashMap<>(); + for (TemplateMediaType templateMediaType : TemplateMediaType.values()) { + map.put(templateMediaType.getType().toLowerCase(), templateMediaType); + } + TYPE_MAP = Collections.unmodifiableMap(map); + } + private final String type; @@ -21,13 +36,10 @@ public enum TemplateMediaType { @JsonCreator public static TemplateMediaType forValue(String value) { - for (TemplateMediaType templateMediaType: TemplateMediaType.values()) { - if (templateMediaType.getType().equals(value)) { - return templateMediaType; - } + if (value == null) { + throw new IllegalArgumentException("Value cannot be null"); } - - return null; + return TYPE_MAP.get(value.toLowerCase()); } @JsonValue diff --git a/api/src/main/java/com/messagebird/objects/integrations/HSMComponent.java b/api/src/main/java/com/messagebird/objects/integrations/HSMComponent.java index 4e3fe64..5e21cf6 100644 --- a/api/src/main/java/com/messagebird/objects/integrations/HSMComponent.java +++ b/api/src/main/java/com/messagebird/objects/integrations/HSMComponent.java @@ -20,6 +20,8 @@ public class HSMComponent { @JsonProperty("code_expiration_minutes") private Integer codeExpirationMinutes; private List buttons; + @JsonProperty("has_expiration") + private Boolean hasExpiration; private List cards; @@ -46,6 +48,9 @@ public String getText() { } public void setText(String text) { + if (text == null || text.isEmpty()) { + throw new IllegalArgumentException("Text cannot be null or empty"); + } this.text = text; } @@ -88,15 +93,29 @@ public Integer getCodeExpirationMinutes() { public void setCodeExpirationMinutes(Integer codeExpirationMinutes) { this.codeExpirationMinutes = codeExpirationMinutes; } + + public Boolean getHasExpiration() { + return hasExpiration; + } + + public void setHasExpiration(Boolean hasExpiration) { + this.hasExpiration = hasExpiration; + } + @Override public String toString() { - return "HSMComponent{" + - "type='" + type + '\'' + - ", format='" + format + '\'' + - ", text='" + text + '\'' + - ", buttons=" + buttons + - ", example=" + example + - '}'; + StringBuilder sb = new StringBuilder("HSMComponent{"); + sb.append("type=").append(type) + .append(", format=").append(format) + .append(", text='").append(text).append('\'') + .append(", addSecurityRecommendation=").append(addSecurityRecommendation) + .append(", codeExpirationMinutes=").append(codeExpirationMinutes) + .append(", buttons=").append(buttons) + .append(", hasExpiration=").append(hasExpiration) + .append(", cards=").append(cards) + .append(", example=").append(example) + .append('}'); + return sb.toString(); } /** @@ -105,8 +124,12 @@ public String toString() { * @throws IllegalArgumentException Occurs when validation is not passed. */ public void validateComponent() throws IllegalArgumentException { - this.validateButtons(); - this.validateComponentExample(); + try { + this.validateButtons(); + this.validateComponentExample(); + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException("Component validation failed: " + e.getMessage(), e); + } } /** @@ -153,9 +176,7 @@ private void validateComponentExample() throws IllegalArgumentException { * @throws IllegalArgumentException Occurs when type is not {@code HEADER} and format is not {@code TEXT}. */ private void checkHeaderText() throws IllegalArgumentException { - if (!(type.equals(HSMComponentType.HEADER) - && format.equals(HSMComponentFormat.TEXT)) - ) { + if (!(HSMComponentType.HEADER.equals(type) && HSMComponentFormat.TEXT.equals(format))) { throw new IllegalArgumentException("\"header_text\" is available for only HEADER type and TEXT format."); } } @@ -166,9 +187,9 @@ private void checkHeaderText() throws IllegalArgumentException { * @throws IllegalArgumentException Occurs when type is not {@code HEADER} and format is not {@code IMAGE}. */ private void checkHeaderUrl() throws IllegalArgumentException { - if (!(type.equals(HSMComponentType.HEADER) && - (format.equals(HSMComponentFormat.IMAGE) || format.equals(HSMComponentFormat.VIDEO) || format.equals(HSMComponentFormat.DOCUMENT)))) { - throw new IllegalArgumentException("\"header_url\" is available for only HEADER type and IMAGE, VIDEO and DOCUMENT format."); + if (!(HSMComponentType.HEADER.equals(type) && + (HSMComponentFormat.IMAGE.equals(format) || HSMComponentFormat.VIDEO.equals(format) || HSMComponentFormat.DOCUMENT.equals(format)))) { + throw new IllegalArgumentException("\"header_url\" is available for only HEADER type and IMAGE, VIDEO, or DOCUMENT formats."); } } } diff --git a/api/src/main/java/com/messagebird/objects/integrations/HSMComponentType.java b/api/src/main/java/com/messagebird/objects/integrations/HSMComponentType.java index eff331d..1d17b9c 100644 --- a/api/src/main/java/com/messagebird/objects/integrations/HSMComponentType.java +++ b/api/src/main/java/com/messagebird/objects/integrations/HSMComponentType.java @@ -2,6 +2,9 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; +import java.util.Map; +import java.util.HashMap; +import java.util.Collections; /** * An enum for HSMComponentType @@ -13,7 +16,18 @@ public enum HSMComponentType { HEADER("HEADER"), FOOTER("FOOTER"), BUTTONS("BUTTONS"), - CAROUSEL("CAROUSEL"); + CAROUSEL("CAROUSEL"), + LIMITED_TIME_OFFER("LIMITED_TIME_OFFER"); + + private static final Map TYPE_MAP; + + static { + Map map = new HashMap<>(); + for (HSMComponentType hsmComponentType : HSMComponentType.values()) { + map.put(hsmComponentType.getType().toLowerCase(), hsmComponentType); + } + TYPE_MAP = Collections.unmodifiableMap(map); + } private final String type; @@ -23,13 +37,10 @@ public enum HSMComponentType { @JsonCreator public static HSMComponentType forValue(String value) { - for (HSMComponentType hsmComponentType : HSMComponentType.values()) { - if (hsmComponentType.getType().equals(value)) { - return hsmComponentType; - } + if (value == null) { + throw new IllegalArgumentException("Value cannot be null"); } - - return null; + return TYPE_MAP.get(value.toLowerCase()); } @JsonValue diff --git a/api/src/test/java/com/messagebird/MessageBirdClientTest.java b/api/src/test/java/com/messagebird/MessageBirdClientTest.java index 56834e4..985b4fb 100644 --- a/api/src/test/java/com/messagebird/MessageBirdClientTest.java +++ b/api/src/test/java/com/messagebird/MessageBirdClientTest.java @@ -1613,4 +1613,6 @@ public void testUnpauseTemplatesBy_Success() throws UnauthorizedException, Gener public void testUnpauseTemplatesBy_NotFound() throws UnauthorizedException, GeneralException { messageBirdClient.unpauseTemplatesBy("foo"); } + + // @todo } \ No newline at end of file diff --git a/api/src/test/java/com/messagebird/objects/conversations/MessageComponentTypeTest.java b/api/src/test/java/com/messagebird/objects/conversations/MessageComponentTypeTest.java new file mode 100644 index 0000000..e1e1ce7 --- /dev/null +++ b/api/src/test/java/com/messagebird/objects/conversations/MessageComponentTypeTest.java @@ -0,0 +1,28 @@ +package com.messagebird.objects.conversations; + +import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +public class MessageComponentTypeTest { + @Test + public void testMessageComponentTypeForValueValid() { + assertEquals(MessageComponentType.HEADER, MessageComponentType.forValue("header")); + assertEquals(MessageComponentType.BUTTON, MessageComponentType.forValue("button")); + } + + @Test(expected = IllegalArgumentException.class) + public void testMessageComponentTypeForValueNull() { + MessageComponentType.forValue(null); + } + + @Test + public void testMessageComponentTypeForValueInvalid() { + assertNull(MessageComponentType.forValue("invalid_type")); + } + + @Test + public void testMessageComponentTypeToString() { + assertEquals("header", MessageComponentType.HEADER.toString()); + } +} diff --git a/api/src/test/java/com/messagebird/objects/conversations/MessageParamTest.java b/api/src/test/java/com/messagebird/objects/conversations/MessageParamTest.java new file mode 100644 index 0000000..6ddabad --- /dev/null +++ b/api/src/test/java/com/messagebird/objects/conversations/MessageParamTest.java @@ -0,0 +1,30 @@ +package com.messagebird.objects.conversations; + +import org.junit.Test; +import static org.junit.Assert.assertEquals; + +public class MessageParamTest { + @Test + public void testMessageParamToString() { + MessageParam param = new MessageParam(); + param.setType(TemplateMediaType.IMAGE); + param.setText("Sample text"); + param.setPayload("Sample payload"); + + String expected = "MessageParam{type=image, text='Sample text', payload='Sample payload', currency=null, dateTime='null', document=null, image=null, video=null, expirationTime='null'}"; + assertEquals(expected, param.toString()); + } + + @Test(expected = IllegalArgumentException.class) + public void testMessageParamSetTextInvalid() { + MessageParam param = new MessageParam(); + param.setText(""); + } + + @Test + public void testMessageParamSetTextValid() { + MessageParam param = new MessageParam(); + param.setText("Valid text"); + assertEquals("Valid text", param.getText()); + } +} diff --git a/api/src/test/java/com/messagebird/objects/conversations/TemplateMediaTypeTest.java b/api/src/test/java/com/messagebird/objects/conversations/TemplateMediaTypeTest.java new file mode 100644 index 0000000..d30bde2 --- /dev/null +++ b/api/src/test/java/com/messagebird/objects/conversations/TemplateMediaTypeTest.java @@ -0,0 +1,27 @@ +package com.messagebird.objects.conversations; + +import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +public class TemplateMediaTypeTest { + @Test + public void testTemplateMediaTypeForValueValid() { + assertEquals(TemplateMediaType.VIDEO, TemplateMediaType.forValue("video")); + } + + @Test(expected = IllegalArgumentException.class) + public void testTemplateMediaTypeForValueNull() { + TemplateMediaType.forValue(null); + } + + @Test + public void testTemplateMediaTypeForValueInvalid() { + assertNull(TemplateMediaType.forValue("non_existing_value")); + } + + @Test + public void testTemplateMediaTypeToString() { + assertEquals("video", TemplateMediaType.VIDEO.toString()); + } +} diff --git a/api/src/test/java/com/messagebird/objects/integrations/HSMComponentTest.java b/api/src/test/java/com/messagebird/objects/integrations/HSMComponentTest.java new file mode 100644 index 0000000..9af4bb6 --- /dev/null +++ b/api/src/test/java/com/messagebird/objects/integrations/HSMComponentTest.java @@ -0,0 +1,26 @@ +package com.messagebird.objects.integrations; + +import org.junit.Test; +import static org.junit.Assert.assertEquals; + +public class HSMComponentTest { + @Test + public void testToString() { + HSMComponent component = new HSMComponent(); + component.setType(HSMComponentType.BODY); + component.setFormat(HSMComponentFormat.TEXT); + component.setText("Test text"); + component.setAddSecurityRecommendation(true); + component.setCodeExpirationMinutes(10); + component.setHasExpiration(true); + + String expected = "HSMComponent{type=BODY, format=TEXT, text='Test text', addSecurityRecommendation=true, codeExpirationMinutes=10, buttons=null, hasExpiration=true, cards=null, example=null}"; + assertEquals(expected, component.toString()); + } + + @Test(expected = IllegalArgumentException.class) + public void testSetTextInvalid() { + HSMComponent component = new HSMComponent(); + component.setText(""); + } +} diff --git a/api/src/test/java/com/messagebird/objects/integrations/HSMComponentTypeTest.java b/api/src/test/java/com/messagebird/objects/integrations/HSMComponentTypeTest.java new file mode 100644 index 0000000..01e0790 --- /dev/null +++ b/api/src/test/java/com/messagebird/objects/integrations/HSMComponentTypeTest.java @@ -0,0 +1,23 @@ +package com.messagebird.objects.integrations; + +import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +public class HSMComponentTypeTest { + @Test + public void testForValueValid() { + assertEquals(HSMComponentType.BODY, HSMComponentType.forValue("BODY")); + assertEquals(HSMComponentType.BODY, HSMComponentType.forValue("body")); + } + + @Test(expected = IllegalArgumentException.class) + public void testForValueNull() { + HSMComponentType.forValue(null); + } + + @Test + public void testForValueInvalid() { + assertNull(HSMComponentType.forValue("INVALID")); + } +} diff --git a/examples/src/main/java/ExampleConversationSendHSMLimitedTimeOfferTemplate.java b/examples/src/main/java/ExampleConversationSendHSMLimitedTimeOfferTemplate.java new file mode 100644 index 0000000..65b959a --- /dev/null +++ b/examples/src/main/java/ExampleConversationSendHSMLimitedTimeOfferTemplate.java @@ -0,0 +1,90 @@ +import com.messagebird.MessageBirdClient; +import com.messagebird.MessageBirdService; +import com.messagebird.MessageBirdServiceImpl; +import com.messagebird.exceptions.GeneralException; +import com.messagebird.exceptions.UnauthorizedException; +import com.messagebird.objects.conversations.*; + +import java.util.ArrayList; +import java.util.List; + +public class ExampleConversationSendHSMLimitedTimeOfferTemplate { + + public static void main(String[] args) { + if (args.length < 6) { + System.out.println("Please at least specify your access key, the channel id and destination address.\n" + + "Usage : java -jar test_accesskey(Required) channel_id(Required) from(Required) destination(Required) templateName(Required) namespace(Required) expirationTimeInput(Required)"); + return; + } + + final String accessKey = args[0]; + final String from = args[1]; + final String destination = args[2]; + final String templateName = args[3]; + final String namespace = args[4]; + final String expirationTimeInput = args[5]; + + //First create your service object + final MessageBirdService wsr = new MessageBirdServiceImpl(accessKey); + //Add the service to the client + final MessageBirdClient messageBirdClient = new MessageBirdClient(wsr); + + ConversationContent conversationContent = new ConversationContent(); + ConversationContentHsm conversationContentHsm = new ConversationContentHsm(); + conversationContentHsm.setNamespace(namespace); + conversationContentHsm.setTemplateName(templateName); + ConversationHsmLanguage language = new ConversationHsmLanguage(); + language.setCode("en"); + conversationContentHsm.setLanguage(language); + List messageComponents = new ArrayList<>(); + + // Add LTO component + MessageComponent messageLTOComponent = new MessageComponent(); + messageLTOComponent.setType(MessageComponentType.LIMITED_TIME_OFFER); + List messageLTOParams = new ArrayList<>(); + + MessageParam expirationTime = new MessageParam(); + expirationTime.setType(TemplateMediaType.EXPIRATION_TIME); + expirationTime.setExpirationTime(expirationTimeInput); + messageLTOParams.add(expirationTime); + + messageLTOComponent.setParameters(messageLTOParams); + + // Add body component + MessageComponent messageBodyComponent = new MessageComponent(); + messageBodyComponent.setType(MessageComponentType.BODY); + List messageBodyParams = new ArrayList<>(); + + MessageParam text = new MessageParam(); + text.setType(TemplateMediaType.TEXT); + text.setText("Bob"); + messageBodyParams.add(text); + + messageBodyComponent.setParameters(messageBodyParams); + + messageComponents.add(messageLTOComponent); + messageComponents.add(messageBodyComponent); + conversationContentHsm.setComponents(messageComponents); + conversationContent.setHsm(conversationContentHsm); + ConversationSendRequest request = new ConversationSendRequest( + destination, + ConversationContentType.HSM, + conversationContent, + from, + "", + null, + null, + null); + + try { + ConversationSendResponse sendResponse = messageBirdClient.sendMessage(request); + System.out.println(sendResponse.toString()); + + } catch (UnauthorizedException e) { + System.err.println("Authorization failed. Please check your access key: " + e.getMessage()); + } catch (GeneralException e) { + System.err.println("An error occurred while sending the message: " + e.getMessage()); + } + } + +} diff --git a/examples/src/main/java/ExampleCreateLimitedTimeOfferTemplate.java b/examples/src/main/java/ExampleCreateLimitedTimeOfferTemplate.java new file mode 100644 index 0000000..dc721f9 --- /dev/null +++ b/examples/src/main/java/ExampleCreateLimitedTimeOfferTemplate.java @@ -0,0 +1,95 @@ +import com.messagebird.MessageBirdClient; +import com.messagebird.MessageBirdService; +import com.messagebird.MessageBirdServiceImpl; +import com.messagebird.exceptions.GeneralException; +import com.messagebird.exceptions.UnauthorizedException; +import com.messagebird.objects.integrations.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class ExampleCreateLimitedTimeOfferTemplate { + + public static void main(String[] args) { + if (args.length < 4) { + System.out.println("Please specify your access key and a template name and WABA ID example : java -jar test_accesskey(Required) templateName(Required) wabaID(required)"); + return; + } + + final String accessKey = args[0]; + final String templateName = args[1]; + final String wabaID = args[2]; + + // First create your service object + final MessageBirdService wsr = new MessageBirdServiceImpl(accessKey); + + // Add the service to the client + final MessageBirdClient messageBirdClient = new MessageBirdClient(wsr); + + // header + final HSMComponent headerComponent = new HSMComponent(); + final HSMExample headerExample = new HSMExample(); + headerExample.setHeader_url(Arrays.asList("https://images.freeimages.com/images/small-previews/c5a/colourful-paper-rip-1-1195879.jpg")); + + headerComponent.setType(HSMComponentType.HEADER); + headerComponent.setFormat(HSMComponentFormat.IMAGE); + headerComponent.setExample(headerExample); + + // limited time offer + final HSMComponent ltoComponent = new HSMComponent(); + ltoComponent.setType(HSMComponentType.LIMITED_TIME_OFFER); + ltoComponent.setText("Expiring offer!"); + ltoComponent.setHasExpiration(true); + + // body + final HSMComponent bodyComponent = new HSMComponent(); + final HSMExample bodyExample = new HSMExample(); + final List> bodyText = new ArrayList<>(); + bodyText.add(Arrays.asList("John", "CARIBE25")); + bodyExample.setBody_text(bodyText); + + bodyComponent.setType(HSMComponentType.BODY); + bodyComponent.setText("Good news, {{1}}! Use code {{2}} to get 0% off all packages!"); + bodyComponent.setExample(bodyExample); + + // buttons + final HSMComponent buttonComponent = new HSMComponent(); + final List buttons = new ArrayList<>(); + + final HSMComponentButton buttonCopyCode = new HSMComponentButton(); + buttonCopyCode.setType(HSMComponentButtonType.COPY_CODE); + buttonCopyCode.setExample(Arrays.asList("CARIBE25")); + + final HSMComponentButton buttonBookNow = new HSMComponentButton(); + buttonBookNow.setType(HSMComponentButtonType.URL); + buttonBookNow.setText("Book now!"); + buttonBookNow.setUrl("https://www.bird.com?code={{1}}"); + buttonBookNow.setExample(Arrays.asList("https://www.bird.com?code=CARIBE25")); + + buttons.addAll(Arrays.asList(buttonCopyCode, buttonBookNow)); + buttonComponent.setType(HSMComponentType.BUTTONS); + buttonComponent.setButtons(buttons); + + // set components + final Template template = new Template(); + final List components = new ArrayList<>(); + components.addAll(Arrays.asList(headerComponent, ltoComponent, bodyComponent, buttonComponent)); + + template.setName(templateName); + template.setLanguage("en_US"); + template.setWABAID(wabaID); + template.setComponents(components); + template.setCategory(HSMCategory.MARKETING); + + try { + TemplateResponse response = messageBirdClient.createWhatsAppTemplate(template); + System.out.println(response.toString()); + } catch (UnauthorizedException e) { + System.err.println("Authorization failed. Please check your access key: " + e.getMessage()); + } catch (GeneralException e) { + System.err.println("An error occurred while sending the message: " + e.getMessage()); + } + } + +} From 9081dbb11f140dc6144a20e2506bbc30bf6fda2a Mon Sep 17 00:00:00 2001 From: Alyona Akulshyna <165909017+alyona007@users.noreply.github.com> Date: Wed, 18 Sep 2024 11:57:06 +0200 Subject: [PATCH 3/5] rb files --- .../com/messagebird/MessageBirdClient.java | 18 ------------------ .../messagebird/MessageBirdServiceImpl.java | 3 --- 2 files changed, 21 deletions(-) diff --git a/api/src/main/java/com/messagebird/MessageBirdClient.java b/api/src/main/java/com/messagebird/MessageBirdClient.java index bf574c1..7011ab1 100644 --- a/api/src/main/java/com/messagebird/MessageBirdClient.java +++ b/api/src/main/java/com/messagebird/MessageBirdClient.java @@ -105,7 +105,6 @@ public class MessageBirdClient { private static final String VOICELEGS_SUFFIX_PATH = "/legs"; static final String FILES_PATH = "/files"; static final String TEMPLATES_PATH = "/templates"; - static final String UNPAUSE_TEMAPLATE_PATH = "/unpause"; static final String OUTBOUND_SMS_PRICING_PATH = "/pricing/sms/outbound"; static final String OUTBOUND_SMS_PRICING_SMPP_PATH = "/pricing/sms/outbound/smpp/%s"; @@ -2146,23 +2145,6 @@ public void deleteTemplatesBy(final String templateName) messageBirdService.delete(url, null); } - public void unpauseTemplatesBy(final String templateName) - throws UnauthorizedException, GeneralException { - if (templateName == null) { - throw new IllegalArgumentException("Template name must be specified."); - } - - String url = String.format( - "%s%s%s%s/%s", - INTEGRATIONS_BASE_URL_V2, - INTEGRATIONS_WHATSAPP_PATH, - TEMPLATES_PATH, - UNPAUSE_TEMAPLATE_PATH, - templateName - ); - messageBirdService.sendPayLoad("POST", url, "", null); - } - /** * Function to create a child account * diff --git a/api/src/main/java/com/messagebird/MessageBirdServiceImpl.java b/api/src/main/java/com/messagebird/MessageBirdServiceImpl.java index 0f0a818..f8e30a8 100644 --- a/api/src/main/java/com/messagebird/MessageBirdServiceImpl.java +++ b/api/src/main/java/com/messagebird/MessageBirdServiceImpl.java @@ -382,9 +382,6 @@

APIResponse doRequest(final String method, final String url, final Map Date: Wed, 18 Sep 2024 11:57:36 +0200 Subject: [PATCH 4/5] rb files --- .../messagebird/MessageBirdClientTest.java | 22 ------------------- 1 file changed, 22 deletions(-) diff --git a/api/src/test/java/com/messagebird/MessageBirdClientTest.java b/api/src/test/java/com/messagebird/MessageBirdClientTest.java index 985b4fb..f1902b5 100644 --- a/api/src/test/java/com/messagebird/MessageBirdClientTest.java +++ b/api/src/test/java/com/messagebird/MessageBirdClientTest.java @@ -1592,27 +1592,5 @@ private ConversationSendRequest createDummyConversationRequest() { return request; } - @Test - public void testUnpauseTemplatesBy_Success() throws UnauthorizedException, GeneralException { - final Template template = TestUtil.createWhatsAppTemplate("sample_template_name", "ko"); - MessageBirdService messageBirdServiceMock = mock(MessageBirdService.class); - MessageBirdClient messageBirdClientInjectMock = new MessageBirdClient(messageBirdServiceMock); - String url = String.format( - "%s%s%s%s/%s", - INTEGRATIONS_BASE_URL_V2, - INTEGRATIONS_WHATSAPP_PATH, - TEMPLATES_PATH, - UNPAUSE_TEMAPLATE_PATH, - "sample_template_name" - ); - messageBirdClientInjectMock.unpauseTemplatesBy("sample_template_name"); - verify(messageBirdServiceMock).sendPayLoad("POST", url, "", null); - } - - @Test(expected = GeneralException.class) - public void testUnpauseTemplatesBy_NotFound() throws UnauthorizedException, GeneralException { - messageBirdClient.unpauseTemplatesBy("foo"); - } - // @todo } \ No newline at end of file From 64bf1f8d3f7687665546881d647ba6fc2e46556c Mon Sep 17 00:00:00 2001 From: Alyona Akulshyna <165909017+alyona007@users.noreply.github.com> Date: Fri, 20 Sep 2024 10:19:29 +0200 Subject: [PATCH 5/5] Refactor null check and use Locale.ROOT in forValue --- .../objects/conversations/MessageComponentType.java | 11 ++++------- .../objects/conversations/MessageParam.java | 7 ++++--- .../objects/integrations/HSMComponent.java | 3 ++- .../objects/integrations/HSMComponentType.java | 8 ++++---- .../conversations/MessageComponentTypeTest.java | 2 +- .../objects/integrations/HSMComponentTypeTest.java | 2 +- 6 files changed, 16 insertions(+), 17 deletions(-) diff --git a/api/src/main/java/com/messagebird/objects/conversations/MessageComponentType.java b/api/src/main/java/com/messagebird/objects/conversations/MessageComponentType.java index 620b4c4..cdb695c 100644 --- a/api/src/main/java/com/messagebird/objects/conversations/MessageComponentType.java +++ b/api/src/main/java/com/messagebird/objects/conversations/MessageComponentType.java @@ -2,9 +2,8 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; -import java.util.Map; -import java.util.HashMap; -import java.util.Collections; + +import java.util.*; public enum MessageComponentType { @@ -34,10 +33,8 @@ public enum MessageComponentType { @JsonCreator public static MessageComponentType forValue(String value) { - if (value == null) { - throw new IllegalArgumentException("Value cannot be null"); - } - return TYPE_MAP.get(value.toLowerCase()); + Objects.requireNonNull(value, "Value cannot be null"); + return TYPE_MAP.get(value.toLowerCase(Locale.ROOT)); } @JsonValue diff --git a/api/src/main/java/com/messagebird/objects/conversations/MessageParam.java b/api/src/main/java/com/messagebird/objects/conversations/MessageParam.java index 812493e..38ae18f 100644 --- a/api/src/main/java/com/messagebird/objects/conversations/MessageParam.java +++ b/api/src/main/java/com/messagebird/objects/conversations/MessageParam.java @@ -1,6 +1,7 @@ package com.messagebird.objects.conversations; import com.fasterxml.jackson.annotation.JsonProperty; +import org.apache.commons.lang3.StringUtils; public class MessageParam { @@ -28,7 +29,7 @@ public String getText() { } public void setText(String text) { - if (text == null || text.isEmpty()) { + if (StringUtils.isBlank(text)) { throw new IllegalArgumentException("Text cannot be null or empty"); } this.text = text; @@ -55,7 +56,7 @@ public String getDateTime() { } public void setDateTime(String dateTime) { - if (dateTime == null || dateTime.isEmpty()) { + if (StringUtils.isBlank(dateTime)) { throw new IllegalArgumentException("dateTime cannot be null or empty"); } this.dateTime = dateTime; @@ -86,7 +87,7 @@ public String getExpirationTime() { } public void setExpirationTime(String expirationTime) { - if (expirationTime == null || expirationTime.isEmpty()) { + if (StringUtils.isBlank(expirationTime)) { throw new IllegalArgumentException("expirationTime cannot be null or empty"); } this.expirationTime = expirationTime; diff --git a/api/src/main/java/com/messagebird/objects/integrations/HSMComponent.java b/api/src/main/java/com/messagebird/objects/integrations/HSMComponent.java index 5e21cf6..ed93847 100644 --- a/api/src/main/java/com/messagebird/objects/integrations/HSMComponent.java +++ b/api/src/main/java/com/messagebird/objects/integrations/HSMComponent.java @@ -1,6 +1,7 @@ package com.messagebird.objects.integrations; import com.fasterxml.jackson.annotation.JsonProperty; +import org.apache.commons.lang3.StringUtils; import java.util.List; @@ -48,7 +49,7 @@ public String getText() { } public void setText(String text) { - if (text == null || text.isEmpty()) { + if (StringUtils.isBlank(text)) { throw new IllegalArgumentException("Text cannot be null or empty"); } this.text = text; diff --git a/api/src/main/java/com/messagebird/objects/integrations/HSMComponentType.java b/api/src/main/java/com/messagebird/objects/integrations/HSMComponentType.java index 1d17b9c..8610146 100644 --- a/api/src/main/java/com/messagebird/objects/integrations/HSMComponentType.java +++ b/api/src/main/java/com/messagebird/objects/integrations/HSMComponentType.java @@ -5,6 +5,8 @@ import java.util.Map; import java.util.HashMap; import java.util.Collections; +import java.util.Locale; +import java.util.Objects; /** * An enum for HSMComponentType @@ -37,10 +39,8 @@ public enum HSMComponentType { @JsonCreator public static HSMComponentType forValue(String value) { - if (value == null) { - throw new IllegalArgumentException("Value cannot be null"); - } - return TYPE_MAP.get(value.toLowerCase()); + Objects.requireNonNull(value, "Value cannot be null"); + return TYPE_MAP.get(value.toLowerCase(Locale.ROOT)); } @JsonValue diff --git a/api/src/test/java/com/messagebird/objects/conversations/MessageComponentTypeTest.java b/api/src/test/java/com/messagebird/objects/conversations/MessageComponentTypeTest.java index e1e1ce7..385b165 100644 --- a/api/src/test/java/com/messagebird/objects/conversations/MessageComponentTypeTest.java +++ b/api/src/test/java/com/messagebird/objects/conversations/MessageComponentTypeTest.java @@ -11,7 +11,7 @@ public void testMessageComponentTypeForValueValid() { assertEquals(MessageComponentType.BUTTON, MessageComponentType.forValue("button")); } - @Test(expected = IllegalArgumentException.class) + @Test(expected = NullPointerException.class) public void testMessageComponentTypeForValueNull() { MessageComponentType.forValue(null); } diff --git a/api/src/test/java/com/messagebird/objects/integrations/HSMComponentTypeTest.java b/api/src/test/java/com/messagebird/objects/integrations/HSMComponentTypeTest.java index 01e0790..4705350 100644 --- a/api/src/test/java/com/messagebird/objects/integrations/HSMComponentTypeTest.java +++ b/api/src/test/java/com/messagebird/objects/integrations/HSMComponentTypeTest.java @@ -11,7 +11,7 @@ public void testForValueValid() { assertEquals(HSMComponentType.BODY, HSMComponentType.forValue("body")); } - @Test(expected = IllegalArgumentException.class) + @Test(expected = NullPointerException.class) public void testForValueNull() { HSMComponentType.forValue(null); }