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);
}