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()) }