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)
| 290 | // @Failure 500 {object} responses.InternalServerError |
| 291 | // @Router /messages/{messageID}/events [post] |
| 292 | func (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 |
nothing calls this directly
no test coverage detected