add comment message push

This commit is contained in:
landaiqing
2024-09-27 00:42:05 +08:00
parent 372835296d
commit 03c5b92515
5 changed files with 198 additions and 66 deletions

View File

@@ -3,8 +3,12 @@ package comment_api
import (
"encoding/base64"
"errors"
"github.com/acmestack/gorm-plus/gplus"
"io"
"regexp"
"schisandra-cloud-album/api/comment_api/dto"
"schisandra-cloud-album/global"
"schisandra-cloud-album/model"
"schisandra-cloud-album/service"
"strings"
"sync"
@@ -135,3 +139,88 @@ func getMimeType(data []byte) string {
return "application/octet-stream" // 默认类型
}
// 点赞
var likeChannel = make(chan dto.CommentLikeRequest, 100)
var cancelLikeChannel = make(chan dto.CommentLikeRequest, 100) // 取消点赞
func init() {
go likeConsumer() // 启动消费者
go cancelLikeConsumer() // 启动消费者
}
func likeConsumer() {
for likeRequest := range likeChannel {
processLike(likeRequest) // 处理点赞
}
}
func cancelLikeConsumer() {
for cancelLikeRequest := range cancelLikeChannel {
processCancelLike(cancelLikeRequest) // 处理取消点赞
}
}
func processLike(likeRequest dto.CommentLikeRequest) {
mx.Lock()
defer mx.Unlock()
likes := model.ScaCommentLikes{
CommentId: likeRequest.CommentId,
UserId: likeRequest.UserID,
TopicId: likeRequest.TopicId,
}
tx := global.DB.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
res := global.DB.Create(&likes) // 假设这是插入数据库的方法
if res.Error != nil {
tx.Rollback()
global.LOG.Errorln(res.Error)
return
}
// 异步更新点赞计数
go func() {
if err := commentReplyService.UpdateCommentLikesCount(likeRequest.CommentId, likeRequest.TopicId); err != nil {
global.LOG.Errorln(err)
}
}()
tx.Commit()
}
func processCancelLike(cancelLikeRequest dto.CommentLikeRequest) {
mx.Lock()
defer mx.Unlock()
tx := global.DB.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
query, u := gplus.NewQuery[model.ScaCommentLikes]()
query.Eq(&u.CommentId, cancelLikeRequest.CommentId).
Eq(&u.UserId, cancelLikeRequest.UserID).
Eq(&u.TopicId, cancelLikeRequest.TopicId)
res := gplus.Delete[model.ScaCommentLikes](query)
if res.Error != nil {
tx.Rollback()
return // 返回错误而非打印
}
// 异步更新点赞计数
go func() {
if err := commentReplyService.DecrementCommentLikesCount(cancelLikeRequest.CommentId, cancelLikeRequest.TopicId); err != nil {
global.LOG.Errorln(err)
}
}()
tx.Commit()
return
}

View File

@@ -763,35 +763,13 @@ func (CommentAPI) CommentLikes(c *gin.Context) {
result.FailWithMessage(ginI18n.MustGetMessage(c, "ParamsError"), c)
return
}
mx.Lock()
defer mx.Unlock()
likes := model.ScaCommentLikes{
// 将点赞请求发送到 channel 中
likeChannel <- dto.CommentLikeRequest{
CommentId: likeRequest.CommentId,
UserId: likeRequest.UserID,
UserID: likeRequest.UserID,
TopicId: likeRequest.TopicId,
}
tx := global.DB.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
res := gplus.Insert(&likes)
if res.Error != nil {
tx.Rollback()
global.LOG.Errorln(res.Error)
result.FailWithMessage(ginI18n.MustGetMessage(c, "CommentLikeFailed"), c)
return
}
// 更新点赞计数
if err = commentReplyService.UpdateCommentLikesCount(likeRequest.CommentId, likeRequest.TopicId); err != nil {
tx.Rollback()
global.LOG.Errorln(err)
result.FailWithMessage(ginI18n.MustGetMessage(c, "CommentLikeFailed"), c)
return
}
tx.Commit()
result.OkWithMessage(ginI18n.MustGetMessage(c, "CommentLikeSuccess"), c)
return
}
@@ -806,36 +784,16 @@ func (CommentAPI) CommentLikes(c *gin.Context) {
// @Router /auth/comment/cancel_like [post]
func (CommentAPI) CancelCommentLikes(c *gin.Context) {
likeRequest := dto.CommentLikeRequest{}
err := c.ShouldBindJSON(&likeRequest)
if err != nil {
if err := c.ShouldBindJSON(&likeRequest); err != nil {
result.FailWithMessage(ginI18n.MustGetMessage(c, "ParamsError"), c)
return
}
mx.Lock()
defer mx.Unlock()
tx := global.DB.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
query, u := gplus.NewQuery[model.ScaCommentLikes]()
query.Eq(&u.CommentId, likeRequest.CommentId).Eq(&u.UserId, likeRequest.UserID).Eq(&u.TopicId, likeRequest.TopicId)
res := gplus.Delete[model.ScaCommentLikes](query)
if res.Error != nil {
tx.Rollback()
global.LOG.Errorln(res.Error)
result.FailWithMessage(ginI18n.MustGetMessage(c, "CommentLikeCancelFailed"), c)
return
// 将取消点赞请求发送到 channel
cancelLikeChannel <- dto.CommentLikeRequest{
CommentId: likeRequest.CommentId,
UserID: likeRequest.UserID,
TopicId: likeRequest.TopicId,
}
err = commentReplyService.DecrementCommentLikesCount(likeRequest.CommentId, likeRequest.TopicId)
if err != nil {
tx.Rollback()
global.LOG.Errorln(err)
result.FailWithMessage(ginI18n.MustGetMessage(c, "CommentLikeCancelFailed"), c)
return
}
tx.Commit()
result.OkWithMessage(ginI18n.MustGetMessage(c, "CommentLikeCancelSuccess"), c)
return
}