@@ -3,6 +3,10 @@ package handlers
33import (
44 "fmt"
55
6+ "github.com/NdoleStudio/http-sms-manager/pkg/requests"
7+ "github.com/NdoleStudio/http-sms-manager/pkg/validators"
8+ "github.com/davecgh/go-spew/spew"
9+
610 "github.com/NdoleStudio/http-sms-manager/pkg/services"
711 "github.com/NdoleStudio/http-sms-manager/pkg/telemetry"
812 "github.com/gofiber/fiber/v2"
@@ -12,27 +16,31 @@ import (
1216// UserHandler handles user http requests.
1317type UserHandler struct {
1418 handler
15- logger telemetry.Logger
16- tracer telemetry.Tracer
17- service * services.UserService
19+ logger telemetry.Logger
20+ tracer telemetry.Tracer
21+ validator * validators.UserHandlerValidator
22+ service * services.UserService
1823}
1924
2025// NewUserHandler creates a new UserHandler
2126func NewUserHandler (
2227 logger telemetry.Logger ,
2328 tracer telemetry.Tracer ,
29+ validator * validators.UserHandlerValidator ,
2430 service * services.UserService ,
2531) (h * UserHandler ) {
2632 return & UserHandler {
27- logger : logger .WithService (fmt .Sprintf ("%T" , h )),
28- tracer : tracer ,
29- service : service ,
33+ logger : logger .WithService (fmt .Sprintf ("%T" , h )),
34+ tracer : tracer ,
35+ validator : validator ,
36+ service : service ,
3037 }
3138}
3239
3340// RegisterRoutes registers the routes for the MessageHandler
3441func (h * UserHandler ) RegisterRoutes (router fiber.Router ) {
3542 router .Get ("/users/me" , h .Show )
43+ router .Put ("/users/me" , h .Update )
3644}
3745
3846// Show returns an entities.User
@@ -65,3 +73,46 @@ func (h *UserHandler) Show(c *fiber.Ctx) error {
6573
6674 return h .responseOK (c , "user fetched successfully" , user )
6775}
76+
77+ // Update an entities.User
78+ // @Summary Update a user
79+ // @Description Updates the details of the currently authenticated user
80+ // @Security ApiKeyAuth
81+ // @Tags Phones
82+ // @Accept json
83+ // @Produce json
84+ // @Param payload body requests.UserUpdate true "Payload of user details to update"
85+ // @Success 200 {object} responses.PhoneResponse
86+ // @Failure 400 {object} responses.BadRequest
87+ // @Failure 401 {object} responses.Unauthorized
88+ // @Failure 422 {object} responses.UnprocessableEntity
89+ // @Failure 500 {object} responses.InternalServerError
90+ // @Router /users/me [put]
91+ func (h * UserHandler ) Update (c * fiber.Ctx ) error {
92+ ctx , span := h .tracer .StartFromFiberCtx (c )
93+ defer span .End ()
94+
95+ ctxLogger := h .tracer .CtxLogger (h .logger , span )
96+
97+ var request requests.UserUpdate
98+ if err := c .BodyParser (& request ); err != nil {
99+ msg := fmt .Sprintf ("cannot marshall params [%s] into %T" , c .OriginalURL (), request )
100+ ctxLogger .Warn (stacktrace .Propagate (err , msg ))
101+ return h .responseBadRequest (c , err )
102+ }
103+
104+ if errors := h .validator .ValidateUpdate (ctx , request .Sanitize ()); len (errors ) != 0 {
105+ msg := fmt .Sprintf ("validation errors [%s], while updating user [%+#v]" , spew .Sdump (errors ), request )
106+ ctxLogger .Warn (stacktrace .NewError (msg ))
107+ return h .responseUnprocessableEntity (c , errors , "validation errors while fetching phones" )
108+ }
109+
110+ user , err := h .service .Update (ctx , h .userFromContext (c ), request .ToUpdateParams ())
111+ if err != nil {
112+ msg := fmt .Sprintf ("cannot update user with params [%+#v]" , request )
113+ ctxLogger .Error (stacktrace .Propagate (err , msg ))
114+ return h .responseInternalServerError (c )
115+ }
116+
117+ return h .responseOK (c , "user updated successfully" , user )
118+ }
0 commit comments