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