|
4 | 4 | "fmt" |
5 | 5 | "time" |
6 | 6 |
|
| 7 | + "github.com/NdoleStudio/httpsms/pkg/entities" |
| 8 | + |
7 | 9 | "github.com/NdoleStudio/httpsms/pkg/repositories" |
8 | 10 | "github.com/google/uuid" |
9 | 11 |
|
@@ -46,6 +48,7 @@ func NewMessageHandler( |
46 | 48 | // RegisterRoutes registers the routes for the MessageHandler |
47 | 49 | func (h *MessageHandler) RegisterRoutes(router fiber.Router) { |
48 | 50 | router.Post("/messages/send", h.PostSend) |
| 51 | + router.Post("/messages/bulk-send", h.BulkSend) |
49 | 52 | router.Post("/messages/receive", h.PostReceive) |
50 | 53 | router.Get("/messages/outstanding", h.GetOutstanding) |
51 | 54 | router.Get("/messages", h.Index) |
@@ -100,6 +103,59 @@ func (h *MessageHandler) PostSend(c *fiber.Ctx) error { |
100 | 103 | return h.responseOK(c, "message added to queue", message) |
101 | 104 | } |
102 | 105 |
|
| 106 | +// BulkSend a bulk entities.Message |
| 107 | +// @Summary Send bulk SMS messages |
| 108 | +// @Description Add bulk SMS messages to be sent by the android phone |
| 109 | +// @Security ApiKeyAuth |
| 110 | +// @Tags Messages |
| 111 | +// @Accept json |
| 112 | +// @Produce json |
| 113 | +// @Param payload body requests.MessageBulkSend true "Bulk send message request payload" |
| 114 | +// @Success 200 {object} []responses.MessagesResponse |
| 115 | +// @Failure 400 {object} responses.BadRequest |
| 116 | +// @Failure 401 {object} responses.Unauthorized |
| 117 | +// @Failure 422 {object} responses.UnprocessableEntity |
| 118 | +// @Failure 500 {object} responses.InternalServerError |
| 119 | +// @Router /messages/bulk-send [post] |
| 120 | +func (h *MessageHandler) BulkSend(c *fiber.Ctx) error { |
| 121 | + ctx, span := h.tracer.StartFromFiberCtx(c) |
| 122 | + defer span.End() |
| 123 | + |
| 124 | + ctxLogger := h.tracer.CtxLogger(h.logger, span) |
| 125 | + |
| 126 | + var request requests.MessageBulkSend |
| 127 | + if err := c.BodyParser(&request); err != nil { |
| 128 | + msg := fmt.Sprintf("cannot marshall [%s] into %T", c.Body(), request) |
| 129 | + ctxLogger.Warn(stacktrace.Propagate(err, msg)) |
| 130 | + return h.responseBadRequest(c, err) |
| 131 | + } |
| 132 | + |
| 133 | + if errors := h.validator.ValidateMessageBulkSend(ctx, h.userIDFomContext(c), request.Sanitize()); len(errors) != 0 { |
| 134 | + msg := fmt.Sprintf("validation errors [%s], while sending payload [%s]", spew.Sdump(errors), c.Body()) |
| 135 | + ctxLogger.Warn(stacktrace.NewError(msg)) |
| 136 | + return h.responseUnprocessableEntity(c, errors, "validation errors while sending messages") |
| 137 | + } |
| 138 | + |
| 139 | + var responses []*entities.Message |
| 140 | + 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) |
| 154 | + } |
| 155 | + |
| 156 | + return h.responseOK(c, "messages added to queue", responses) |
| 157 | +} |
| 158 | + |
103 | 159 | // GetOutstanding returns an entities.Message which is still to be sent by the mobile phone |
104 | 160 | // @Summary Get an outstanding message |
105 | 161 | // @Description Get an outstanding message to be sent by an android phone |
|
0 commit comments