Skip to content

Commit d9d9b74

Browse files
committed
Add last message API
1 parent 2415737 commit d9d9b74

File tree

5 files changed

+148
-3
lines changed

5 files changed

+148
-3
lines changed

README.md

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import "github.com/NdoleStudio/smsto-go"
3030

3131
- [SMS](#sms)
3232
- `POST /sms/send`: Send single message to a number
33+
- `GET /last/message`: Get the last message that you have sent
3334

3435
## Usage
3536

@@ -65,7 +66,7 @@ if err != nil {
6566
#### `POST /sms/send`: Send single message to a number
6667

6768
```go
68-
status, response, err := client.SMS.SendSingle(context.Background(), &SmsSendSingleRequest{
69+
result, response, err := client.SMS.SendSingle(context.Background(), &SmsSendSingleRequest{
6970
Message: "This is test and \n this is a new line",
7071
To: "+35799999999999",
7172
})
@@ -74,9 +75,23 @@ if err != nil {
7475
log.Fatal(err)
7576
}
7677

77-
log.Println(status.Success) // true
78+
log.Println(result.Success) // true
7879
```
7980

81+
#### `GET /last/message`: Get the last message that you have sent
82+
83+
```go
84+
message, response, err := client.SMS.LastMessage(context.Background())
85+
86+
if err != nil {
87+
log.Fatal(err)
88+
}
89+
90+
log.Println(message.Id) // 302050741
91+
```
92+
93+
94+
8095
## Testing
8196

8297
You can run the unit tests for this client from the root directory using the command below:

internal/stubs/sms.go

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package stubs
22

3-
// SmsSendSingle is a dummy json response for the `/api/airtime/v2/` endpoint with an error
3+
// SmsSendSingle is a dummy json response for the `/api/airtime/v2/` endpoint
44
func SmsSendSingle() []byte {
55
return []byte(`
66
{
@@ -10,3 +10,35 @@ func SmsSendSingle() []byte {
1010
}
1111
`)
1212
}
13+
14+
// SmsLastMessage is a dummy JSON response for the `/last/message` endpoint
15+
func SmsLastMessage() []byte {
16+
return []byte(`
17+
{
18+
"id": 302050741,
19+
"_id": "11ec-8330-c25f5870-a614-02420a0002ab",
20+
"campaign_id": null,
21+
"user_id": 342847,
22+
"sender_id": "SMSto",
23+
"message": "This is a test message",
24+
"to": "+35799999999999",
25+
"status": "REJECTED",
26+
"client_cost": 0,
27+
"callback_url": "https://example.com/callback/handler",
28+
"scheduled_for": null,
29+
"timezone": null,
30+
"created_at": "2022-02-01T07:29:59.000000Z",
31+
"updated_at": "2022-02-01T07:30:07.000000Z",
32+
"sent_at": "2022-02-01 07:30:07",
33+
"message_id": null,
34+
"sms_count": 1,
35+
"final_callback_sent": 0,
36+
"is_api": 1,
37+
"a2_code": null,
38+
"optout": null,
39+
"failed_reason": "Invalid Number",
40+
"campaign": null,
41+
"provider": null
42+
}
43+
`)
44+
}

sms.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package smsto
22

3+
import "time"
4+
35
// SmsSendSingleResponse is the response after sending a single SMS message
46
type SmsSendSingleResponse struct {
57
Message string `json:"message"`
@@ -15,3 +17,31 @@ type SmsSendSingleRequest struct {
1517
SenderID *string `json:"sender_id,omitempty"`
1618
CallbackURL *string `json:"callback_url,omitempty"`
1719
}
20+
21+
// SmsMessage is the details of an SMS message that was sent out
22+
type SmsMessage struct {
23+
ID int `json:"id"`
24+
SecondaryID string `json:"_id"`
25+
CampaignID interface{} `json:"campaign_id"`
26+
UserID int `json:"user_id"`
27+
SenderID string `json:"sender_id"`
28+
Message string `json:"message"`
29+
To string `json:"to"`
30+
Status string `json:"status"`
31+
ClientCost int `json:"client_cost"`
32+
CallbackURL string `json:"callback_url"`
33+
ScheduledFor interface{} `json:"scheduled_for"`
34+
Timezone interface{} `json:"timezone"`
35+
CreatedAt time.Time `json:"created_at"`
36+
UpdatedAt time.Time `json:"updated_at"`
37+
SentAt string `json:"sent_at"`
38+
MessageID interface{} `json:"message_id"`
39+
SmsCount int `json:"sms_count"`
40+
FinalCallbackSent int `json:"final_callback_sent"`
41+
IsAPI int `json:"is_api"`
42+
A2Code interface{} `json:"a2_code"`
43+
OptOut interface{} `json:"optout"`
44+
FailedReason string `json:"failed_reason"`
45+
Campaign interface{} `json:"campaign"`
46+
Provider interface{} `json:"provider"`
47+
}

sms_service.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,25 @@ func (service *smsService) SendSingle(
3333

3434
return status, response, nil
3535
}
36+
37+
// LastMessage Gets the last message that you have sent
38+
//
39+
// API Docs: https://developers.sms.to/#80f14590-14cd-4512-9c8c-cf8c7ef07f96
40+
func (service *smsService) LastMessage(ctx context.Context) (*SmsMessage, *Response, error) {
41+
request, err := service.client.newRequest(ctx, http.MethodGet, "/last/message", nil)
42+
if err != nil {
43+
return nil, nil, err
44+
}
45+
46+
response, err := service.client.do(request)
47+
if err != nil {
48+
return nil, response, err
49+
}
50+
51+
status := new(SmsMessage)
52+
if err = json.Unmarshal(*response.Body, status); err != nil {
53+
return nil, response, err
54+
}
55+
56+
return status, response, nil
57+
}

sms_service_test.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,49 @@ func TestSmsService_SendSingleResponse(t *testing.T) {
8787
// Teardown
8888
server.Close()
8989
}
90+
91+
func TestSmsService_LastMessageRequest(t *testing.T) {
92+
// Setup
93+
t.Parallel()
94+
95+
// Arrange
96+
requests := make([]*http.Request, 0)
97+
apiKey := "apiKey"
98+
server := helpers.MakeRequestCapturingTestServer(http.StatusOK, [][]byte{stubs.SmsLastMessage()}, &requests)
99+
client := New(WithBaseURL(server.URL), WithAPIKey(apiKey))
100+
101+
// Act
102+
_, _, err := client.SMS.LastMessage(context.Background())
103+
104+
// Assert
105+
assert.Nil(t, err)
106+
107+
assert.Equal(t, 1, len(requests))
108+
109+
assert.Equal(t, "Bearer "+apiKey, requests[0].Header.Get("Authorization"))
110+
}
111+
112+
func TestSmsService_LastMessageResponse(t *testing.T) {
113+
// Setup
114+
t.Parallel()
115+
116+
// Arrange
117+
server := helpers.MakeTestServer(http.StatusOK, stubs.SmsLastMessage())
118+
client := New(WithBaseURL(server.URL))
119+
120+
// Act
121+
result, response, err := client.SMS.LastMessage(context.Background())
122+
123+
// Assert
124+
assert.Nil(t, err)
125+
assert.Equal(t, http.StatusOK, response.HTTPResponse.StatusCode)
126+
127+
var smsMessage SmsMessage
128+
err = json.Unmarshal(stubs.SmsLastMessage(), &smsMessage)
129+
assert.Nil(t, err)
130+
131+
assert.Equal(t, &smsMessage, result)
132+
133+
// Teardown
134+
server.Close()
135+
}

0 commit comments

Comments
 (0)