package logic import ( "context" "slowwild/internal/errorx" "slowwild/internal/model" "slowwild/internal/svc" "time" "git.banshen.xyz/huangguangrong/slow_wild_protobuff/slowwild/slowwildserver" "slowwild/internal/constants" "github.com/spf13/cast" "github.com/zeromicro/go-zero/core/logx" "gorm.io/gorm" ) type PostUpvoteLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger } func NewPostUpvoteLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PostUpvoteLogic { return &PostUpvoteLogic{ ctx: ctx, svcCtx: svcCtx, Logger: logx.WithContext(ctx), } } // 点赞帖子 func (l *PostUpvoteLogic) PostUpvote(in *slowwildserver.PostUpvoteReq) (*slowwildserver.PostUpvoteRsp, error) { // 从context中获取userId userId, err := cast.ToInt64E(l.ctx.Value(constants.UserIDKey)) if err != nil { return nil, errorx.ErrInvalidParam } if in.PostId <= 0 { return nil, errorx.ErrInvalidParam } // 开启事务 err = l.svcCtx.UserModel.Transaction(l.ctx, func(tx *gorm.DB) error { postModel := model.NewPostModel(tx, l.svcCtx.Redis) postActionModel := model.NewPostActionModel(tx, l.svcCtx.Redis) messageModel := model.NewMessageModel(tx) // 获取帖子信息 post, err := postModel.GetPostDetail(l.ctx, in.PostId) if err != nil { return err } // 检查是否已经点赞过 isLiked, err := postActionModel.CheckPostAction(l.ctx, userId, in.PostId, 0) // 0表示点赞动作 if err != nil { return err } if !isLiked { // 创建点赞记录 postAction := &model.PostAction{ Model: &model.Model{ CreatedOn: time.Now().Unix(), ModifiedOn: time.Now().Unix(), }, PostId: in.PostId, UserId: userId, ActionType: 0, // 0表示点赞 } if err := postActionModel.CreatePostAction(l.ctx, postAction); err != nil { return err } // 增加点赞数 if err := postModel.IncrementUpvoteCount(l.ctx, in.PostId, 1); err != nil { return err } // 如果不是点赞自己的帖子,发送消息通知 if post.UserId != userId { err = messageModel.SendNotification(l.ctx, userId, post.UserId, 6, "点赞通知", "有人点赞了你的动态", in.PostId, 0, 0) if err != nil { return err } } } else { // 取消点赞 postAction := &model.PostAction{ Model: &model.Model{ ModifiedOn: time.Now().Unix(), DeletedOn: time.Now().Unix(), IsDel: 1, }, PostId: in.PostId, UserId: userId, ActionType: 0, } if err := postActionModel.DeletePostAction(l.ctx, postAction); err != nil { return err } // 减少点赞数 if err := postModel.IncrementUpvoteCount(l.ctx, in.PostId, -1); err != nil { return err } } return nil }) if err != nil { l.Logger.Errorf("帖子点赞失败: %v", err) return nil, err } return &slowwildserver.PostUpvoteRsp{}, nil }