Files
lassistanoque/backend/internal/http/handlers/user.go
T
2026-08-31 21:23:35 +02:00

132 lines
3.6 KiB
Go

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")
}