Skip to content

Commit 87fa582

Browse files
committed
Return 404 when message is not found
1 parent d7f7eec commit 87fa582

File tree

4 files changed

+47
-22
lines changed

4 files changed

+47
-22
lines changed

api/pkg/handlers/message_handler.go

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ package handlers
33
import (
44
"fmt"
55

6+
"github.com/NdoleStudio/http-sms-manager/pkg/repositories"
7+
"github.com/google/uuid"
8+
69
"github.com/NdoleStudio/http-sms-manager/pkg/requests"
710
"github.com/NdoleStudio/http-sms-manager/pkg/services"
811
"github.com/NdoleStudio/http-sms-manager/pkg/telemetry"
@@ -52,9 +55,9 @@ func (h *MessageHandler) RegisterRoutes(router fiber.Router) {
5255
// @Produce json
5356
// @Param payload body requests.MessageSend true "PostSend message request payload"
5457
// @Success 200 {object} responses.MessageResponse
55-
// @Success 400 {object} responses.BadRequest
56-
// @Success 422 {object} responses.UnprocessableEntity
57-
// @Success 500 {object} responses.InternalServerError
58+
// @Failure 400 {object} responses.BadRequest
59+
// @Failure 422 {object} responses.UnprocessableEntity
60+
// @Failure 500 {object} responses.InternalServerError
5861
// @Router /messages/send [post]
5962
func (h *MessageHandler) PostSend(c *fiber.Ctx) error {
6063
ctx, span := h.tracer.StartFromFiberCtx(c)
@@ -93,9 +96,9 @@ func (h *MessageHandler) PostSend(c *fiber.Ctx) error {
9396
// @Produce json
9497
// @Param limit query int false "Number of outstanding messages to return" minimum(1) maximum(10)
9598
// @Success 200 {object} responses.MessagesResponse
96-
// @Success 400 {object} responses.BadRequest
97-
// @Success 422 {object} responses.UnprocessableEntity
98-
// @Success 500 {object} responses.InternalServerError
99+
// @Failure 400 {object} responses.BadRequest
100+
// @Failure 422 {object} responses.UnprocessableEntity
101+
// @Failure 500 {object} responses.InternalServerError
99102
// @Router /messages/outstanding [get]
100103
func (h *MessageHandler) GetOutstanding(c *fiber.Ctx) error {
101104
ctx, span := h.tracer.StartFromFiberCtx(c)
@@ -138,9 +141,9 @@ func (h *MessageHandler) GetOutstanding(c *fiber.Ctx) error {
138141
// @Param query query string false "filter messages containing query"
139142
// @Param limit query int false "number of messages to return" minimum(1) maximum(20)
140143
// @Success 200 {object} responses.MessagesResponse
141-
// @Success 400 {object} responses.BadRequest
142-
// @Success 422 {object} responses.UnprocessableEntity
143-
// @Success 500 {object} responses.InternalServerError
144+
// @Failure 400 {object} responses.BadRequest
145+
// @Failure 422 {object} responses.UnprocessableEntity
146+
// @Failure 500 {object} responses.InternalServerError
144147
// @Router /messages [get]
145148
func (h *MessageHandler) Index(c *fiber.Ctx) error {
146149
ctx, span := h.tracer.StartFromFiberCtx(c)
@@ -180,9 +183,10 @@ func (h *MessageHandler) Index(c *fiber.Ctx) error {
180183
// @Param messageID path string true "ID of the message" default(32343a19-da5e-4b1b-a767-3298a73703ca)
181184
// @Param payload body requests.MessageEvent true "Payload of the event emitted."
182185
// @Success 200 {object} responses.MessageResponse
183-
// @Success 400 {object} responses.BadRequest
184-
// @Success 422 {object} responses.UnprocessableEntity
185-
// @Success 500 {object} responses.InternalServerError
186+
// @Failure 400 {object} responses.BadRequest
187+
// @Failure 404 {object} responses.NotFound
188+
// @Failure 422 {object} responses.UnprocessableEntity
189+
// @Failure 500 {object} responses.InternalServerError
186190
// @Router /messages/{messageID}/events [post]
187191
func (h *MessageHandler) PostEvent(c *fiber.Ctx) error {
188192
ctx, span := h.tracer.StartFromFiberCtx(c)
@@ -205,7 +209,12 @@ func (h *MessageHandler) PostEvent(c *fiber.Ctx) error {
205209
return h.responseUnprocessableEntity(c, errors, "validation errors while storing event")
206210
}
207211

208-
message, err := h.service.StoreEvent(ctx, request.ToMessageStoreEventParams(c.OriginalURL()))
212+
message, err := h.service.GetMessage(ctx, uuid.MustParse(request.MessageID))
213+
if err != nil && stacktrace.GetCode(err) == repositories.ErrCodeNotFound {
214+
return h.responseNotFound(c, fmt.Sprintf("cannot find message with ID [%s]", request.MessageID))
215+
}
216+
217+
message, err = h.service.StoreEvent(ctx, message, request.ToMessageStoreEventParams(c.OriginalURL()))
209218
if err != nil {
210219
msg := fmt.Sprintf("cannot store event for message [%s] with paylod [%s]", request.MessageID, c.Body())
211220
ctxLogger.Error(stacktrace.Propagate(err, msg))

api/pkg/handlers/message_thread_handler.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,9 @@ func (h *MessageThreadHandler) RegisterRoutes(router fiber.Router) {
5252
// @Param query query string false "filter message threads containing query"
5353
// @Param limit query int false "number of messages to return" minimum(1) maximum(20)
5454
// @Success 200 {object} responses.MessageThreadsResponse
55-
// @Success 400 {object} responses.BadRequest
56-
// @Success 422 {object} responses.UnprocessableEntity
57-
// @Success 500 {object} responses.InternalServerError
55+
// @Failure 400 {object} responses.BadRequest
56+
// @Failure 422 {object} responses.UnprocessableEntity
57+
// @Failure 500 {object} responses.InternalServerError
5858
// @Router /message-threads [get]
5959
func (h *MessageThreadHandler) Index(c *fiber.Ctx) error {
6060
ctx, span := h.tracer.StartFromFiberCtx(c)

api/pkg/responses/response.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@ type InternalServerError struct {
1111
Message string `json:"message" example:"We ran into an internal error while handling the request."`
1212
}
1313

14+
// NotFound is the response with status code is 404
15+
type NotFound struct {
16+
Status string `json:"status" example:"error"`
17+
Message string `json:"message" example:"cannot find message with ID [32343a19-da5e-4b1b-a767-3298a73703ca]"`
18+
}
19+
1420
// BadRequest is the response with status code is 400
1521
type BadRequest struct {
1622
Status string `json:"status" example:"error"`

api/pkg/services/message_service.go

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,20 @@ func (service *MessageService) GetMessages(ctx context.Context, params MessageGe
8686
return messages, nil
8787
}
8888

89+
// GetMessage fetches a message by the ID
90+
func (service *MessageService) GetMessage(ctx context.Context, messageID uuid.UUID) (*entities.Message, error) {
91+
ctx, span := service.tracer.Start(ctx)
92+
defer span.End()
93+
94+
message, err := service.repository.Load(ctx, messageID)
95+
if err != nil {
96+
msg := fmt.Sprintf("could not fetch messages with ID [%s]", messageID)
97+
return nil, service.tracer.WrapErrorSpan(span, stacktrace.PropagateWithCode(err, stacktrace.GetCode(err), msg))
98+
}
99+
100+
return message, nil
101+
}
102+
89103
// MessageStorePhoneEventParams parameters registering a message event
90104
type MessageStorePhoneEventParams struct {
91105
MessageID uuid.UUID
@@ -95,15 +109,11 @@ type MessageStorePhoneEventParams struct {
95109
}
96110

97111
// StoreEvent handles event generated by a mobile phone
98-
func (service *MessageService) StoreEvent(ctx context.Context, params MessageStorePhoneEventParams) (*entities.Message, error) {
112+
func (service *MessageService) StoreEvent(ctx context.Context, message *entities.Message, params MessageStorePhoneEventParams) (*entities.Message, error) {
99113
ctx, span := service.tracer.Start(ctx)
100114
defer span.End()
101115

102-
message, err := service.repository.Load(ctx, params.MessageID)
103-
if err != nil {
104-
msg := fmt.Sprintf("could not fetch messages with parms [%+#v]", params)
105-
return nil, service.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
106-
}
116+
var err error
107117

108118
switch params.EventName {
109119
case entities.MessageEventNameSent:

0 commit comments

Comments
 (0)