package http import ( "backend/internal/api/dto" "backend/internal/usecase" "github.com/gofiber/fiber/v2" ) type AuthHandler struct { authService usecase.AuthService } func NewAuthHandler(authService *usecase.AuthService) *AuthHandler { return &AuthHandler{ authService: *authService, } } // GenerateChallenge generates a challenge for authentication // @Summary Generate authentication challenge // @Description Generate a challenge message for wallet authentication // @Tags auth // @Accept json // @Produce json // @Param request body dto.ChallengeRequest true "Challenge Request" // @Success 200 {object} dto.ChallengeResponse // @Failure 400 {object} map[string]string // @Failure 500 {object} map[string]string // @Router /auth/challenge [post] func (h *AuthHandler) GenerateChallenge(c *fiber.Ctx) error { var req dto.ChallengeRequest if err := c.BodyParser(&req); err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "error": "invalid request body", }) } challenge, err := h.authService.GenerateChallenge(c.Context(), req.PubKey) if err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ "error": err.Error(), }) } return c.Status(fiber.StatusOK).JSON( dto.ChallengeResponse{ Message: challenge.Message, TimeStamp: challenge.TimeStamp.String(), ExpiresAt: challenge.ExpiresAt.String(), }, ) } // Authenticate authenticates a user with signed challenge // @Summary Authenticate user // @Description Authenticate user with wallet signature // @Tags auth // @Accept json // @Produce json // @Param request body dto.AuthenticateRequest true "Authentication Request" // @Success 200 {object} dto.AuthenticateResponse // @Failure 400 {object} map[string]string // @Failure 401 {object} map[string]string // @Router /auth/authenticate [post] func (h *AuthHandler) Authenticate(c *fiber.Ctx) error { var req dto.AuthenticateRequest if err := c.BodyParser(&req); err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "error": "invalid request body", }) } userToken, err := h.authService.Authenticate( c.Context(), req.PubKey, req.Signature, //TODO: add chainID to cfg 1, c.IP(), c.Get("User-Agent"), ) if err != nil { return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{ "error": err.Error(), }) } return c.Status(fiber.StatusOK).JSON(dto.AuthenticateResponse{ AuthorizationToken: userToken.AuthorizationToken, RefreshToken: userToken.RefreshToken, ExpiresAt: userToken.ExpiresAt, }) } func (h *AuthHandler) HelloWorld(c *fiber.Ctx) error { return c.Status(fiber.StatusOK).JSON(fiber.Map{ "message": "Hello, World!", }) }