package http import ( "backend/internal/api/dto" "backend/internal/domain" "backend/internal/usecase" "time" "github.com/gofiber/fiber/v2" "github.com/google/uuid" ) type AuthHandler struct { authService usecase.AuthService } func NewAuthHandler(authService *usecase.AuthService) *AuthHandler { return &AuthHandler{ authService: *authService, } } 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": "failed to generate challenge", }) } return c.Status(fiber.StatusOK).JSON( dto.ChallengeResponse{ Message: challenge.Message.String(), TimeStamp: challenge.TimeStamp.String(), ExpiresAt: challenge.ExpiresAt.String(), }, ) } 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", }) } messageUUID, err := uuid.Parse(req.Message) if err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "error": "invalid message format", }) } challenge := &domain.Challenge{ Message: messageUUID, TimeStamp: time.Now().UTC(), ExpiresAt: time.Now().Add(5 * time.Minute), } clientIP := c.IP() userAgent := c.Get("User-Agent") userToken, err := h.authService.Authenticate( c.Context(), req.PubKey, req.Signature, challenge, // add chainID to cfg 1, clientIP, userAgent, ) 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, }) }