11package handlers
22
3- import "github.com/gofiber/fiber/v2"
3+ import (
4+ "fmt"
5+
6+ "github.com/NdoleStudio/http-sms-manager/pkg/requests"
7+ "github.com/NdoleStudio/http-sms-manager/pkg/services"
8+ "github.com/NdoleStudio/http-sms-manager/pkg/telemetry"
9+ "github.com/NdoleStudio/http-sms-manager/pkg/validators"
10+ "github.com/davecgh/go-spew/spew"
11+ "github.com/gofiber/fiber/v2"
12+ "github.com/palantir/stacktrace"
13+ )
414
515// MessageHandler handles message http requests.
616type MessageHandler struct {
717 handler
18+ logger telemetry.Logger
19+ tracer telemetry.Tracer
20+ validator * validators.MessageHandlerValidator
21+ service * services.MessageService
822}
923
1024// NewMessageHandler creates a new MessageHandler
11- func NewMessageHandler () * MessageHandler {
12- return & MessageHandler {}
25+ func NewMessageHandler (
26+ logger telemetry.Logger ,
27+ tracer telemetry.Tracer ,
28+ validator * validators.MessageHandlerValidator ,
29+ service * services.MessageService ,
30+ ) (h * MessageHandler ) {
31+ return & MessageHandler {
32+ logger : logger .WithService (fmt .Sprintf ("%T" , h )),
33+ tracer : tracer ,
34+ validator : validator ,
35+ service : service ,
36+ }
1337}
1438
1539// Send a new entities.Message
@@ -20,6 +44,31 @@ func NewMessageHandler() *MessageHandler {
2044// @Produce json
2145// @Success 200 {object} responses.MessageResponse
2246// @Router /messages/send [post]
23- func (handler * MessageHandler ) Send (c * fiber.Ctx ) error {
24- return nil
47+ func (h * MessageHandler ) Send (c * fiber.Ctx ) error {
48+ ctx , span := h .tracer .StartFromFiberCtx (c )
49+ defer span .End ()
50+
51+ ctxLogger := h .tracer .CtxLogger (h .logger , span )
52+
53+ var request requests.MessageSend
54+ if err := c .BodyParser (& request ); err != nil {
55+ msg := fmt .Sprintf ("cannot marshall [%s] into %T" , c .Body (), request )
56+ ctxLogger .Warn (stacktrace .Propagate (err , msg ))
57+ return h .responseBadRequest (c , err )
58+ }
59+
60+ if errors := h .validator .ValidateMessageSend (ctx , request ); len (errors ) != 0 {
61+ msg := fmt .Sprintf ("validation errors [%s], while sending payload [%s]" , spew .Sdump (errors ), c .Body ())
62+ ctxLogger .Warn (stacktrace .NewError (msg ))
63+ return h .responseUnprocessableEntity (c , errors , "validation errors while sending message" )
64+ }
65+
66+ message , err := h .service .Send (ctx , request .ToMessageSendParams ())
67+ if err != nil {
68+ msg := fmt .Sprintf ("cannot send message with paylod [%s]" , c .Body ())
69+ ctxLogger .Error (stacktrace .Propagate (err , msg ))
70+ return h .responseInternalServerError (c )
71+ }
72+
73+ return h .responseOK (c , "Outgoing message added to queue" , message )
2574}
0 commit comments