CUB-127: implement Control Center CRUD API in Go
This commit is contained in:
80
go-backend/internal/store/session.go
Normal file
80
go-backend/internal/store/session.go
Normal file
@@ -0,0 +1,80 @@
|
||||
package store
|
||||
|
||||
import (
|
||||
"sort"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"code.cubecraftcreations.com/CubeCraft-Creations/Control-Center/go-backend/internal/models"
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
// SessionStore provides thread-safe CRUD operations for sessions.
|
||||
type SessionStore struct {
|
||||
mu sync.RWMutex
|
||||
sessions map[string]models.Session // id -> session
|
||||
}
|
||||
|
||||
// NewSessionStore returns an initialized SessionStore.
|
||||
func NewSessionStore() *SessionStore {
|
||||
return &SessionStore{
|
||||
sessions: make(map[string]models.Session),
|
||||
}
|
||||
}
|
||||
|
||||
// ListActive returns all sessions with status "running" or "streaming", newest first.
|
||||
func (s *SessionStore) ListActive() []models.Session {
|
||||
s.mu.RLock()
|
||||
defer s.mu.RUnlock()
|
||||
|
||||
result := make([]models.Session, 0)
|
||||
for _, sess := range s.sessions {
|
||||
if sess.Status == "running" || sess.Status == "streaming" {
|
||||
result = append(result, sess)
|
||||
}
|
||||
}
|
||||
sort.Slice(result, func(i, j int) bool {
|
||||
return result[i].LastActivityAt.After(result[j].LastActivityAt)
|
||||
})
|
||||
return result
|
||||
}
|
||||
|
||||
// Create inserts a new session.
|
||||
func (s *SessionStore) Create(sess models.Session) models.Session {
|
||||
s.mu.Lock()
|
||||
defer s.mu.Unlock()
|
||||
|
||||
if sess.ID == "" {
|
||||
sess.ID = uuid.New().String()
|
||||
}
|
||||
if sess.StartedAt.IsZero() {
|
||||
sess.StartedAt = time.Now().UTC()
|
||||
}
|
||||
if sess.LastActivityAt.IsZero() {
|
||||
sess.LastActivityAt = sess.StartedAt
|
||||
}
|
||||
s.sessions[sess.ID] = sess
|
||||
return sess
|
||||
}
|
||||
|
||||
// UpdateStatus updates the status and last-activity timestamp of a session.
|
||||
func (s *SessionStore) UpdateStatus(id, status string) bool {
|
||||
s.mu.Lock()
|
||||
defer s.mu.Unlock()
|
||||
|
||||
sess, ok := s.sessions[id]
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
sess.Status = status
|
||||
sess.LastActivityAt = time.Now().UTC()
|
||||
s.sessions[id] = sess
|
||||
return true
|
||||
}
|
||||
|
||||
// Count returns the total number of sessions.
|
||||
func (s *SessionStore) Count() int {
|
||||
s.mu.RLock()
|
||||
defer s.mu.RUnlock()
|
||||
return len(s.sessions)
|
||||
}
|
||||
Reference in New Issue
Block a user