Files
Control-Center/go-backend/internal/store/project.go

68 lines
1.4 KiB
Go
Raw Normal View History

package store
import (
"sort"
"sync"
"time"
"code.cubecraftcreations.com/CubeCraft-Creations/Control-Center/go-backend/internal/models"
"github.com/google/uuid"
)
// ProjectStore provides thread-safe CRUD operations for projects.
type ProjectStore struct {
mu sync.RWMutex
projects map[string]models.Project
}
// NewProjectStore returns an initialized ProjectStore.
func NewProjectStore() *ProjectStore {
return &ProjectStore{
projects: make(map[string]models.Project),
}
}
// List returns all projects ordered by name.
func (s *ProjectStore) List() []models.Project {
s.mu.RLock()
defer s.mu.RUnlock()
result := make([]models.Project, 0, len(s.projects))
for _, p := range s.projects {
result = append(result, p)
}
sort.Slice(result, func(i, j int) bool {
return result[i].Name < result[j].Name
})
return result
}
// Create inserts a new project.
func (s *ProjectStore) Create(p models.Project) models.Project {
s.mu.Lock()
defer s.mu.Unlock()
if p.ID == "" {
p.ID = uuid.New().String()
}
now := time.Now().UTC()
if p.CreatedAt.IsZero() {
p.CreatedAt = now
}
if p.UpdatedAt.IsZero() {
p.UpdatedAt = now
}
if p.AgentIDs == nil {
p.AgentIDs = []string{}
}
s.projects[p.ID] = p
return p
}
// Count returns the total number of projects.
func (s *ProjectStore) Count() int {
s.mu.RLock()
defer s.mu.RUnlock()
return len(s.projects)
}