Skip to content

Commit 28e4918

Browse files
committed
Set the bulk send to happen in parallel
1 parent 59fecc4 commit 28e4918

File tree

3 files changed

+56
-18
lines changed

3 files changed

+56
-18
lines changed

api/cmd/loadtest/main.go

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66
"log"
77
"os"
8+
"time"
89

910
"github.com/google/uuid"
1011

@@ -20,9 +21,40 @@ func main() {
2021
log.Fatal("Error loading .env file")
2122
}
2223

24+
bulkSend()
25+
}
26+
27+
func bulkSend() {
28+
var to []string
29+
for i := 0; i < 100; i++ {
30+
to = append(to, os.Getenv("HTTPSMS_TO"))
31+
}
32+
33+
var responsePayload string
34+
err := requests.
35+
URL("/v1/messages/send").
36+
Host("api.httpsms.com").
37+
// Host("localhost:8000").
38+
// Scheme("http").
39+
Header("x-api-key", os.Getenv("HTTPSMS_KEY")).
40+
BodyJSON(&map[string]any{
41+
"content": fmt.Sprintf("Bulk Load Test [%s]", time.Now().Format(time.RFC850)),
42+
"from": os.Getenv("HTTPSMS_FROM_BULK"),
43+
"to": to,
44+
"request_id": fmt.Sprintf("load-%s", uuid.NewString()),
45+
}).
46+
ToString(&responsePayload).
47+
Fetch(context.Background())
48+
if err != nil {
49+
log.Fatal(stacktrace.Propagate(err, "cannot create json payload"))
50+
}
51+
log.Println(responsePayload)
52+
}
53+
54+
func sendSingle() {
2355
for i := 0; i < 100; i++ {
2456
var responsePayload string
25-
err = requests.
57+
err := requests.
2658
URL("/v1/messages/send").
2759
Host("api.httpsms.com").
2860
// Host("localhost:8000").
@@ -39,7 +71,6 @@ func main() {
3971
if err != nil {
4072
log.Fatal(stacktrace.Propagate(err, "cannot create json payload"))
4173
}
42-
4374
log.Println(responsePayload)
4475
}
4576
}

api/pkg/handlers/message_handler.go

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package handlers
22

33
import (
44
"fmt"
5+
"sync"
56
"time"
67

78
"github.com/NdoleStudio/httpsms/pkg/entities"
@@ -136,24 +137,30 @@ func (h *MessageHandler) BulkSend(c *fiber.Ctx) error {
136137
return h.responseUnprocessableEntity(c, errors, "validation errors while sending messages")
137138
}
138139

139-
var responses []*entities.Message
140+
if msg := h.billingService.IsEntitledWithCount(ctx, h.userIDFomContext(c), uint(len(request.To))); msg != nil {
141+
ctxLogger.Warn(stacktrace.NewError(fmt.Sprintf("user with ID [%s] is not entitled to send [%d] messages", h.userIDFomContext(c), len(request.To))))
142+
return h.responsePaymentRequired(c, *msg)
143+
}
144+
145+
wg := sync.WaitGroup{}
140146
params := request.ToMessageSendParams(h.userIDFomContext(c), c.OriginalURL())
141-
for _, param := range params {
142-
if msg := h.billingService.IsEntitled(ctx, h.userIDFomContext(c)); msg != nil {
143-
ctxLogger.Warn(stacktrace.NewError(fmt.Sprintf("user with ID [%s] can't send a message", h.userIDFomContext(c))))
144-
break
145-
}
146-
147-
message, err := h.service.SendMessage(ctx, param)
148-
if err != nil {
149-
msg := fmt.Sprintf("cannot send message with paylod [%s]", c.Body())
150-
ctxLogger.Error(stacktrace.Propagate(err, msg))
151-
break
152-
}
153-
responses = append(responses, message)
147+
responses := make([]*entities.Message, len(params))
148+
149+
for index, message := range params {
150+
wg.Add(1)
151+
go func(message services.MessageSendParams, index int) {
152+
response, err := h.service.SendMessage(ctx, message)
153+
if err != nil {
154+
msg := fmt.Sprintf("cannot send message with paylod [%s]", c.Body())
155+
ctxLogger.Error(stacktrace.Propagate(err, msg))
156+
}
157+
responses[index] = response
158+
wg.Done()
159+
}(message, index)
154160
}
155161

156-
return h.responseOK(c, "messages added to queue", responses)
162+
wg.Wait()
163+
return h.responseOK(c, fmt.Sprintf("[%d] messages processed successfully", len(responses)), responses)
157164
}
158165

159166
// GetOutstanding returns an entities.Message which is still to be sent by the mobile phone

api/pkg/validators/message_handler_validator.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ func (validator MessageHandlerValidator) ValidateMessageBulkSend(ctx context.Con
127127
Rules: govalidator.MapData{
128128
"to": []string{
129129
"required",
130-
"max:50",
130+
"max:1000",
131131
"min:1",
132132
multipleContactPhoneNumberRule,
133133
},

0 commit comments

Comments
 (0)