postreplylogic.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. package logic
  2. import (
  3. "context"
  4. "slowwild/internal/errorx"
  5. "slowwild/internal/model"
  6. "slowwild/internal/svc"
  7. "time"
  8. "git.banshen.xyz/huangguangrong/slow_wild_protobuff/slowwild/slowwildserver"
  9. "github.com/spf13/cast"
  10. "github.com/zeromicro/go-zero/core/logx"
  11. "gorm.io/gorm"
  12. )
  13. type PostReplyLogic struct {
  14. ctx context.Context
  15. svcCtx *svc.ServiceContext
  16. logx.Logger
  17. }
  18. func NewPostReplyLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PostReplyLogic {
  19. return &PostReplyLogic{
  20. ctx: ctx,
  21. svcCtx: svcCtx,
  22. Logger: logx.WithContext(ctx),
  23. }
  24. }
  25. // 发布回复
  26. func (l *PostReplyLogic) PostReply(in *slowwildserver.PostReplyReq) (*slowwildserver.PostReplyRsp, error) {
  27. if in.UserId <= 0 || in.PostId <= 0 || in.CommentId <= 0 || in.Content == "" {
  28. return nil, errorx.ErrInvalidParam
  29. }
  30. // 开启事务
  31. err := l.svcCtx.UserModel.Transaction(l.ctx, func(tx *gorm.DB) error {
  32. postModel := model.NewPostModel(tx, l.svcCtx.Redis)
  33. commentModel := model.NewCommentModel(tx, l.svcCtx.Redis)
  34. replyModel := model.NewReplyModel(tx, l.svcCtx.Redis)
  35. messageModel := model.NewMessageModel(tx)
  36. // 检查评论是否存在
  37. parentComment, err := commentModel.GetComment(l.ctx, in.CommentId)
  38. if err != nil {
  39. return err
  40. }
  41. // 构建回复数据
  42. reply := &model.CommentReply{
  43. Model: &model.Model{
  44. CreatedOn: time.Now().Unix(),
  45. ModifiedOn: time.Now().Unix(),
  46. },
  47. PostId: in.PostId,
  48. UserId: in.UserId,
  49. CommentId: in.CommentId,
  50. Content: in.Content,
  51. Image: in.Image,
  52. WithUserIds: cast.ToString(in.AtUserId),
  53. Ip: in.Ip,
  54. IpLoc: in.IpLoc,
  55. ReplyId: in.ToReplyId,
  56. }
  57. // 创建回复
  58. if err := replyModel.Create(l.ctx, reply); err != nil {
  59. return err
  60. }
  61. // 增加父评论的回复数
  62. if err := commentModel.IncrementReplyCount(l.ctx, in.CommentId, 1); err != nil {
  63. return err
  64. }
  65. // 增加帖子评论数
  66. if err := postModel.IncrementCommentCount(l.ctx, in.PostId, 1); err != nil {
  67. return err
  68. }
  69. // 如果是回复的回复,需要通知被回复的用户
  70. if in.ToReplyId > 0 {
  71. parentReply, err := replyModel.GetReply(l.ctx, in.ToReplyId)
  72. if err != nil {
  73. return err
  74. }
  75. if parentReply.UserId != in.UserId {
  76. err = messageModel.SendNotification(l.ctx, in.UserId, parentReply.UserId, 3,
  77. "回复通知",
  78. "有人回复了你的回复",
  79. in.PostId, in.CommentId, reply.ID)
  80. if err != nil {
  81. return err
  82. }
  83. }
  84. } else if parentComment.UserId != in.UserId { // 如果是回复评论,需要通知评论作者
  85. err = messageModel.SendNotification(l.ctx, in.UserId, parentComment.UserId, 3,
  86. "回复通知",
  87. "有人回复了你的评论",
  88. in.PostId, in.CommentId, reply.ID)
  89. if err != nil {
  90. return err
  91. }
  92. }
  93. // 如果有@用户,给被@的用户发送消息通知
  94. if in.AtUserId > 0 && in.AtUserId != in.UserId {
  95. err = messageModel.SendNotification(l.ctx, in.UserId, in.AtUserId, 4,
  96. "@通知",
  97. "有人在回复中@了你",
  98. in.PostId, in.CommentId, reply.ID)
  99. if err != nil {
  100. return err
  101. }
  102. }
  103. return nil
  104. })
  105. if err != nil {
  106. l.Logger.Errorf("发布回复失败: %v", err)
  107. return nil, errorx.ErrCommentFailed
  108. }
  109. return &slowwildserver.PostReplyRsp{}, nil
  110. }