package handlers import ( "encoding/json" "errors" "github.com/gofiber/fiber/v3" "lmika.dev/lmika/hugo-cms/models" "lmika.dev/lmika/hugo-cms/services/users" ) type AuthHandler struct { UserService *users.Service } func (h *AuthHandler) ShowLogin(c fiber.Ctx) error { return c.Render("auth/login", fiber.Map{}, "layouts/login") } func (h *AuthHandler) Login(c fiber.Ctx) error { var req struct { Email string `form:"email"` Password string `form:"password"` } if err := c.Bind().Body(&req); err != nil { return errors.New("invalid email or password") } user, err := h.UserService.VerifyLogin(c.Context(), req.Email, req.Password) if err != nil { return errors.New("invalid email or password") } bts, err := json.Marshal(models.AuthCookie{UserID: user.ID}) if err != nil { return err } c.Cookie(&fiber.Cookie{ Name: models.AuthCookieName, Value: string(bts), }) return c.Redirect().To("/") } func (h *AuthHandler) RequireAuth(c fiber.Ctx) error { user, err := h.readAuthCookie(c) if err != nil { return c.Redirect().To("/auth/login") } c.Locals("user", user) return c.Next() } func (h *AuthHandler) readAuthCookie(c fiber.Ctx) (user models.User, err error) { authData := c.Cookies(models.AuthCookieName) if authData == "" { return models.User{}, errors.New("no auth cookie") } var ac models.AuthCookie if err := json.Unmarshal([]byte(authData), &ac); err != nil { return models.User{}, err } return h.UserService.GetUserByID(c.Context(), ac.UserID) }