178 lines
5.8 KiB
Go
178 lines
5.8 KiB
Go
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))
|
||
}
|
||
}
|