postdeletelogic.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package logic
  2. import (
  3. "context"
  4. "slowwild/internal/errorx"
  5. "slowwild/internal/model"
  6. "slowwild/internal/svc"
  7. "git.banshen.xyz/huangguangrong/slow_wild_protobuff/slowwild/slowwildserver"
  8. "slowwild/internal/constants"
  9. "github.com/spf13/cast"
  10. "github.com/zeromicro/go-zero/core/logx"
  11. "gorm.io/gorm"
  12. )
  13. type PostDeleteLogic struct {
  14. ctx context.Context
  15. svcCtx *svc.ServiceContext
  16. logx.Logger
  17. }
  18. func NewPostDeleteLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PostDeleteLogic {
  19. return &PostDeleteLogic{
  20. ctx: ctx,
  21. svcCtx: svcCtx,
  22. Logger: logx.WithContext(ctx),
  23. }
  24. }
  25. // 删除帖子
  26. func (l *PostDeleteLogic) PostDelete(in *slowwildserver.PostDeleteReq) (*slowwildserver.PostDeleteRsp, error) {
  27. // 从context中获取userId
  28. userId, err := cast.ToInt64E(l.ctx.Value(constants.UserIDKey))
  29. if err != nil {
  30. return nil, errorx.ErrInvalidParam
  31. }
  32. if in.PostId <= 0 {
  33. return nil, errorx.ErrInvalidParam
  34. }
  35. // 开启事务
  36. err = l.svcCtx.UserModel.Transaction(l.ctx, func(tx *gorm.DB) error {
  37. postModel := model.NewPostModel(tx, l.svcCtx.Redis)
  38. userModel := model.NewUserModel(tx)
  39. // 获取帖子信息
  40. post, err := postModel.GetPostDetail(l.ctx, in.PostId)
  41. if err != nil {
  42. return err
  43. }
  44. // 检查是否是自己的帖子
  45. if post.UserId != userId {
  46. return errorx.NewCodeError(20008, "无权删除该帖子")
  47. }
  48. // 删除帖子
  49. if err := postModel.Delete(l.ctx, in.PostId); err != nil {
  50. return err
  51. }
  52. // 减少用户的帖子数
  53. if err := userModel.DecrementTweetCount(l.ctx, userId); err != nil {
  54. return err
  55. }
  56. // 删除相关缓存
  57. postModel.ClearCache(l.ctx, in.PostId)
  58. return nil
  59. })
  60. if err != nil {
  61. l.Logger.Errorf("删除帖子失败: %v", err)
  62. return nil, errorx.NewCodeError(20009, "删除帖子失败")
  63. }
  64. return &slowwildserver.PostDeleteRsp{}, nil
  65. }