Files
huangguo_server/app/api/commentctrl/commentctrl.go
T
rootandClaude Opus 5 8679200f41 Initial commit
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 13:57:10 +08:00

308 lines
11 KiB
Go

package commentctrl
import (
"91porn-server/app/service/commentser"
"91porn-server/common"
"91porn-server/common/log"
"91porn-server/common/stderr"
"91porn-server/models/commod"
"91porn-server/models/v/aiplazamod"
"91porn-server/models/v/cmtmod"
"91porn-server/models/v/mediamod"
"91porn-server/models/v/noticerecdmod"
"time"
"github.com/gin-gonic/gin"
"go.mongodb.org/mongo-driver/bson/primitive"
)
// List doc
// @Summary 评论模块 - 获取评论列表
// @Description 用户评论
// @Tags Comment
// @Accept mpfd,json
// @Produce json,html
// @Param objID query string true "评论对象的ID"
// @Param curTime query string true "打开评论列表的时间"
// @Param objType query string true "评论对象类型 video/cartoon/drama/AiPlaza"
// @Param pageNumber query integer true "当前页" mininum(1)
// @Param pageSize query integer true "每页条数" mininum(1)
// @Success 200 {object} cmtmod.ParentRespList "{"msg": "操作成功"}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /api/app/comment/list [get]
func List(ctx *gin.Context) {
uid, _ := common.GetUID(ctx)
type Info struct {
ObjID string `form:"objID" json:"objID" binding:"required"` //评论对象的ID
CurTime time.Time `form:"curTime" json:"curTime" binding:"required"` //打开评论列表的时间
ObjType string `form:"objType" json:"objType"` // 评论对象类型 video:视频(默认) cartoon:动漫 AiPlaza:ai广场
commod.Page
}
param := Info{}
err := ctx.ShouldBind(&param)
if err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, err)
return
}
objID, err := primitive.ObjectIDFromHex(param.ObjID)
if err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, err)
return
}
var (
data = make(map[string]interface{})
vCnt int64 = 0
fCnt int64 = 0
hasNext bool
code stderr.Code
)
// 获取第一层评论总数,在获取第一页评论时返回总评论数
if param.Page.PageNumber == 1 {
if param.ObjType == "" || param.ObjType == "video" {
code, vCnt, err := commentser.GetVideoTotalComments(objID)
if err != nil {
common.ServeJSON(ctx, code, err)
return
}
data["total"] = vCnt // 总评论条数
} else if param.ObjType == cmtmod.OTypeCartoon || param.ObjType == cmtmod.OTypeDrama {
media, _ := mediamod.GetInfo(objID)
data["total"] = media.CountComment // 总评论条数
} else if param.ObjType == "AiPlaza" {
// ai广场
aiplaza, _ := aiplazamod.GetInfo(objID)
data["total"] = aiplaza.CommentCount // 总评论条数
}
} else {
code, fCnt, err = commentser.GetTotalComments(objID, param.ObjType)
if err != nil {
common.ServeJSON(ctx, code, err)
return
}
}
code, list, hasNext, err := commentser.GetParentCmtList(uid, objID, param.ObjType, param.CurTime, param.Page)
if err != nil {
common.ServeJSON(ctx, code, err)
return
}
// 获取置顶快捷搜索
if param.PageNumber == 1 {
list = commentser.QuickSearch(objID.Hex(), list)
if len(list) == 1 && vCnt == 0 {
data["total"] = 1
fCnt = 1
}
}
data["lfCount"] = fCnt // 一级评论条数
data["hasNext"] = hasNext
data["list"] = list
common.ServeJSON(ctx, code, data)
}
// Send doc
// @Summary 评论模块 - 发表评论
// @Description 用户评论
// @Tags Comment
// @Accept mpfd,json
// @Produce json,html
// @Param objType formData string true "评论对象类型 video:视频(默认) cartoon:动漫 AiPlaza:ai广场"
// @Param objID formData string true "评论对象的ID 帖子的ID"
// @Param cid formData string false "此评论是对某条评论的评论或回复 一级评论的ID,如果为空,则为对该视频的评论"
// @Param rid formData string false "被回复的评论id"
// @Param level formData integer false "评论层级 1:一级评论 2:二级评论"
// @Param toUserID formData integer false "对某用户回复评论 用户ID"
// @Param content formData string true "评论内容"
// @Success 200 {string} json "{"msg": "操作成功"}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /api/app/comment/send [post]
func Send(ctx *gin.Context) {
uid, err := common.GetUID(ctx)
if err != nil {
common.ServeJSON(ctx, stderr.ErrNoToken, err)
return
}
param := cmtmod.PublishReqInfo{}
err = ctx.ShouldBind(&param)
if err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, err)
return
}
if param.Level != 1 && param.Level != 2 {
common.ServeJSON(ctx, stderr.ErrParamError, err)
return
}
if param.Content == "" && param.Image == "" {
common.ServeJSON(ctx, stderr.ErrParamError, err)
return
}
ua, err := common.GetUA(ctx)
if err != nil {
common.ServeJSON(ctx, stderr.Failure, err.Error())
return
}
ip := common.GetIP(ctx)
code, data, err := commentser.PublishComment(uid, ua, ip, param)
if err != nil {
common.ServeJSON(ctx, code, err)
return
}
if code == stderr.CommentUserNotBind {
common.ServeJSON(ctx, code, nil)
return
}
common.ServeJSON(ctx, code, data)
}
// NoVidSend doc
// @Summary 评论模块 - 发表评论,非视频帖子评论
// @Description 用户评论
// @Tags Comment
// @Accept mpfd,json
// @Produce json,html
// @Param objID formData string true "评论对象的ID 帖子的ID"
// @Param cid formData string false "此评论是对某条评论的评论或回复 一级评论的ID,如果为空,则为对该视频的评论"
// @Param rid formData string false "被回复的评论id"
// @Param level formData integer false "评论层级 1:一级评论 2:二级评论"
// @Param toUserID formData integer false "对某用户回复评论 用户ID"
// @Param content formData string true "评论内容"
// @Success 200 {string} json "{"msg": "操作成功"}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /comment/sendV2 [post]
func NoVidSend(ctx *gin.Context) {
uid, err := common.GetUID(ctx)
if err != nil {
common.ServeJSON(ctx, stderr.ErrNoToken, err)
return
}
type Info struct {
CmtType string `form:"cmtType" json:"cmtType"` //评论类型,desire:愿望工单
cmtmod.PublishReqInfo
}
param := Info{}
err = ctx.ShouldBind(&param)
if err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, err)
return
}
code, data, err := commentser.NoVidPublishComment(uid, common.GetIP(ctx), param.CmtType, param.PublishReqInfo)
if err != nil {
common.ServeJSON(ctx, code, err)
return
}
if code == stderr.CommentUserNotBind {
common.ServeJSON(ctx, code, nil)
return
}
common.ServeJSON(ctx, code, data)
}
// Info doc
// @Summary 评论模块 - 获取评论详情(获取二级评论)
// @Description 用户评论
// @Tags Comment
// @Accept mpfd,json
// @Produce json,html
// @Param objID query string true "评论对象的ID"
// @Param cmtId query string true "评论id"
// @Param curTime query string true "打开评论列表的时间"
// @Param fstID query string true "默认展示的第一条二级评论的id"
// @Param pageNumber query integer true "当前页" mininum(1)
// @Param pageSize query integer true "每页条数" mininum(1)
// @Success 200 {string} json "{"msg": "操作成功"}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /comment/info [get]
func Info(ctx *gin.Context) {
uid, err := common.GetUID(ctx)
if err != nil {
common.ServeJSON(ctx, stderr.ErrNoToken, err)
return
}
type Info struct {
ObjID string `form:"objID" json:"objID" binding:"required"` //评论对象的ID
CmtID string `form:"cmtId" json:"cmtId" binding:"required"` //某条评论id,用于获取该评论下的评论
FstID string `form:"fstID" json:"fstID" binding:"required"` //默认展示的第一条二级评论的id
CurTime time.Time `form:"curTime" json:"curTime" binding:"required"` //打开评论列表的时间
commod.Page
}
param := Info{}
err = ctx.ShouldBind(&param)
if err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, err)
return
}
objID, err := primitive.ObjectIDFromHex(param.ObjID)
if err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, err)
return
}
cmtID, err := primitive.ObjectIDFromHex(param.CmtID)
if err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, err)
return
}
fstID, err := primitive.ObjectIDFromHex(param.FstID)
if err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, err)
return
}
var code stderr.Code
var data []cmtmod.ChildRespList
code, data, err = commentser.GetChildCmtList(uid, objID, cmtID, fstID, param.CurTime, param.Page)
if err != nil {
common.ServeJSON(ctx, code, err)
return
}
var hasNext bool
if len(data) > int(param.PageSize) {
hasNext = true
data = data[:param.PageSize]
}
common.ServeJSON(ctx, code, commod.ListResp{HasNext: hasNext, List: data})
}
// ReplyList doc
// @Summary 评论模块 - 回复列表
// @Description 回复列表
// @Tags Comment
// @Accept mpfd,json
// @Produce json,html
// @Param pageNumber query integer true "当前页" mininum(1)
// @Param pageSize query integer true "每页条数" mininum(1)
// @Success 200 {string} json "{"msg": "操作成功"}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /comment/reply/list [get]
func ReplyList(c *gin.Context) {
var arg struct {
commod.Page
}
if err := c.ShouldBind(&arg); err != nil {
common.ServeJSON(c, stderr.ErrParamError, "comment RecordList arg error "+err.Error())
return
}
// 检查uid是否存在
uid, err := common.GetUID(c)
if err != nil {
common.ServeJSON(c, stderr.UserIsNotExists, "comment RecordList Context USER_ID is not exist ")
return
}
skip := (arg.PageNumber - 1) * arg.PageSize
limit := arg.PageSize
replyPage, err := commentser.ReplyPages(uid, int64(skip), int64(limit))
if err != nil {
common.ServeJSON(c, stderr.ErrNetWorkBusy, err)
return
}
err = noticerecdmod.UpdateTrendReadTime(noticerecdmod.Cmet, uid, time.Now())
if err != nil {
log.Error("commentctrl ReplyList UpdateTrendReadTime faild", log.E(err))
}
common.ServeJSON(c, stderr.Success, replyPage)
}