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, } auth := e.Group(prefix, middlewares...) auth.GET("/me", userHandler.Me) auth.PUT("/:id", userHandler.Update) auth.GET("/:id/address", userHandler.Addresses) auth.POST("/:id/address", userHandler.CreateAddress) auth.PUT("/:id/address", userHandler.UpdateAddress) auth.DELETE("/:id/address/:address", userHandler.DeleteAddress) 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.GetUserWithTeams(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 if !(userID == id) { return echo.NewHTTPError(http.StatusForbidden, "unauthorized to update user") } user, err := h.userService.UpdateUser(&updUser, false) if err != nil { return c.String(http.StatusBadRequest, err.Error()) } return c.JSON(http.StatusOK, user) } func (h UserHandler) Addresses(c *echo.Context) error { userID := c.Get(auth.ContextUserIDKey).(string) id := c.Param("id") if !(userID == id) { return echo.NewHTTPError(http.StatusForbidden, "forbidden") } addresses, err := h.userService.ListAdresses(userID) if err != nil { return echo.NewHTTPError(http.StatusInternalServerError, err.Error()) } return c.JSON(http.StatusOK, addresses) } func (h UserHandler) CreateAddress(c *echo.Context) error { userID := c.Get(auth.ContextUserIDKey).(string) id := c.Param("id") if !(userID == id) { return echo.NewHTTPError(http.StatusForbidden, "forbidden") } var address domain.UserAddress if err := c.Bind(&address); err != nil { return c.String(http.StatusBadRequest, "bad request") } address.UserID = userID newaddress, err := h.userService.AddAddress(userID, address.Type, address.Address) if err != nil { return echo.NewHTTPError(http.StatusInternalServerError, "internal error") } return c.JSON(http.StatusOK, newaddress) } func (h UserHandler) UpdateAddress(c *echo.Context) error { userID := c.Get(auth.ContextUserIDKey).(string) id := c.Param("id") if !(userID == id) { return echo.NewHTTPError(http.StatusForbidden, "forbidden") } var address domain.UserAddress if err := c.Bind(&address); err != nil { return c.String(http.StatusBadRequest, "bad request") } address.UserID = userID newaddress, err := h.userService.UpdateAddress(userID, &address) if err != nil { return echo.NewHTTPError(http.StatusInternalServerError, "internal error") } return c.JSON(http.StatusOK, newaddress) } func (h UserHandler) DeleteAddress(c *echo.Context) error { userID := c.Get(auth.ContextUserIDKey).(string) id := c.Param("id") addressID := c.Param("address") if !(userID == id) { return echo.NewHTTPError(http.StatusForbidden, "forbidden") } err := h.userService.DeleteAddress(userID, addressID) if err != nil { return echo.NewHTTPError(http.StatusInternalServerError, "internal error") } return c.JSON(http.StatusOK, "deleted") }