代码重构
在上一章节末尾
我们增加了一个删除缓存的代码以供增加和修改任务时调用, 但是这个写法不太好. 不仅代码逻辑上不够清晰, 再调用时也会每次都需要新建一个新的ListTaskLogic
对象, 对性能有一定消耗. 因此我新建了一个cache_logic.go
文件专门用于操作缓存.
删除 list 缓存的代码做部分修改如下:
// DeleteListCache 删除 list 缓存
func DeleteListCache(r *redis.Redis, uid int64) {
prefix := "cache:gtodolist:task:list:"
listKey := fmt.Sprintf("%s%v:*", prefix, uid)
keys, _ := r.Keys(listKey)
for _, key := range keys {
_, _ = r.Del(key)
}
}
调用语句如下:
DeleteListCache(l.svcCtx.RedisClient, in.Uid)
删除任务
代码框架已经生成好, 直接填写逻辑代码即可
api 层代码, 依旧是直接调用 rpc 即可:
func (l *TaskDeleteLogic) TaskDelete(req *types.DeleteReq) (resp *types.DeleteResp, err error) {
deleteResp, err := l.svcCtx.TaskRpcClient.DeleteTask(l.ctx, &pb.DeleteReq{
Uid: ctxdata.GetUidFromCtx(l.ctx),
Id: req.Id,
})
if err != nil {
return &types.DeleteResp{
Status: int(vo.ErrServerCommonError.GetErrCode()),
Message: err.Error(),
Error: err.Error(),
}, nil
}
resp = &types.DeleteResp{}
_ = copier.Copy(resp, deleteResp)
return resp, err
}
rpc 层代码, 先校验任务 id 是否合法, 然后删除 list 缓存和数据库内数据
func (l *DeleteTaskLogic) DeleteTask(in *pb.DeleteReq) (*pb.DeleteResp, error) {
tid, err := strconv.ParseInt(in.Id, 10, 64)
if err != nil {
return nil, errors.Wrap(err, "转换任务id失败, 请传入合法id")
}
DeleteListCache(l.svcCtx.RedisClient, in.Uid)
err = l.svcCtx.TaskModel.Delete(l.ctx, nil, tid)
if err != nil && err != gormc.ErrNotFound {
return nil, errors.Wrap(err, "删除任务失败")
}
return &pb.DeleteResp{
Status: vo.Ok,
Message: "删除成功",
}, nil
}
代码测试无误后至此手把手教你 gozero 从开发到部署系列 就全部完结啦