package auth import ( "errors" "github.com/get-drexa/drexa/internal/httperr" "github.com/get-drexa/drexa/internal/user" "github.com/gofiber/fiber/v2" "github.com/uptrace/bun" ) type loginRequest struct { Email string `json:"email"` Password string `json:"password"` } type loginResponse struct { User user.User `json:"user"` AccessToken string `json:"accessToken"` RefreshToken string `json:"refreshToken"` } type HTTPHandler struct { service *Service db *bun.DB } func NewHTTPHandler(s *Service, db *bun.DB) *HTTPHandler { return &HTTPHandler{service: s, db: db} } func (h *HTTPHandler) RegisterRoutes(api fiber.Router) { auth := api.Group("/auth") auth.Post("/login", h.Login) } func (h *HTTPHandler) Login(c *fiber.Ctx) error { req := new(loginRequest) if err := c.BodyParser(req); err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Invalid request"}) } tx, err := h.db.BeginTx(c.Context(), nil) if err != nil { return httperr.Internal(err) } defer tx.Rollback() result, err := h.service.AuthenticateWithEmailAndPassword(c.Context(), tx, req.Email, req.Password) if err != nil { if errors.Is(err, ErrInvalidCredentials) { return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": "Invalid credentials"}) } return httperr.Internal(err) } if err := tx.Commit(); err != nil { return httperr.Internal(err) } return c.JSON(loginResponse{ User: *result.User, AccessToken: result.AccessToken, RefreshToken: result.RefreshToken, }) }