package logic import ( "context" "slowwild/internal/errorx" "slowwild/internal/model" "slowwild/internal/svc" "time" "git.banshen.xyz/huangguangrong/slow_wild_protobuff/slowwild/slowwildserver" "github.com/spf13/cast" "github.com/zeromicro/go-zero/core/logx" "gorm.io/gorm" ) type PostReplyLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger } func NewPostReplyLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PostReplyLogic { return &PostReplyLogic{ ctx: ctx, svcCtx: svcCtx, Logger: logx.WithContext(ctx), } } // 发布回复 func (l *PostReplyLogic) PostReply(in *slowwildserver.PostReplyReq) (*slowwildserver.PostReplyRsp, error) { if in.UserId <= 0 || in.PostId <= 0 || in.CommentId <= 0 || in.Content == "" { return nil, errorx.ErrInvalidParam } // 开启事务 err := l.svcCtx.UserModel.Transaction(l.ctx, func(tx *gorm.DB) error { postModel := model.NewPostModel(tx, l.svcCtx.Redis) commentModel := model.NewCommentModel(tx, l.svcCtx.Redis) replyModel := model.NewReplyModel(tx, l.svcCtx.Redis) messageModel := model.NewMessageModel(tx) // 检查评论是否存在 parentComment, err := commentModel.GetComment(l.ctx, in.CommentId) if err != nil { return err } // 构建回复数据 reply := &model.CommentReply{ Model: &model.Model{ CreatedOn: time.Now().Unix(), ModifiedOn: time.Now().Unix(), }, PostId: in.PostId, UserId: in.UserId, CommentId: in.CommentId, Content: in.Content, Image: in.Image, WithUserIds: cast.ToString(in.AtUserId), Ip: in.Ip, IpLoc: in.IpLoc, ReplyId: in.ToReplyId, } // 创建回复 if err := replyModel.Create(l.ctx, reply); err != nil { return err } // 增加父评论的回复数 if err := commentModel.IncrementReplyCount(l.ctx, in.CommentId, 1); err != nil { return err } // 增加帖子评论数 if err := postModel.IncrementCommentCount(l.ctx, in.PostId, 1); err != nil { return err } // 如果是回复的回复,需要通知被回复的用户 if in.ToReplyId > 0 { parentReply, err := replyModel.GetReply(l.ctx, in.ToReplyId) if err != nil { return err } if parentReply.UserId != in.UserId { err = messageModel.SendNotification(l.ctx, in.UserId, parentReply.UserId, 3, "回复通知", "有人回复了你的回复", in.PostId, in.CommentId, reply.ID) if err != nil { return err } } } else if parentComment.UserId != in.UserId { // 如果是回复评论,需要通知评论作者 err = messageModel.SendNotification(l.ctx, in.UserId, parentComment.UserId, 3, "回复通知", "有人回复了你的评论", in.PostId, in.CommentId, reply.ID) if err != nil { return err } } // 如果有@用户,给被@的用户发送消息通知 if in.AtUserId > 0 && in.AtUserId != in.UserId { err = messageModel.SendNotification(l.ctx, in.UserId, in.AtUserId, 4, "@通知", "有人在回复中@了你", in.PostId, in.CommentId, reply.ID) if err != nil { return err } } return nil }) if err != nil { l.Logger.Errorf("发布回复失败: %v", err) return nil, errorx.ErrCommentFailed } return &slowwildserver.PostReplyRsp{}, nil }