check_auth.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package auth
  2. //go:generate mkdir -p mocks
  3. //go:generate rm -rf ./mocks/*_minimock.go
  4. //go:generate minimock -i AuthService,UserRepository -o ./mocks/ -s "_minimock.go"
  5. import (
  6. "context"
  7. "database/sql"
  8. "errors"
  9. "git.dmitriygnatenko.ru/dima/go-common/logger"
  10. "github.com/gofiber/fiber/v2"
  11. "github.com/golang-jwt/jwt/v4"
  12. "git.dmitriygnatenko.ru/dima/homethings/internal/mappers"
  13. "git.dmitriygnatenko.ru/dima/homethings/internal/models"
  14. )
  15. type (
  16. AuthService interface {
  17. GetClaims(*fiber.Ctx) jwt.MapClaims
  18. IsCorrectPassword(password string, hash string) bool
  19. GenerateToken(models.User) (string, error)
  20. }
  21. UserRepository interface {
  22. Get(ctx context.Context, username string) (*models.User, error)
  23. }
  24. )
  25. // @Router /api/v1/auth/check [get]
  26. // @Success 200 {object} dto.UserResponse
  27. // @Failure 403 {object} dto.ErrorResponse
  28. // @Failure 500 {object} dto.ErrorResponse
  29. // @Summary Check auth
  30. // @Tags Auth
  31. // @Accept json
  32. // @Produce json
  33. func CheckAuthHandler(
  34. authService AuthService,
  35. userRepository UserRepository,
  36. ) fiber.Handler {
  37. return func(fctx *fiber.Ctx) error {
  38. ctx := fctx.Context()
  39. claims := authService.GetClaims(fctx)
  40. user, err := userRepository.Get(ctx, claims["name"].(string))
  41. if err != nil {
  42. if errors.Is(err, sql.ErrNoRows) {
  43. logger.Info(ctx, err.Error())
  44. return fiber.NewError(fiber.StatusForbidden, "")
  45. }
  46. logger.Error(ctx, err.Error())
  47. return fiber.NewError(fiber.StatusInternalServerError, err.Error())
  48. }
  49. return fctx.JSON(mappers.ToUserResponse(*user))
  50. }
  51. }