package handlers import ( "net/http" "github.com/labstack/echo/v5" "trankilou.fr/lassistanoque/backend/internal/domain" "trankilou.fr/lassistanoque/backend/internal/service/auth" "trankilou.fr/lassistanoque/backend/internal/service/user" ) func NewUserGroup(prefix string, e *echo.Group, service *user.Service, middlewares ...echo.MiddlewareFunc) *echo.Group { userHandler := &UserHandler{ userService: service, } _ = userHandler auth := e.Group(prefix, middlewares...) auth.GET("/me", userHandler.Me) auth.PUT("/:id", userHandler.Update) return auth } type UserHandler struct { userService *user.Service } func (h UserHandler) Me(c *echo.Context) error { userID := c.Get(auth.ContextUserIDKey).(string) user, err := h.userService.GetUser(userID) if err != nil { return echo.NewHTTPError(http.StatusUnauthorized, err.Error()) } return c.JSON(http.StatusOK, user) } func (h UserHandler) Update(c *echo.Context) error { userID := c.Get(auth.ContextUserIDKey).(string) id := c.Param("id") var updUser domain.User if err := c.Bind(&updUser); err != nil { return c.String(http.StatusBadRequest, "bad request") } updUser.ID = id isAdmin := false // TODO : check if caller is admin if !(isAdmin || userID == id) { return echo.NewHTTPError(http.StatusForbidden, "unauthorized to update user") } user, err := h.userService.UpdateUser(&updUser, isAdmin) if err != nil { return c.String(http.StatusBadRequest, err.Error()) } return c.JSON(http.StatusOK, user) }