MCPcopy Index your code
hub / github.com/NdoleStudio/httpsms / PostEvent

Method PostEvent

api/pkg/handlers/message_handler.go:292–340  ·  view source on GitHub ↗

PostEvent registers an event on a message @Summary Upsert an event for a message on the mobile phone @Description Use this endpoint to send events for a message when it is failed, sent or delivered by the mobile phone. @Security ApiKeyAuth @Tags Messages @Accept json @Produce

(c fiber.Ctx)

Source from the content-addressed store, hash-verified

290// @Failure 500 {object} responses.InternalServerError
291// @Router /messages/{messageID}/events [post]
292func (h *MessageHandler) PostEvent(c fiber.Ctx) error {
293 ctx, span := h.tracer.StartFromFiberCtx(c)
294 defer span.End()
295
296 ctxLogger := h.tracer.CtxLogger(h.logger, span)
297
298 var request requests.MessageEvent
299 if err := c.Bind().Body(&request); err != nil {
300 msg := fmt.Sprintf("cannot marshall [%s] into %T", c.Body(), request)
301 ctxLogger.Warn(stacktrace.Propagate(err, msg))
302 return h.responseBadRequest(c, err)
303 }
304
305 request.MessageID = c.Params("messageID")
306 if strings.Contains(request.MessageID, ".") {
307 return h.responseNoContent(c, "duplicate send event received.")
308 }
309
310 if errors := h.validator.ValidateMessageEvent(ctx, request.Sanitize()); len(errors) != 0 {
311 msg := fmt.Sprintf("validation errors [%s], while storing event [%s] for message [%s]", spew.Sdump(errors), c.Body(), request.MessageID)
312 ctxLogger.Warn(stacktrace.NewError(msg))
313 return h.responseUnprocessableEntity(c, errors, "validation errors while storing event")
314 }
315
316 message, err := h.service.GetMessage(ctx, h.userIDFomContext(c), uuid.MustParse(request.MessageID))
317 if err != nil && stacktrace.GetCode(err) == repositories.ErrCodeNotFound {
318 return h.responseNotFound(c, fmt.Sprintf("cannot find message with ID [%s]", request.MessageID))
319 }
320
321 if err != nil {
322 msg := fmt.Sprintf("cannot find message with id [%s]", request.MessageID)
323 ctxLogger.Error(h.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg)))
324 return h.responseInternalServerError(c)
325 }
326
327 if !h.authorizePhoneAPIKey(c, message.Owner) {
328 ctxLogger.Warn(stacktrace.NewError(fmt.Sprintf("user with ID [%s] is not authorized to send event for message with ID [%s]", h.userIDFomContext(c), request.MessageID)))
329 return h.responsePhoneAPIKeyUnauthorized(c, message.Owner, h.userFromContext(c))
330 }
331
332 message, err = h.service.StoreEvent(ctx, message, request.ToMessageStoreEventParams(c.OriginalURL()))
333 if err != nil {
334 msg := fmt.Sprintf("cannot store event for message [%s] with paylod [%s]", request.MessageID, c.Body())
335 ctxLogger.Error(h.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg)))
336 return h.responseInternalServerError(c)
337 }
338
339 return h.responseOK(c, "message event stored successfully", message)
340}
341
342// PostReceive receives a new entities.Message
343// @Summary Receive a new SMS message from a mobile phone

Callers

nothing calls this directly

Calls 15

SanitizeMethod · 0.95
responseBadRequestMethod · 0.80
responseNoContentMethod · 0.80
ValidateMessageEventMethod · 0.80
GetMessageMethod · 0.80
userIDFomContextMethod · 0.80
responseNotFoundMethod · 0.80
authorizePhoneAPIKeyMethod · 0.80

Tested by

no test coverage detected