wishli-api/api/handlers/user_handler.go
2025-03-23 20:05:51 +03:00

178 lines
5.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package handlers
import (
"net/http"
"wish-list-api/api/presenter"
"wish-list-api/pkg/entities"
"wish-list-api/pkg/user"
"github.com/gofiber/fiber/v2"
"github.com/pkg/errors"
)
// @Summary Добавить нового пользователя
// @Description Создает нового пользователя в системе
// @Tags users
// @Accept json
// @Produce json
// @Param user body entities.User true "Информация о пользователе"
// @Success 200 {object} presenter.UserResponse
// @Failure 400 {object} presenter.UserResponse
// @Failure 500 {object} presenter.UserResponse
// @Router /users [post]
func CreateUser(service user.Service) fiber.Handler {
return func(c *fiber.Ctx) error {
var requestBody entities.User
err := c.BodyParser(&requestBody)
if err != nil {
c.Status(http.StatusBadRequest)
return c.JSON(presenter.UserErrorResponse(err))
}
if requestBody.Email == "" || requestBody.Password == "" {
c.Status(http.StatusInternalServerError)
return c.JSON(presenter.UserErrorResponse(errors.New(
"Please specify email and password")))
}
result, err := service.CreateUser(&requestBody)
if err != nil {
c.Status(http.StatusInternalServerError)
return c.JSON(presenter.UserErrorResponse(err))
}
return c.JSON(presenter.UserSuccessResponse(result))
}
}
// @Summary Обновить пользователя
// @Description Обновляет информацию о существующем пользователе
// @Tags users
// @Accept json
// @Produce json
// @Security BearerAuth
// @Param user body entities.User true "Информация о пользователе для обновления"
// @Success 200 {object} presenter.UserResponse
// @Failure 400 {object} presenter.UserResponse
// @Failure 500 {object} presenter.UserResponse
// @Router /users [put]
func UpdateUser(service user.Service) fiber.Handler {
return func(c *fiber.Ctx) error {
var requestBody entities.User
err := c.BodyParser(&requestBody)
if err != nil {
c.Status(http.StatusBadRequest)
return c.JSON(presenter.UserErrorResponse(err))
}
result, err := service.UpdateUser(&requestBody)
if err != nil {
c.Status(http.StatusInternalServerError)
return c.JSON(presenter.UserErrorResponse(err))
}
return c.JSON(presenter.UserSuccessResponse(result))
}
}
// @Summary Удалить пользователя
// @Description Удаляет пользователя из системы по ID
// @Tags users
// @Accept json
// @Produce json
// @Security BearerAuth
// @Param request body entities.DeleteUserRequest true "ID пользователя для удаления"
// @Success 200 {object} presenter.UserResponse
// @Failure 400 {object} presenter.UserResponse
// @Failure 500 {object} presenter.UserResponse
// @Router /users [delete]
func DeleteUser(service user.Service) fiber.Handler {
return func(c *fiber.Ctx) error {
var requestBody entities.DeleteUserRequest
err := c.BodyParser(&requestBody)
if err != nil {
c.Status(http.StatusBadRequest)
return c.JSON(presenter.UserErrorResponse(err))
}
userID := requestBody.ID
err = service.DeleteUser(userID)
if err != nil {
c.Status(http.StatusInternalServerError)
return c.JSON(presenter.UserErrorResponse(err))
}
return c.JSON(presenter.UserSuccessResponse(nil))
}
}
// @Summary Получить всех пользователей
// @Description Возвращает список всех пользователей в системе
// @Tags users
// @Accept json
// @Produce json
// @Security BearerAuth
// @Success 200 {object} presenter.UsersResponse
// @Failure 500 {object} presenter.UserResponse
// @Router /users [get]
func GetAllUsers(service user.Service) fiber.Handler {
return func(c *fiber.Ctx) error {
fetched, err := service.GetAllUsers()
if err != nil {
c.Status(http.StatusInternalServerError)
return c.JSON(presenter.UserErrorResponse(err))
}
return c.JSON(presenter.UsersSuccessResponse(fetched))
}
}
// @Summary Получить пользователя по ID
// @Description Возвращает информацию о пользователе по его ID
// @Tags users
// @Accept json
// @Produce json
// @Security BearerAuth
// @Param id path string true "ID пользователя"
// @Success 200 {object} presenter.UserResponse
// @Failure 400 {object} presenter.UserResponse
// @Failure 500 {object} presenter.UserResponse
// @Router /users/{id} [get]
func GetUserByID(service user.Service) fiber.Handler {
return func(c *fiber.Ctx) error {
id := c.Params("id")
if id == "" {
c.Status(http.StatusBadRequest)
return c.JSON(presenter.UserErrorResponse(errors.New("id is required")))
}
result, err := service.GetUser(id)
if err != nil {
c.Status(http.StatusInternalServerError)
return c.JSON(presenter.UserErrorResponse(err))
}
return c.JSON(presenter.UserSuccessResponse(result))
}
}
// @Summary Получить пользователя по Email
// @Description Возвращает информацию о пользователе по его Email
// @Tags users
// @Accept json
// @Produce json
// @Security BearerAuth
// @Param email path string true "Email пользователя"
// @Success 200 {object} presenter.UserResponse
// @Failure 400 {object} presenter.UserResponse
// @Failure 500 {object} presenter.UserResponse
// @Router /users/email/{email} [get]
func GetUserByEmail(service user.Service) fiber.Handler {
return func(c *fiber.Ctx) error {
email := c.Params("email")
if email == "" {
c.Status(http.StatusBadRequest)
return c.JSON(presenter.UserErrorResponse(errors.New("email is required")))
}
result, err := service.GetUserByEmail(email)
if err != nil {
c.Status(http.StatusInternalServerError)
return c.JSON(presenter.UserErrorResponse(err))
}
return c.JSON(presenter.UserSuccessResponse(result))
}
}