Files
huangguo_server/web/service/userser/report.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

211 lines
5.9 KiB
Go

package userser
import (
"time"
"91porn-server/common/pageopt"
"91porn-server/models/v/reptmod"
"91porn-server/models/v/tagmod"
"91porn-server/models/v/usermod"
"91porn-server/models/v/vidmod"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
)
type Matcher = pageopt.Matcher
type UIDMatch = pageopt.UIDMatch
// M M from Map
type M = bson.M
// D D from Doc
type D = bson.D
// A A from Array
type A = []interface{}
type ObjectID = primitive.ObjectID
type Tag struct {
ID *ObjectID `json:"id,omitempty" bson:"_id,omitempty"`
Name *string `json:"name,omitempty" bson:"tagName,omitempty"` //标签名
}
type Video struct {
Title *string `json:"title,omitempty"` //标题
PublisherID *uint64 `json:"publisherID,omitempty"` //发布者ID
HasLocked bool `json:"hasLocked"` //发布者是否被封禁
Cover *string `json:"cover,omitempty"` //封面
SourceURL *string `json:"sourceURL,omitempty"` //资源地址
SourceID *string `json:"sourceID,omitempty"` //资源ID
Tags []Tag `json:"tags,omitempty"` //标签
}
type Comment struct {
ID *ObjectID `json:"id,omitempty"` //_id
UID *uint64 `json:"uid,omitempty"` //发表评论的 用户ID
Content *string `json:"content,omitempty"` //内容
}
type ReportedUser struct {
UID *uint64 `json:"uid,omitempty"` //被举报对用户ID
HasLocked *bool `json:"hasLocked,omitempty"` //已禁止登陆
HasBanned *bool `json:"hasBanned,omitempty"` //已禁言
}
type ReportInfoDoc struct {
ID *ObjectID `json:"id,omitempty" bson:"_id,omitempty"`
UID *uint64 `json:"uid,omitempty" bson:"uid,omitempty"` //举报者ID
ObjType *reptmod.ReportObjType `json:"objType,omitempty" bson:"objType,omitempty"` //举报对象类型
ObjID *ObjectID `json:"objID,omitempty" bson:"objID,omitempty"` //举报对象ID
Types *string `json:"types,omitempty" bson:"types,omitempty"` //举报分类
CreatedAt *time.Time `json:"createdAt,omitempty" bson:"createdAt,omitempty"` //举报时间
Video Video `json:"video,omitempty" bson:"video,omitempty"` //视屏信息
Comment Comment `json:"comment,omitempty" bson:"comment,omitempty"` //评论信息
ReportedUser ReportedUser `json:"reportedUser,omitempty" bson:"reportedUser,omitempty"` //被举报的用户
ReptStatus *bool `json:"reptStatus,omitempty" bson:"reptStatus,omitempty"` //举报状态
}
type ReportInfoPage struct {
Total int64 `json:"total" bson:"total"`
List []ReportInfoDoc `json:"list" bson:"list"`
}
func ReportInfoPages(typesArray []reptmod.ReportObjType, sort D, skip int64, limit int64, uidMatch UIDMatch, typesMatch reptmod.TypesMatch, createdAtMatch reptmod.CreatedAtGTEAndLTMatch) (ReportInfoPage, error) {
inObjTypeMatch := reptmod.InObjTypeMatch{Typs: typesArray}
matList := []Matcher{
inObjTypeMatch.New(),
uidMatch.New(),
typesMatch.New(),
createdAtMatch.New(),
}
list, err := reptmod.List(sort, skip, limit, matList...)
if err != nil {
return ReportInfoPage{}, err
}
reportList, err := toReportInfoDocList(list)
if err != nil {
return ReportInfoPage{}, err
}
count, err := reptmod.Count(matList...)
if err != nil {
return ReportInfoPage{}, err
}
page := ReportInfoPage{
Total: count,
List: reportList,
}
return page, nil
}
func fillUser(doc *ReportInfoDoc, userMap map[uint64]*usermod.BaseInfo) {
if doc.ObjType == nil {
return
}
if *doc.ObjType != reptmod.User {
return
}
ruid := doc.ReportedUser.UID
if ruid == nil {
return
}
user, ok := userMap[*ruid]
if ok {
doc.ReportedUser.HasLocked = &user.HasLocked
doc.ReportedUser.HasBanned = &user.HasBanned
}
}
func fillVideo(doc *ReportInfoDoc, videoMap map[ObjectID]*vidmod.VideoModel, userMap map[uint64]*usermod.BaseInfo) {
if doc.ObjType == nil {
return
}
if *doc.ObjType != reptmod.Video {
return
}
vid := doc.ObjID
if vid == nil {
return
}
video, ok := videoMap[*vid]
if !ok {
return
}
publishID := video.PublisherID
hasLocked := false
user, ok := userMap[publishID]
if ok {
hasLocked = user.HasLocked
}
doc.Video.Title = &video.Title
doc.Video.Cover = &video.Cover
doc.Video.SourceURL = &video.SourceURL
doc.Video.SourceID = &video.SourceID
doc.Video.PublisherID = &publishID
doc.Video.HasLocked = hasLocked
tagMap, err := tagmod.TagMap(video.Tags)
if err != nil {
return
}
tagList := make([]Tag, len(tagMap))
i := 0
for _, tag := range tagMap {
tagList[i] = Tag{ID: &tag.ID, Name: &tag.TagName}
i++
}
doc.Video.Tags = tagList
}
func toReportInfoDocList(reportList []reptmod.Report) ([]ReportInfoDoc, error) {
reportListLen := len(reportList)
uidList := make([]uint64, reportListLen)
vidList := make([]ObjectID, 0, reportListLen)
for i, v := range reportList {
uidList[i] = v.UID
switch v.ObjType {
case reptmod.User:
if v.ObjUID != nil {
uidList = append(uidList, *v.ObjUID)
}
case reptmod.Video:
if v.ObjID != nil {
vidList = append(vidList, *v.ObjID)
}
}
}
videoMap, err := vidmod.VideoMap(vidList)
if err != nil {
return nil, err
}
//同时查询发布视频者的信息
for _, v := range videoMap {
uidList = append(uidList, v.PublisherID)
}
userMap, err := usermod.GetUsersBaseInfoMap(uidList)
if err != nil {
return nil, err
}
docList := make([]ReportInfoDoc, len(reportList))
for i, v := range reportList {
_v := v
doc := ReportInfoDoc{
ID: &_v.ID,
ObjType: &_v.ObjType,
UID: &_v.UID,
ReportedUser: ReportedUser{
UID: _v.ObjUID,
},
ObjID: _v.ObjID,
Types: &_v.Types,
ReptStatus: &_v.Status,
CreatedAt: &_v.CreatedAt,
}
fillUser(&doc, userMap)
fillVideo(&doc, videoMap, userMap)
docList[i] = doc
}
return docList, nil
}