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 } }