postcommentupvotelogic.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package logic
  2. import (
  3. "context"
  4. "slowwild/internal/errorx"
  5. "slowwild/internal/model"
  6. "slowwild/internal/svc"
  7. "git.banshen.xyz/huangguangrong/slow_wild_protobuff/slowwild/slowwildserver"
  8. "time"
  9. "github.com/zeromicro/go-zero/core/logx"
  10. "gorm.io/gorm"
  11. )
  12. type PostCommentUpvoteLogic struct {
  13. ctx context.Context
  14. svcCtx *svc.ServiceContext
  15. logx.Logger
  16. }
  17. func NewPostCommentUpvoteLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PostCommentUpvoteLogic {
  18. return &PostCommentUpvoteLogic{
  19. ctx: ctx,
  20. svcCtx: svcCtx,
  21. Logger: logx.WithContext(ctx),
  22. }
  23. }
  24. // 评论点赞
  25. func (l *PostCommentUpvoteLogic) PostCommentUpvote(in *slowwildserver.PostCommentUpvoteReq) (*slowwildserver.PostCommentUpvoteRsp, error) {
  26. if in.UserId <= 0 || in.CommentId <= 0 {
  27. return nil, errorx.ErrInvalidParam
  28. }
  29. // 开启事务
  30. err := l.svcCtx.UserModel.Transaction(l.ctx, func(tx *gorm.DB) error {
  31. commentModel := model.NewCommentModel(tx, l.svcCtx.Redis)
  32. messageModel := model.NewMessageModel(tx)
  33. // 获取评论/回复信息
  34. comment, err := commentModel.GetComment(l.ctx, in.CommentId)
  35. if err != nil {
  36. return err
  37. }
  38. // 检查是否已经点赞
  39. isUpvoted, err := commentModel.IsCommentUpvotedByUser(l.ctx, in.UserId, in.CommentId)
  40. if err != nil {
  41. return err
  42. }
  43. if !isUpvoted {
  44. // 创建点赞记录
  45. upvote := &model.CommentUpvote{
  46. Model: &model.Model{
  47. CreatedOn: time.Now().Unix(),
  48. ModifiedOn: time.Now().Unix(),
  49. },
  50. UserId: in.UserId,
  51. CommentId: in.CommentId,
  52. ActionType: in.CommentType, // 0-评论点赞 1-回复点赞
  53. }
  54. if err := commentModel.CreateCommentUpvote(l.ctx, upvote); err != nil {
  55. return err
  56. }
  57. // 增加点赞数
  58. if err := commentModel.IncrementUpvoteCount(l.ctx, in.CommentId, 1); err != nil {
  59. return err
  60. }
  61. // 如果不是给自己点赞,发送消息通知
  62. if comment.UserId != in.UserId {
  63. notificationType := 3 // 评论通知
  64. if in.CommentType == 1 {
  65. notificationType = 4 // 回复通知
  66. }
  67. err = messageModel.SendNotification(l.ctx, in.UserId, comment.UserId, int8(notificationType),
  68. "点赞通知",
  69. "有人点赞了你的评论",
  70. comment.PostId, in.CommentId, 0)
  71. if err != nil {
  72. return err
  73. }
  74. }
  75. } else {
  76. // 取消点赞
  77. if err := commentModel.DeleteCommentUpvote(l.ctx, in.UserId, in.CommentId); err != nil {
  78. return err
  79. }
  80. // 减少点赞数
  81. if err := commentModel.IncrementUpvoteCount(l.ctx, in.CommentId, -1); err != nil {
  82. return err
  83. }
  84. }
  85. return nil
  86. })
  87. if err != nil {
  88. l.Logger.Errorf("评论点赞失败: %v", err)
  89. return nil, errorx.NewCodeError(20007, "评论点赞失败")
  90. }
  91. return &slowwildserver.PostCommentUpvoteRsp{}, nil
  92. }