postupvotelogic.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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/zeromicro/go-zero/core/logx"
  10. "gorm.io/gorm"
  11. )
  12. type PostUpvoteLogic struct {
  13. ctx context.Context
  14. svcCtx *svc.ServiceContext
  15. logx.Logger
  16. }
  17. func NewPostUpvoteLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PostUpvoteLogic {
  18. return &PostUpvoteLogic{
  19. ctx: ctx,
  20. svcCtx: svcCtx,
  21. Logger: logx.WithContext(ctx),
  22. }
  23. }
  24. // 点赞帖子
  25. func (l *PostUpvoteLogic) PostUpvote(in *slowwildserver.PostUpvoteReq) (*slowwildserver.PostUpvoteRsp, error) {
  26. if in.UserId <= 0 || in.PostId <= 0 {
  27. return nil, errorx.ErrInvalidParam
  28. }
  29. // 开启事务
  30. err := l.svcCtx.UserModel.Transaction(l.ctx, func(tx *gorm.DB) error {
  31. postModel := model.NewPostModel(tx, l.svcCtx.Redis)
  32. postActionModel := model.NewPostActionModel(tx, l.svcCtx.Redis)
  33. messageModel := model.NewMessageModel(tx)
  34. // 获取帖子信息
  35. post, err := postModel.GetPostDetail(l.ctx, in.PostId)
  36. if err != nil {
  37. return err
  38. }
  39. // 检查是否已经点赞过
  40. isLiked, err := postActionModel.CheckPostAction(l.ctx, in.UserId, in.PostId, 0) // 0表示点赞动作
  41. if err != nil {
  42. return err
  43. }
  44. if !isLiked {
  45. // 创建点赞记录
  46. postAction := &model.PostAction{
  47. Model: &model.Model{
  48. CreatedOn: time.Now().Unix(),
  49. ModifiedOn: time.Now().Unix(),
  50. },
  51. PostId: in.PostId,
  52. UserId: in.UserId,
  53. ActionType: 0, // 0表示点赞
  54. }
  55. if err := postActionModel.CreatePostAction(l.ctx, postAction); err != nil {
  56. return err
  57. }
  58. // 增加点赞数
  59. if err := postModel.IncrementUpvoteCount(l.ctx, in.PostId, 1); err != nil {
  60. return err
  61. }
  62. // 如果不是点赞自己的帖子,发送消息通知
  63. if post.UserId != in.UserId {
  64. err = messageModel.SendNotification(l.ctx, in.UserId, post.UserId, 6,
  65. "点赞通知",
  66. "有人点赞了你的动态",
  67. in.PostId, 0, 0)
  68. if err != nil {
  69. return err
  70. }
  71. }
  72. } else {
  73. // 取消点赞
  74. postAction := &model.PostAction{
  75. Model: &model.Model{
  76. ModifiedOn: time.Now().Unix(),
  77. DeletedOn: time.Now().Unix(),
  78. IsDel: 1,
  79. },
  80. PostId: in.PostId,
  81. UserId: in.UserId,
  82. ActionType: 0,
  83. }
  84. if err := postActionModel.DeletePostAction(l.ctx, postAction); err != nil {
  85. return err
  86. }
  87. // 减少点赞数
  88. if err := postModel.IncrementUpvoteCount(l.ctx, in.PostId, -1); err != nil {
  89. return err
  90. }
  91. }
  92. return nil
  93. })
  94. if err != nil {
  95. l.Logger.Errorf("帖子点赞失败: %v", err)
  96. return nil, err
  97. }
  98. return &slowwildserver.PostUpvoteRsp{}, nil
  99. }