package logic import ( "context" "slowwild/internal/errorx" "slowwild/internal/model" "slowwild/internal/svc" "git.banshen.xyz/huangguangrong/slow_wild_protobuff/slowwild/slowwildserver" "time" "slowwild/internal/constants" "github.com/spf13/cast" "github.com/zeromicro/go-zero/core/logx" "gorm.io/gorm" ) type PostCommentUpvoteLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger } func NewPostCommentUpvoteLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PostCommentUpvoteLogic { return &PostCommentUpvoteLogic{ ctx: ctx, svcCtx: svcCtx, Logger: logx.WithContext(ctx), } } // 评论点赞 func (l *PostCommentUpvoteLogic) PostCommentUpvote(in *slowwildserver.PostCommentUpvoteReq) (*slowwildserver.PostCommentUpvoteRsp, error) { // 从context中获取userId userId, err := cast.ToInt64E(l.ctx.Value(constants.UserIDKey)) if err != nil { return nil, errorx.ErrInvalidParam } if in.CommentId <= 0 { return nil, errorx.ErrInvalidParam } // 开启事务 err = l.svcCtx.UserModel.Transaction(l.ctx, func(tx *gorm.DB) error { commentModel := model.NewCommentModel(tx, l.svcCtx.Redis) messageModel := model.NewMessageModel(tx) // 获取评论/回复信息 comment, err := commentModel.GetComment(l.ctx, in.CommentId) if err != nil { return err } // 检查是否已经点赞 isUpvoted, err := commentModel.IsCommentUpvotedByUser(l.ctx, userId, in.CommentId) if err != nil { return err } if !isUpvoted { // 创建点赞记录 upvote := &model.CommentUpvote{ Model: &model.Model{ CreatedOn: time.Now().Unix(), ModifiedOn: time.Now().Unix(), }, UserId: userId, CommentId: in.CommentId, ActionType: in.CommentType, // 0-评论点赞 1-回复点赞 } if err := commentModel.CreateCommentUpvote(l.ctx, upvote); err != nil { return err } // 增加点赞数 if err := commentModel.IncrementUpvoteCount(l.ctx, in.CommentId, 1); err != nil { return err } // 如果不是给自己点赞,发送消息通知 if comment.UserId != userId { notificationType := 3 // 评论通知 if in.CommentType == 1 { notificationType = 4 // 回复通知 } err = messageModel.SendNotification(l.ctx, userId, comment.UserId, int8(notificationType), "点赞通知", "有人点赞了你的评论", comment.PostId, in.CommentId, 0) if err != nil { return err } } } else { // 取消点赞 if err := commentModel.DeleteCommentUpvote(l.ctx, userId, in.CommentId); err != nil { return err } // 减少点赞数 if err := commentModel.IncrementUpvoteCount(l.ctx, in.CommentId, -1); err != nil { return err } } return nil }) if err != nil { l.Logger.Errorf("评论点赞失败: %v", err) return nil, errorx.NewCodeError(20007, "评论点赞失败") } return &slowwildserver.PostCommentUpvoteRsp{}, nil }