Skip to content

Commit f7108e2

Browse files
author
Dirk Hoekstra
authored
Merge pull request #14 from messagebird/add-mms
Add mms functionality
2 parents 3fd2d0c + 59f8bc3 commit f7108e2

File tree

3 files changed

+242
-1
lines changed

3 files changed

+242
-1
lines changed

client.go

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import (
2222

2323
const (
2424
// ClientVersion is used in User-Agent request header to provide server with API level.
25-
ClientVersion = "4.0.0"
25+
ClientVersion = "4.1.0"
2626

2727
// Endpoint points you to MessageBird REST API.
2828
Endpoint = "https://rest.messagebird.com"
@@ -207,6 +207,42 @@ func (c *Client) NewMessage(originator string, recipients []string, body string,
207207
return message, nil
208208
}
209209

210+
// MMSMessage retrieves the information of an existing MmsMessage.
211+
func (c *Client) MMSMessage(id string) (*MMSMessage, error) {
212+
mmsMessage := &MMSMessage{}
213+
if err := c.request(mmsMessage, "mms/"+id, nil); err != nil {
214+
if err == ErrResponse {
215+
return mmsMessage, err
216+
}
217+
218+
return nil, err
219+
}
220+
221+
return mmsMessage, nil
222+
}
223+
224+
// NewMMSMessage creates a new MMS message for one or more recipients.
225+
func (c *Client) NewMMSMessage(originator string, recipients []string, msgParams *MMSMessageParams) (*MMSMessage, error) {
226+
params, err := paramsForMMSMessage(msgParams)
227+
if err != nil {
228+
return nil, err
229+
}
230+
231+
params.Set("originator", originator)
232+
params.Set("recipients", strings.Join(recipients, ","))
233+
234+
mmsMessage := &MMSMessage{}
235+
if err := c.request(mmsMessage, "mms", params); err != nil {
236+
if err == ErrResponse {
237+
return mmsMessage, err
238+
}
239+
240+
return nil, err
241+
}
242+
243+
return mmsMessage, nil
244+
}
245+
210246
// VoiceMessage retrieves the information of an existing VoiceMessage.
211247
func (c *Client) VoiceMessage(id string) (*VoiceMessage, error) {
212248
message := &VoiceMessage{}

mms_message.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package messagebird
2+
3+
import (
4+
"errors"
5+
"net/url"
6+
"strings"
7+
"time"
8+
)
9+
10+
// MMSMessage represents a MMS Message.
11+
type MMSMessage struct {
12+
ID string
13+
HRef string
14+
Direction string
15+
Originator string
16+
Body string
17+
Reference string
18+
Subject string
19+
MediaUrls []string
20+
ScheduledDatetime *time.Time
21+
CreatedDatetime *time.Time
22+
Recipients Recipients
23+
Errors []Error
24+
}
25+
26+
// MMSMessageParams represents the parameters that can be supplied when creating
27+
// a request.
28+
type MMSMessageParams struct {
29+
Body string
30+
MediaUrls []string
31+
Subject string
32+
Reference string
33+
ScheduledDatetime time.Time
34+
}
35+
36+
// paramsForMMSMessage converts the specified MMSMessageParams struct to a
37+
// url.Values pointer and returns it.
38+
func paramsForMMSMessage(params *MMSMessageParams) (*url.Values, error) {
39+
urlParams := &url.Values{}
40+
41+
if params.Body == "" && params.MediaUrls == nil {
42+
return nil, errors.New("Body or MediaUrls is required")
43+
}
44+
if params.Body != "" {
45+
urlParams.Set("body", params.Body)
46+
}
47+
if params.MediaUrls != nil {
48+
urlParams.Set("mediaUrls[]", strings.Join(params.MediaUrls, ","))
49+
}
50+
if params.Subject != "" {
51+
urlParams.Set("subject", params.Subject)
52+
}
53+
if params.Reference != "" {
54+
urlParams.Set("reference", params.Reference)
55+
}
56+
if params.ScheduledDatetime.Unix() > 0 {
57+
urlParams.Set("scheduledDatetime", params.ScheduledDatetime.Format(time.RFC3339))
58+
}
59+
60+
return urlParams, nil
61+
}

mms_message_test.go

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
package messagebird
2+
3+
import (
4+
"testing"
5+
"time"
6+
)
7+
8+
var mmsMessageObject = []byte(`{
9+
"id": "6d9e7100b1f9406c81a3c303c30ccf05",
10+
"href": "https://rest.messagebird.com/mms/6d9e7100b1f9406c81a3c303c30ccf05",
11+
"direction": "mt",
12+
"originator": "TestName",
13+
"subject": "TestSubject",
14+
"body": "Hello World",
15+
"mediaUrls": ["http://w3.org/1.gif", "http://w3.org/2.gif"],
16+
"reference": "TestReference",
17+
"scheduledDatetime": null,
18+
"createdDatetime": "2017-10-20T12:50:28+00:00",
19+
"recipients": {
20+
"totalCount": 1,
21+
"totalSentCount": 1,
22+
"totalDeliveredCount": 0,
23+
"totalDeliveryFailedCount": 0,
24+
"items": [
25+
{
26+
"recipient": 31612345678,
27+
"status": "sent",
28+
"statusDatetime": "2017-10-20T12:50:28+00:00"
29+
}
30+
]
31+
}
32+
}`)
33+
34+
func TestNewMMSMessage(t *testing.T) {
35+
SetServerResponse(200, mmsMessageObject)
36+
37+
params := &MMSMessageParams{
38+
Body: "Hello World",
39+
MediaUrls: []string{"http://w3.org/1.gif", "http://w3.org/2.gif"},
40+
Subject: "TestSubject",
41+
Reference: "TestReference",
42+
ScheduledDatetime: time.Now(),
43+
}
44+
mmsMessage, err := mbClient.NewMMSMessage("TestName", []string{"31612345678"}, params)
45+
46+
if err != nil {
47+
t.Fatalf("Didn't expect error while creating a new MMS message: %s", err)
48+
}
49+
if mmsMessage.ID != "6d9e7100b1f9406c81a3c303c30ccf05" {
50+
t.Errorf("Unexpected mmsMessage id: %s", mmsMessage.ID)
51+
}
52+
if mmsMessage.HRef != "https://rest.messagebird.com/mms/6d9e7100b1f9406c81a3c303c30ccf05" {
53+
t.Errorf("Unexpected mmsMessage href: %s", mmsMessage.HRef)
54+
}
55+
if mmsMessage.Direction != "mt" {
56+
t.Errorf("Unexpected mmsMessage direction: %s", mmsMessage.Direction)
57+
}
58+
if mmsMessage.Originator != "TestName" {
59+
t.Errorf("Unexpected mmsMessage originator: %s", mmsMessage.Originator)
60+
}
61+
if mmsMessage.Body != "Hello World" {
62+
t.Errorf("Unexpected mmsMessage body: %s", mmsMessage.Body)
63+
}
64+
if mmsMessage.MediaUrls[0] != "http://w3.org/1.gif" {
65+
t.Errorf("Unexpected mmsMessage mediaUrl: %s", mmsMessage.MediaUrls[0])
66+
}
67+
if mmsMessage.MediaUrls[1] != "http://w3.org/2.gif" {
68+
t.Errorf("Unexpected mmsMessage mediaUrl: %s", mmsMessage.MediaUrls[1])
69+
}
70+
if mmsMessage.Reference != "TestReference" {
71+
t.Errorf("Unexpected mmsMessage reference: %s", mmsMessage.Reference)
72+
}
73+
if mmsMessage.Subject != "TestSubject" {
74+
t.Errorf("Unexpected mmsMessage reference: %s", mmsMessage.Subject)
75+
}
76+
if mmsMessage.ScheduledDatetime != nil {
77+
t.Errorf("Unexpected mmsMessage scheduled datetime: %s", mmsMessage.ScheduledDatetime)
78+
}
79+
if mmsMessage.CreatedDatetime == nil || mmsMessage.CreatedDatetime.Format(time.RFC3339) != "2017-10-20T12:50:28Z" {
80+
t.Errorf("Unexpected mmsMessage created datetime: %s", mmsMessage.CreatedDatetime)
81+
}
82+
if mmsMessage.Recipients.TotalCount != 1 {
83+
t.Fatalf("Unexpected number of total count: %d", mmsMessage.Recipients.TotalCount)
84+
}
85+
if mmsMessage.Recipients.TotalSentCount != 1 {
86+
t.Errorf("Unexpected number of total sent count: %d", mmsMessage.Recipients.TotalSentCount)
87+
}
88+
if mmsMessage.Recipients.Items[0].Recipient != 31612345678 {
89+
t.Errorf("Unexpected mmsMessage recipient: %d", mmsMessage.Recipients.Items[0].Recipient)
90+
}
91+
if mmsMessage.Recipients.Items[0].Status != "sent" {
92+
t.Errorf("Unexpected mmsMessage recipient status: %s", mmsMessage.Recipients.Items[0].Status)
93+
}
94+
if mmsMessage.Recipients.Items[0].StatusDatetime == nil || mmsMessage.Recipients.Items[0].StatusDatetime.Format(time.RFC3339) != "2017-10-20T12:50:28Z" {
95+
t.Errorf("Unexpected datetime status for mmsMessage recipient: %s", mmsMessage.Recipients.Items[0].StatusDatetime.Format(time.RFC3339))
96+
}
97+
if len(mmsMessage.Errors) != 0 {
98+
t.Errorf("Unexpected number of errors in mmsMessage: %d", len(mmsMessage.Errors))
99+
}
100+
}
101+
102+
func TestNewMMSMessageError(t *testing.T) {
103+
SetServerResponse(405, accessKeyErrorObject)
104+
105+
params := &MMSMessageParams{
106+
Body: "Hello World",
107+
MediaUrls: nil,
108+
Subject: "",
109+
Reference: "",
110+
ScheduledDatetime: time.Now(),
111+
}
112+
mmsMessage, err := mbClient.NewMMSMessage("TestName", []string{"31612345678"}, params)
113+
114+
if err != ErrResponse {
115+
t.Fatalf("Expected ErrResponse to be returned, instead I got %s", err)
116+
}
117+
if len(mmsMessage.Errors) != 1 {
118+
t.Fatalf("Unexpected number of errors: %d", len(mmsMessage.Errors))
119+
}
120+
if mmsMessage.Errors[0].Code != 2 {
121+
t.Errorf("Unexpected error code: %d", mmsMessage.Errors[0].Code)
122+
}
123+
if mmsMessage.Errors[0].Parameter != "access_key" {
124+
t.Errorf("Unexpected error parameter %s", mmsMessage.Errors[0].Parameter)
125+
}
126+
}
127+
128+
func TestNewMMSMessageWithEmptyParams(t *testing.T) {
129+
params := &MMSMessageParams{
130+
Body: "",
131+
MediaUrls: nil,
132+
Subject: "",
133+
Reference: "",
134+
ScheduledDatetime: time.Now(),
135+
}
136+
_, err := mbClient.NewMMSMessage("TestName", []string{"31612345678"}, params)
137+
138+
if err == nil {
139+
t.Fatalf("Expected error to be returned, instead I got nil")
140+
}
141+
if err.Error() != "Body or MediaUrls is required" {
142+
t.Errorf("Unexpected error message, I got %s", err)
143+
}
144+
}

0 commit comments

Comments
 (0)