qr-scanner/services/store.go

60 lines
1020 B
Go

package services
import (
"sync"
"time"
)
type TaskStore struct {
mu sync.RWMutex
tasks map[string]*Task
}
func NewTaskStore() *TaskStore {
return &TaskStore{tasks: map[string]*Task{}}
}
func (s *TaskStore) Put(t *Task) {
s.mu.Lock()
defer s.mu.Unlock()
s.tasks[t.ID] = t
}
func (s *TaskStore) Get(id string) (*Task, bool) {
s.mu.RLock()
defer s.mu.RUnlock()
t, ok := s.tasks[id]
return t, ok
}
func (s *TaskStore) Delete(id string) {
s.mu.Lock()
defer s.mu.Unlock()
delete(s.tasks, id)
}
func (s *TaskStore) Cleanup(retention time.Duration) {
now := time.Now()
var expired []*Task
s.mu.RLock()
for _, t := range s.tasks {
if t.Status == TaskCompleted || t.Status == TaskCanceled || t.Status == TaskFailed {
if !t.EndedAt.IsZero() && now.Sub(t.EndedAt) > retention {
expired = append(expired, t)
}
}
}
s.mu.RUnlock()
for _, t := range expired {
t.Cleanup()
s.mu.Lock()
if cur, ok := s.tasks[t.ID]; ok && cur == t {
delete(s.tasks, t.ID)
}
s.mu.Unlock()
}
}