package service import ( "context" "errors" "log" "github.com/LoveLosita/smartflow/backend/conv" "github.com/LoveLosita/smartflow/backend/dao" "github.com/LoveLosita/smartflow/backend/model" "github.com/LoveLosita/smartflow/backend/respond" "github.com/go-redis/redis/v8" ) type TaskService struct { // 伸出手:准备接住 DAO dao *dao.TaskDAO cache *dao.CacheDAO } // NewTaskService 创建 TaskService 实例 func NewTaskService(dao *dao.TaskDAO, cache *dao.CacheDAO) *TaskService { return &TaskService{ dao: dao, cache: cache, } } func (ts *TaskService) AddTask(ctx context.Context, req *model.UserAddTaskRequest, userID int) (*model.UserAddTaskResponse, error) { //1. 调用 conv 层进行转换 taskModel := conv.UserAddTaskRequestToModel(req, userID) //2.检查优先级是否合法 if taskModel.Priority < 1 || taskModel.Priority >= 5 { return nil, respond.InvalidPriority } //3. 调用 courseDAO 层进行数据持久化 createdTask, err := ts.dao.AddTask(taskModel) if err != nil { return nil, err } //4. 调用 conv 层进行响应转换 response := conv.ModelToUserAddTaskResponse(createdTask) return response, nil } func (ts *TaskService) GetUserTasks(ctx context.Context, userID int) ([]model.GetUserTaskResp, error) { //1. 先尝试从缓存获取数据 cachedResp, err := ts.cache.GetUserTasksFromCache(ctx, userID) if err == nil { // 缓存命中,直接返回 return cachedResp, nil } // 如果是 redis.Nil 错误,说明缓存未命中,我们继续查库 if !errors.Is(err, redis.Nil) { return nil, err // 其他错误,返回错误 } //2. 调用 courseDAO 层获取数据 tasks, err := ts.dao.GetTasksByUserID(userID) if err != nil { return nil, err } //3. 调用 conv 层进行响应转换 response := conv.ModelToGetUserTasksResp(tasks) //4. 将结果存入缓存,设置合理的过期时间(24h) err = ts.cache.SetUserTasksToCache(ctx, userID, response) if err != nil { // 缓存写入失败,记录日志但不影响正常返回数据 log.Printf("Failed to cache user tasks for userID %d: %v", userID, err) } return response, nil }