Files
smartmate/backend/service/task.go
LoveLosita 63500b3b2a Version: 0.3.0.dev.260212
refactor: ♻️ 基于 gorm 钩子实现自动缓存失效机制,再也不用牵一发而动全身写删缓存逻辑了~

- 通过 gorm hook 监听 MySQL 数据变更 🧩
- 自动删除对应表相关缓存,实现缓存失效自动化 🔄
- 移除原本写在 sv 层的手动删缓存逻辑 🧹
- 解耦业务逻辑与缓存控制,结构更加清晰 

fix: 🐛 修复将任务类加入日程接口的时间字段遗漏问题

- 由于前版本 MySQL 表结构更新
- 漏写插入起始时间字段逻辑,导致500报错,现已补充 ⏱️

fix: 🐛 修复获取最近已完成任务列表接口的多个问题

- 移除不应存在的幂等键 🔁
- 修复“一个event输出多次”的问题(原因出自 dto 转换函数) 🔧

undo: ⚠️ 删除任务类接口未处理已安排任务块的解除逻辑

- 当前删除任务类时,未解除已被安排的任务块
- 该逻辑存在缺陷,计划在后续版本内修复 🛠️
2026-02-12 21:34:01 +08:00

72 lines
2.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
}