package usersession import ( "errors" "fiber-sessions/app/types" "fmt" "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 var dbUsers map[string]types.User = map[string]types.User{ "pero-uuid": { Id: "pero-uuid", Username: "pero", Password: "pero", FirstName: "Pero", LastName: "Perić", }, "mirko-uuid": { Id: "mirko-uuid", Username: "mirko", Password: "mirko", FirstName: "Mirko", LastName: "Mirković", }, } type RequestSession struct { ctx *fiber.Ctx session *session.Session User *types.User } func NewRequestSession(ctx *fiber.Ctx) *RequestSession { session, err := sessionStore.Get(ctx) if err != nil { panic(err) } var user *types.User = nil userId := session.Get("userId") fmt.Printf("userId: %+v\n", userId) if userId != nil { user = getUserById(userId.(string)) } return &RequestSession{ ctx: ctx, session: session, User: user, } } func getUserById(id string) *types.User { user, ok := dbUsers[id] if ok { return &user } return nil } func getUser(username string, password string) *types.User { for _, user := range dbUsers { if user.Username == username { if user.Password == password { return &user } break } } return nil } func (r *RequestSession) LoginUser(username string, password string) error { user := getUser(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 *RequestSession) UserAuthenticated() bool { return r.User != nil } func (r *RequestSession) Logout() error { if !r.UserAuthenticated() { return errors.New("user not authenticated") } r.session.Destroy() r.User = nil return nil }