Igris/internal/api/http/handlers/auth_handler.go

89 lines
2.0 KiB
Go

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,
//TODO: fetch from cache
TimeStamp: time.Now().UTC(),
ExpiresAt: time.Now().Add(5 * time.Minute),
}
userToken, err := h.authService.Authenticate(
c.Context(),
req.PubKey,
req.Signature,
challenge,
// 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,
})
}