login.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package auth
  2. import (
  3. "database/sql"
  4. "errors"
  5. "git.dmitriygnatenko.ru/dima/go-common/logger"
  6. "github.com/go-playground/validator/v10"
  7. "github.com/gofiber/fiber/v2"
  8. "git.dmitriygnatenko.ru/dima/homethings/internal/dto"
  9. "git.dmitriygnatenko.ru/dima/homethings/internal/factory"
  10. "git.dmitriygnatenko.ru/dima/homethings/internal/mappers"
  11. )
  12. // @Router /api/v1/auth/login [post]
  13. // @Param data body dto.LoginRequest true "Request body"
  14. // @Success 200 {object} dto.LoginResponse
  15. // @Failure 400 {object} dto.ErrorResponse
  16. // @Failure 403 {object} dto.ErrorResponse
  17. // @Failure 500 {object} dto.ErrorResponse
  18. // @Summary Log in user
  19. // @Tags Auth
  20. // @Accept json
  21. // @Produce json
  22. func LoginHandler(
  23. authService AuthService,
  24. userRepository UserRepository,
  25. ) fiber.Handler {
  26. return func(fctx *fiber.Ctx) error {
  27. ctx := fctx.Context()
  28. req := dto.LoginRequest{}
  29. if err := fctx.BodyParser(&req); err != nil {
  30. logger.Info(ctx, err.Error())
  31. return fiber.NewError(fiber.StatusBadRequest, err.Error())
  32. }
  33. var validate = validator.New()
  34. if err := validate.Struct(req); err != nil {
  35. logger.Info(ctx, err.Error())
  36. return fctx.Status(fiber.StatusBadRequest).JSON(factory.CreateValidateErrorResponse(err))
  37. }
  38. user, err := userRepository.Get(ctx, req.Username)
  39. if err != nil {
  40. if errors.Is(err, sql.ErrNoRows) {
  41. logger.Info(ctx, err.Error())
  42. return fiber.NewError(fiber.StatusForbidden, "")
  43. }
  44. logger.Error(ctx, err.Error())
  45. return fiber.NewError(fiber.StatusInternalServerError, err.Error())
  46. }
  47. if !authService.IsCorrectPassword(req.Password, user.Password) {
  48. return fiber.NewError(fiber.StatusForbidden, "")
  49. }
  50. token, err := authService.GenerateToken(*user)
  51. if err != nil {
  52. logger.Error(ctx, err.Error())
  53. return fiber.NewError(fiber.StatusInternalServerError, err.Error())
  54. }
  55. return fctx.JSON(mappers.ToLoginResponse(token))
  56. }
  57. }