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.Hour * 24 type UserGetter interface { GetUserById(id string) *types.User AuthUser(username string, password string) *types.User } type Request struct { Ctx *fiber.Ctx Session *session.Session UpdateSession bool User *types.User userGetter UserGetter } func updateSessionCookieExp(request *Request) { request.Session.SetExpiry(SESSION_EXPIRES) request.UpdateSession = true } func NewRequest(ctx *fiber.Ctx, userGetter UserGetter) *Request { session, err := sessionStore.Get(ctx) if err != nil { panic(err) } var user *types.User = nil var updateSession bool = false if !session.Fresh() { userId := session.Get("userId") if userId != nil { user = userGetter.GetUserById(userId.(string)) updateSession = true } } request := &Request{ Ctx: ctx, Session: session, userGetter: userGetter, User: user, UpdateSession: updateSession, } if updateSession { updateSessionCookieExp(request) } return request } 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) updateSessionCookieExp(r) 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 }