jytest/store/store.go

127 lines
2.4 KiB
Go

package store
import (
"encoding/json"
"fmt"
"os"
"path/filepath"
"sync"
"time"
"jimeng/model"
)
// Store 任务存储
type Store struct {
mu sync.RWMutex
tasks map[string]*model.Task
dataFile string
}
// NewStore 创建存储实例
func NewStore(dataFile string) (*Store, error) {
s := &Store{
tasks: make(map[string]*model.Task),
dataFile: dataFile,
}
// 确保目录存在
dir := filepath.Dir(dataFile)
if err := os.MkdirAll(dir, 0755); err != nil {
return nil, err
}
// 加载已有数据
if err := s.load(); err != nil && !os.IsNotExist(err) {
return nil, err
}
return s, nil
}
// load 从文件加载任务
func (s *Store) load() error {
data, err := os.ReadFile(s.dataFile)
if err != nil {
return err
}
var tasks []*model.Task
if err := json.Unmarshal(data, &tasks); err != nil {
return err
}
s.mu.Lock()
defer s.mu.Unlock()
for _, t := range tasks {
s.tasks[t.ID] = t
}
return nil
}
// save 保存任务到文件
func (s *Store) save() error {
s.mu.RLock()
tasks := make([]*model.Task, 0, len(s.tasks))
for _, t := range s.tasks {
tasks = append(tasks, t)
}
s.mu.RUnlock()
data, err := json.MarshalIndent(tasks, "", " ")
if err != nil {
return err
}
return os.WriteFile(s.dataFile, data, 0644)
}
// CreateTask 创建任务
func (s *Store) CreateTask(t *model.Task) error {
s.mu.Lock()
s.tasks[t.ID] = t
s.mu.Unlock()
return s.save()
}
// GetTask 获取任务
func (s *Store) GetTask(id string) (*model.Task, bool) {
s.mu.RLock()
defer s.mu.RUnlock()
t, ok := s.tasks[id]
return t, ok
}
// UpdateTask 更新任务
func (s *Store) UpdateTask(t *model.Task) error {
s.mu.Lock()
s.tasks[t.ID] = t
s.mu.Unlock()
return s.save()
}
// ListTasks 列出所有任务
func (s *Store) ListTasks() []*model.Task {
s.mu.RLock()
defer s.mu.RUnlock()
tasks := make([]*model.Task, 0, len(s.tasks))
for _, t := range s.tasks {
tasks = append(tasks, t)
}
// 按创建时间倒序
for i := 0; i < len(tasks); i++ {
for j := i + 1; j < len(tasks); j++ {
if tasks[i].CreatedAt.Before(tasks[j].CreatedAt) {
tasks[i], tasks[j] = tasks[j], tasks[i]
}
}
}
return tasks
}
// DeleteTask 删除任务
func (s *Store) DeleteTask(id string) error {
s.mu.Lock()
delete(s.tasks, id)
s.mu.Unlock()
return s.save()
}
// GenerateID 生成任务ID
func GenerateID() string {
return fmt.Sprintf("%d", time.Now().UnixNano())
}