68 lines
1.4 KiB
Go
68 lines
1.4 KiB
Go
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)
|
|
}
|