Files
hjsq_server/app/service/reportser/video.go
T
2026-10-08 16:50:13 +08:00

192 lines
5.3 KiB
Go

package reportser
import (
"strings"
"91jd-server/common/dataReport"
"91jd-server/common/db"
"91jd-server/common/log"
"91jd-server/middleware/ua"
"91jd-server/models/v/moduleconfmod"
"91jd-server/models/v/usermod"
"91jd-server/models/v/vidmod"
"go.mongodb.org/mongo-driver/bson/primitive"
)
type videoMeta struct {
mediaID string
videoTypeID string
videoTypeName string
videoContentType string
}
func (m videoMeta) toEventCore(videoID, title string, recommendTraceID string) dataReport.VideoEventCore {
return dataReport.VideoEventCore{
MediaID: m.mediaID,
VideoID: videoID,
VideoTitle: title,
VideoTypeID: m.videoTypeID,
VideoTypeName: m.videoTypeName,
VideoContentType: m.videoContentType,
RecommendTraceID: recommendTraceID,
}
}
func ReportVideoLikeEvent(t *db.MongoTool, user *usermod.User, ua ua.UA, ip string, video *vidmod.VideoModel, cancel bool) error {
if user == nil || video == nil || video.ID.IsZero() {
return nil
}
flag := int64(1)
if cancel {
flag = 2
}
meta := extractVideoMeta(video)
event := dataReport.NewCommonField(dataReport.GenerateGlobalEventID(), dataReport.EventTypeVideoLike, user.UID, user.DistrictCode, ua, ip)
event.Payload = jsonRawMessage(&dataReport.VideoLikeEvent{
VideoEventCore: meta.toEventCore(video.ID.Hex(), video.Title, ""),
Flag: jsonNumber(flag),
})
return persistEvent(t, event)
}
func ReportVideoCollectEvent(t *db.MongoTool, user *usermod.User, ua ua.UA, ip string, video *vidmod.VideoModel, cancel bool) error {
if user == nil || video == nil || video.ID.IsZero() {
return nil
}
flag := int64(1)
if cancel {
flag = 2
}
meta := extractVideoMeta(video)
event := dataReport.NewCommonField(dataReport.GenerateGlobalEventID(), dataReport.EventTypeVideoCollect, user.UID, user.DistrictCode, ua, ip)
event.Payload = jsonRawMessage(&dataReport.VideoCollectEvent{
VideoEventCore: meta.toEventCore(video.ID.Hex(), video.Title, ""),
Flag: jsonNumber(flag),
})
return persistEvent(t, event)
}
func ReportVideoCommentEvent(t *db.MongoTool, user *usermod.User, ua ua.UA, ip string, video *vidmod.VideoModel, comment string) error {
if user == nil || video == nil || video.ID.IsZero() {
return nil
}
meta := extractVideoMeta(video)
event := dataReport.NewCommonField(dataReport.GenerateGlobalEventID(), dataReport.EventTypeVideoComment, user.UID, user.DistrictCode, ua, ip)
event.Payload = jsonRawMessage(&dataReport.VideoCommentEvent{
VideoEventCore: meta.toEventCore(video.ID.Hex(), video.Title, ""),
CommentContent: comment,
})
return persistEvent(t, event)
}
func ReportVideoStatusChangeEvent(video *vidmod.VideoModel, flag int64) {
if video == nil || video.ID.IsZero() || flag == 0 {
return
}
user, err := usermod.FindUserByUID(video.PublisherID)
if err != nil || user == nil {
return
}
meta := extractVideoMeta(video)
uaInfo := ua.UA{SysType: "PC"}
event := dataReport.NewCommonField(dataReport.GenerateGlobalEventID(), dataReport.EventTypeVideoStatusChange, user.UID, user.DistrictCode, uaInfo, "")
event.Payload = jsonRawMessage(&dataReport.VideoStatusChangeEvent{
MediaID: meta.mediaID,
VideoID: video.ID.Hex(),
VideoTitle: video.Title,
VideoTypeID: meta.videoTypeID,
VideoTypeName: meta.videoTypeName,
Flag: jsonNumber(flag),
})
if err := persistEvent(nil, event); err != nil {
log.Error("ReportVideoStatusChangeEvent fail", log.Any("video", video.ID.Hex()), log.E(err))
}
}
func ReportVideoStatusChangeByIDs(ids []primitive.ObjectID, flag int64) {
if len(ids) == 0 || flag == 0 {
return
}
videos, err := vidmod.GetVideoListByIDsNoStatus(ids)
if err != nil {
log.Error("ReportVideoStatusChangeByIDs fail", log.E(err))
return
}
for _, video := range videos {
if video == nil || video.ID.IsZero() {
continue
}
videoCopy := *video
ReportVideoStatusChangeEvent(&videoCopy, flag)
}
}
func ReportVideoStatusByStatus(ids []primitive.ObjectID, status int) {
if flag := VideoStatusFlag(status); flag != 0 {
ReportVideoStatusChangeByIDs(ids, flag)
}
}
func extractVideoMeta(video *vidmod.VideoModel) videoMeta {
if video == nil {
return videoMeta{}
}
meta := videoMeta{
mediaID: videoMediaID(video),
videoContentType: resolveVideoContentType(video),
}
if strings.TrimSpace(video.MID) != "" {
oid, err := primitive.ObjectIDFromHex(video.MID)
if err == nil {
module, _ := moduleconfmod.GetByID(oid)
if !module.ID.IsZero() {
meta.videoTypeID = module.ID.Hex()
meta.videoTypeName = module.ModuleName
}
}
}
if meta.videoTypeID == "" || meta.videoTypeName == "" {
meta.videoTypeID = "default"
meta.videoTypeName = "默认分类"
}
return meta
}
func videoMediaID(video *vidmod.VideoModel) string {
if video == nil {
return ""
}
if strings.EqualFold(strings.TrimSpace(video.Via), "laosiji") {
return strings.TrimSpace(video.SourceID)
}
return ""
}
func resolveVideoContentType(video *vidmod.VideoModel) string {
if video == nil {
return ""
}
switch video.NewsType {
case vidmod.SHORT:
return "short_video"
default:
return "video"
}
}
func VideoStatusFlag(status int) int64 {
switch status {
case vidmod.OnlinePass:
return 1
case vidmod.OffShelf, vidmod.IsDeleted:
return 2
case vidmod.CheckPass, vidmod.Free:
return 3
case vidmod.CheckFailure:
return 4
default:
return 0
}
}