refactor: ♻️ 基于 gorm 钩子实现自动缓存失效机制,再也不用牵一发而动全身写删缓存逻辑了~ - 通过 gorm hook 监听 MySQL 数据变更 🧩 - 自动删除对应表相关缓存,实现缓存失效自动化 🔄 - 移除原本写在 sv 层的手动删缓存逻辑 🧹 - 解耦业务逻辑与缓存控制,结构更加清晰 ✅ fix: 🐛 修复将任务类加入日程接口的时间字段遗漏问题 - 由于前版本 MySQL 表结构更新 - 漏写插入起始时间字段逻辑,导致500报错,现已补充 ⏱️ fix: 🐛 修复获取最近已完成任务列表接口的多个问题 - 移除不应存在的幂等键 🔁 - 修复“一个event输出多次”的问题(原因出自 dto 转换函数) 🔧 undo: ⚠️ 删除任务类接口未处理已安排任务块的解除逻辑 - 当前删除任务类时,未解除已被安排的任务块 - 该逻辑存在缺陷,计划在后续版本内修复 🛠️
72 lines
2.1 KiB
Go
72 lines
2.1 KiB
Go
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
|
||
}
|