package requests import ( "errors" "fiber-sessions/app/types" "time" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/session" "github.com/gofiber/storage/memory/v2" ) var sessionStorage = memory.New() var sessionStore = session.New(session.Config{ Storage: sessionStorage, }) const SESSION_EXPIRES = time.Minute * 30 type UserGetter interface { GetUserById(id string) *types.User AuthUser(username string, password string) *types.User } type Request struct { Ctx *fiber.Ctx session *session.Session User *types.User userGetter UserGetter } func NewRequest(ctx *fiber.Ctx, userGetter UserGetter) *Request { session, err := sessionStore.Get(ctx) if err != nil { panic(err) } var user *types.User = nil userId := session.Get("userId") if userId != nil { user = userGetter.GetUserById(userId.(string)) } return &Request{ Ctx: ctx, session: session, userGetter: userGetter, User: user, } } func (r *Request) LoginUser(username string, password string) error { user := r.userGetter.AuthUser(username, password) if user == nil { return errors.New("invalid username or password") } r.User = user r.session.Set("userId", r.User.Id) r.session.SetExpiry(SESSION_EXPIRES) if err := r.session.Save(); err != nil { panic(err) } return nil } func (r *Request) UserAuthenticated() bool { return r.User != nil } func (r *Request) Logout() error { if !r.UserAuthenticated() { return errors.New("user not authenticated") } r.session.Destroy() r.User = nil return nil }