127 lines
2.4 KiB
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())
|
|
}
|