case-api/api/controller/Comment.go
2025-03-14 17:34:18 +08:00

429 lines
9.6 KiB
Go

package controller
import (
"case-api/api/dao"
"case-api/api/dto"
"case-api/api/model"
"case-api/api/requests"
"case-api/api/responses"
"case-api/api/service"
"case-api/global"
"case-api/utils"
"github.com/gin-gonic/gin"
"strconv"
)
type CaseComment struct {
}
// GetCaseCommentPage 获取列表-分页
func (b *CaseComment) GetCaseCommentPage(c *gin.Context) {
caseCommentRequest := requests.CaseCommentRequest{}
req := caseCommentRequest.GetCaseCommentPage
if err := c.ShouldBind(&req); err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 参数验证
if err := global.Validate.Struct(req); err != nil {
responses.FailWithMessage(utils.Translate(err), c)
return
}
if req.Page == 0 {
req.Page = 1
}
if req.PageSize == 0 {
req.PageSize = 20
}
platformId := c.GetInt64("PlatformId") // 平台id
if platformId == 0 {
responses.FailWithMessage("内部错误", c)
return
}
req.PlatformId = platformId
userId := c.GetInt64("UserId") // 用户id
if userId == 0 {
responses.FailWithMessage("内部错误", c)
return
}
req.UserId = userId
// 将 id 转换为 int64 类型
caseId, err := strconv.ParseInt(req.CaseId, 10, 64)
if err != nil {
responses.Fail(c)
return
}
// 获取病例数据
caseDao := dao.CaseDao{}
caseResult, err := caseDao.GetCaseById(caseId)
if err != nil {
responses.FailWithMessage("非法病例", c)
return
}
if caseResult.CaseStatus == 2 {
responses.FailWithMessage("非法病例", c)
return
}
// 检测病例是否属于平台
casePlatformDao := dao.CasePlatformDao{}
maps := make(map[string]interface{})
maps["case_id"] = caseId
maps["platform_id"] = platformId
_, err = casePlatformDao.GetCasePlatform(maps)
if err != nil {
responses.FailWithMessage("非法数据", c)
return
}
// 获取评论数据
caseCommentDao := dao.CaseCommentDao{}
caseComments, total, err := caseCommentDao.GetCaseCommentPageSearch(req, req.Page, req.PageSize)
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 处理返回值
g := dto.GetCaseCommentListDto(caseComments)
caseCommentLikeDao := dao.CaseCommentLikeDao{}
for _, commentDto := range g {
// 获取是否点赞
maps = make(map[string]interface{})
maps["comment_id"] = commentDto.CommentId
maps["user_id"] = userId
isLike, _ := caseCommentLikeDao.GetCaseCommentLikeCount(maps)
// 加载数据-点赞
commentDto.LoadIsLike(isLike)
// 获取次级评论
maps = make(map[string]interface{})
maps["root_id"] = commentDto.CommentId
maps["status"] = 1
subComments, _ := caseCommentDao.GetCaseCommentPreloadListLimit(maps, 5)
if len(subComments) > 0 {
// 加载数据-次级评论
commentDto.LoadCaseComment(subComments)
for _, caseCommentDto := range commentDto.CaseComment {
// 获取是否点赞
maps = make(map[string]interface{})
maps["comment_id"] = caseCommentDto.CommentId
maps["user_id"] = userId
isLike, _ = caseCommentLikeDao.GetCaseCommentLikeCount(maps)
// 加载数据-点赞
caseCommentDto.LoadIsLike(isLike)
}
// 处理剩余评论数量字段
maps = make(map[string]interface{})
maps["root_id"] = commentDto.CommentId
maps["status"] = 1
totalAmount, _ := caseCommentDao.GetCaseCommentCount(maps)
// 加载数据-剩余数量
commentDto.LoadTotalAmount(totalAmount - int64(len(subComments)))
}
}
result := make(map[string]interface{})
result["page"] = req.Page
result["page_size"] = req.PageSize
result["total"] = total
result["data"] = g
responses.OkWithData(result, c)
}
// AddCaseComment 新增
func (b *CaseComment) AddCaseComment(c *gin.Context) {
caseCommentRequest := requests.CaseCommentRequest{}
req := caseCommentRequest.AddCaseComment
if err := c.ShouldBind(&req); err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 参数验证
if err := global.Validate.Struct(req); err != nil {
responses.FailWithMessage(utils.Translate(err), c)
return
}
// 参数判断
if req.Comment.Level == 2 || req.Comment.Level == 3 {
if req.Comment.ParentId == "" || req.Comment.RootId == "" {
responses.FailWithMessage("参数错误", c)
return
}
}
platformId := c.GetInt64("PlatformId") // 平台id
if platformId == 0 {
responses.FailWithMessage("内部错误", c)
return
}
userId := c.GetInt64("UserId") // 用户id
if userId == 0 {
responses.FailWithMessage("内部错误", c)
return
}
req.PlatformId = platformId
req.UserId = userId
// 将 id 转换为 int64 类型
caseId, err := strconv.ParseInt(req.CaseId, 10, 64)
if err != nil {
responses.Fail(c)
return
}
// 获取病例数据
caseDao := dao.CaseDao{}
caseResult, err := caseDao.GetCaseById(caseId)
if err != nil {
responses.FailWithMessage("非法病例", c)
return
}
if caseResult.CaseStatus == 2 {
responses.FailWithMessage("非法病例", c)
return
}
// 检测病例是否属于平台
casePlatformDao := dao.CasePlatformDao{}
maps := make(map[string]interface{})
maps["case_id"] = caseId
maps["platform_id"] = platformId
casePlatform, err := casePlatformDao.GetCasePlatform(maps)
if err != nil {
responses.FailWithMessage("非法数据", c)
return
}
// 处理评论内容
basicSensitiveWordService := service.BasicSensitiveWordService{}
content, isSensitive := basicSensitiveWordService.Filter(req.Comment.Content)
// 开始事务
tx := global.Db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
// 新增评论
caseCommentDao := dao.CaseCommentDao{}
caseComment := &model.CaseComment{
CaseId: caseId,
PlatformId: platformId,
Level: req.Comment.Level,
UserId: userId,
Status: 1,
IsSensitive: isSensitive,
IsHighQuality: 0,
IsGrantHighQuality: 0,
LikeNum: 0,
Content: content,
}
if isSensitive == 1 {
caseComment.ContentWord = req.Comment.Content
}
// 评论根id
if req.Comment.RootId != "" {
rootId, err := strconv.ParseInt(req.Comment.RootId, 10, 64)
if err != nil {
tx.Rollback()
responses.FailWithMessage("评论失败", c)
return
}
caseComment.RootId = rootId
}
// 评论父级id
if req.Comment.ParentId != "" {
parentId, err := strconv.ParseInt(req.Comment.ParentId, 10, 64)
if err != nil {
tx.Rollback()
responses.FailWithMessage("评论失败", c)
return
}
caseComment.ParentId = parentId
}
caseComment, err = caseCommentDao.AddCaseComment(tx, caseComment)
if err != nil {
tx.Rollback()
responses.FailWithMessage("评论失败", c)
return
}
// 增加病例留言人数
caseService := service.CaseService{}
err = caseService.AddCaseMessageNum(tx, caseId, casePlatform.CasePlatformId)
if err != nil {
tx.Rollback()
responses.FailWithMessage("评论失败", c)
return
}
tx.Commit()
responses.Ok(c)
}
// AddCaseCommentLike 新增点赞
func (b *CaseComment) AddCaseCommentLike(c *gin.Context) {
id := c.Param("comment_id")
if id == "" {
responses.FailWithMessage("缺少参数", c)
return
}
// 将 id 转换为 int64 类型
commentId, err := strconv.ParseInt(id, 10, 64)
if err != nil {
responses.Fail(c)
return
}
userId := c.GetInt64("UserId") // 用户id
if userId == 0 {
responses.FailWithMessage("内部错误", c)
return
}
// 检测用户是否已点赞
caseCommentLikeDao := dao.CaseCommentLikeDao{}
maps := make(map[string]interface{})
maps["comment_id"] = commentId
maps["user_id"] = userId
caseCommentLike, _ := caseCommentLikeDao.GetCaseCommentLike(maps)
if caseCommentLike != nil {
// 已点赞
responses.Ok(c)
return
}
// 开始事务
tx := global.Db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
// 新增点赞
caseCommentLike = &model.CaseCommentLike{
CommentId: commentId,
UserId: userId,
}
_, err = caseCommentLikeDao.AddCaseCommentLike(tx, caseCommentLike)
if err != nil {
tx.Rollback()
responses.FailWithMessage("操作失败", c)
return
}
// 新增点赞数
caseCommentDao := dao.CaseCommentDao{}
err = caseCommentDao.Inc(tx, commentId, "like_num", 1)
if err != nil {
tx.Rollback()
responses.FailWithMessage("操作失败", c)
return
}
tx.Commit()
responses.Ok(c)
}
// DeleteCaseCommentLike 取消点赞
func (b *CaseComment) DeleteCaseCommentLike(c *gin.Context) {
id := c.Param("comment_id")
if id == "" {
responses.FailWithMessage("缺少参数", c)
return
}
// 将 id 转换为 int64 类型
commentId, err := strconv.ParseInt(id, 10, 64)
if err != nil {
responses.Fail(c)
return
}
// 获取评论数据
caseCommentDao := dao.CaseCommentDao{}
caseComment, _ := caseCommentDao.GetCaseCommentById(commentId)
if caseComment == nil {
responses.FailWithMessage("操作失败", c)
return
}
userId := c.GetInt64("UserId") // 用户id
if userId == 0 {
responses.FailWithMessage("内部错误", c)
return
}
// 检测用户是否已点赞
caseCommentLikeDao := dao.CaseCommentLikeDao{}
maps := make(map[string]interface{})
maps["comment_id"] = commentId
maps["user_id"] = userId
caseCommentLike, _ := caseCommentLikeDao.GetCaseCommentLike(maps)
if caseCommentLike == nil {
// 未点赞
responses.Ok(c)
return
}
// 开始事务
tx := global.Db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
// 删除点赞
err = caseCommentLikeDao.DeleteCaseCommentLikeById(tx, caseCommentLike.LikeId)
if err != nil {
tx.Rollback()
responses.FailWithMessage("操作失败", c)
return
}
// 去除点赞数
if caseComment.LikeNum > 0 {
err = caseCommentDao.Dec(tx, commentId, "like_num", 1)
if err != nil {
tx.Rollback()
responses.FailWithMessage("操作失败", c)
return
}
}
tx.Commit()
responses.Ok(c)
}