@@ -2,6 +2,7 @@ package handlers
22
33import (
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
0 commit comments