package sessions import ( "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)) for k, v := range s.Data { copy[k] = v } 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() }