114 lines
2.0 KiB
Go
114 lines
2.0 KiB
Go
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
|
|
}
|