86 lines
1.7 KiB
Go
86 lines
1.7 KiB
Go
package sessions
|
|
|
|
import (
|
|
"maps"
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
// Session stores data for a single user session
|
|
type Session struct {
|
|
ID string
|
|
Data map[string]any
|
|
CreatedAt time.Time
|
|
UpdatedAt time.Time
|
|
LastUsed time.Time
|
|
Expiry time.Time
|
|
mu sync.RWMutex
|
|
}
|
|
|
|
// NewSession creates a new session with the given ID
|
|
func NewSession(id string, maxAge int) *Session {
|
|
now := time.Now()
|
|
return &Session{
|
|
ID: id,
|
|
Data: make(map[string]any),
|
|
CreatedAt: now,
|
|
UpdatedAt: now,
|
|
LastUsed: now,
|
|
Expiry: now.Add(time.Duration(maxAge) * time.Second),
|
|
}
|
|
}
|
|
|
|
// Get retrieves a value from the session
|
|
func (s *Session) Get(key string) any {
|
|
s.mu.RLock()
|
|
defer s.mu.RUnlock()
|
|
return s.Data[key]
|
|
}
|
|
|
|
// Set stores a value in the session
|
|
func (s *Session) Set(key string, value any) {
|
|
s.mu.Lock()
|
|
defer s.mu.Unlock()
|
|
s.Data[key] = value
|
|
s.UpdatedAt = time.Now()
|
|
}
|
|
|
|
// Delete removes a value from the session
|
|
func (s *Session) Delete(key string) {
|
|
s.mu.Lock()
|
|
defer s.mu.Unlock()
|
|
delete(s.Data, key)
|
|
s.UpdatedAt = time.Now()
|
|
}
|
|
|
|
// Clear removes all data from the session
|
|
func (s *Session) Clear() {
|
|
s.mu.Lock()
|
|
defer s.mu.Unlock()
|
|
s.Data = make(map[string]any)
|
|
s.UpdatedAt = time.Now()
|
|
}
|
|
|
|
// GetAll returns a copy of all session data
|
|
func (s *Session) GetAll() map[string]any {
|
|
s.mu.RLock()
|
|
defer s.mu.RUnlock()
|
|
|
|
copy := make(map[string]any, len(s.Data))
|
|
maps.Copy(copy, s.Data)
|
|
|
|
return copy
|
|
}
|
|
|
|
// IsExpired checks if the session has expired
|
|
func (s *Session) IsExpired() bool {
|
|
return time.Now().After(s.Expiry)
|
|
}
|
|
|
|
// UpdateLastUsed updates the last used time
|
|
func (s *Session) UpdateLastUsed() {
|
|
s.mu.Lock()
|
|
s.LastUsed = time.Now()
|
|
s.mu.Unlock()
|
|
}
|