package likeser import ( "91porn-server/app/service/messageser" "91porn-server/common" "91porn-server/common/constant" "91porn-server/common/log" "91porn-server/common/stderr" topser "91porn-server/common/top" topasist "91porn-server/common/top/asistant" "91porn-server/models/v/aiplazamod" "91porn-server/models/v/cmtmod" "91porn-server/models/v/likemod" "91porn-server/models/v/mediamod" "91porn-server/models/v/messagemod" "91porn-server/models/v/tagmod" "91porn-server/models/v/usermod" "91porn-server/models/v/vidmod" "errors" "fmt" "time" "github.com/gin-gonic/gin" "go.mongodb.org/mongo-driver/bson/primitive" ) // ThumbsUp 视频/评论点赞 func ThumbsUp(ctx *gin.Context, uid uint64, objType string, objID primitive.ObjectID, tagID primitive.ObjectID) (code stderr.Code, err error) { var publisherID uint64 var vMod vidmod.VideoModel var cMod cmtmod.Comment var media mediamod.Media switch objType { case constant.LikeTypeSP, constant.LikeTypeShort, constant.LikeTypeCover, constant.LikeTypePic, constant.LikeTypeSEED_LINK: publisherID, vMod, err = handleVideo(objID) if err != nil { return stderr.Failure, err } case constant.LikeTypeText, constant.LikeTypeCartoon, constant.LikeTypeComics, constant.LikeTypeDrama: media, err = handleMedia(objID) if err != nil { return stderr.Failure, err } if objType == constant.LikeTypeDrama && (media.MediaType != mediamod.MediaTypeDrama || media.Status != 1 || media.IsDelete) { return stderr.LikeErrVideoIsInvalid, errors.New("drama is inactive") } case constant.AiPlaza: // ai广场 case constant.LikeTypeComment: publisherID, cMod, vMod, err = handleComment(objID) if err != nil { return stderr.Failure, err } publisherID = cMod.UserID } lMod, err := likemod.FindOneByUIDAndObjID(uid, objID) if err != nil { code = stderr.LikeErrGetDataFailed log.Error("app service like ThumbsUp FindOneByUIDAndObjID err", log.E(err), log.Any("uid", uid), log.Any("objType", objType), log.Any("objID", objID)) return } if !lMod.ID.IsZero() { code = stderr.LikeHasAlreadyThumbs return } likeMod := likemod.Like{ Type: objType, ObjID: objID, UserID: uid, LikedUserID: publisherID, } if !tagID.IsZero() && tagmod.IsExists(tagID) { likeMod.TagID = tagID _ = tagmod.IncreaseTagLikeCount(tagID) } err = likemod.InsertOne(&likeMod) if err != nil { code = stderr.LikeErrThumbsFailed log.Error("app service like ThumbsUp InsertOne err", log.E(err), log.Any("uid", uid), log.Any("objType", objType), log.Any("objID", objID)) return } common.Go(func() { user, err := usermod.FindUserByUID(uid) if err != nil { return } // 增加视频/评论 点赞次数 switch objType { case constant.AiPlaza: aiplazamod.IncLikeCount(objID) case constant.CollectTypeSP, constant.CollectTypeShort, constant.CollectTypeCover, constant.CollectTypePIC: topasist.Incr(topser.TypeVideo(objType), objID.Hex(), 1) fallthrough case constant.LikeTypeSEED_LINK: if err := vidmod.IncrementRecommendInteraction(objID, vidmod.RecommendInteractionLike); err != nil { log.Error("increment recommend like failed", log.E(err), log.Any("objID", objID)) } err = vidmod.IncLikeCount(objID) if err != nil { code = stderr.LikeErrIncCountFailed log.Error("app service like ThumbsUp IncLikeCount err", log.E(err), log.Any("uid", uid), log.Any("objType", objType), log.Any("objID", objID)) return } // 发送动态消息 _ = messageser.DynamicMsgUserGroup(messagemod.PublicAddMsg{ SendUid: uid, TakeUid: vMod.PublisherID, MsgType: messagemod.LikeMsg, ObjId: vMod.ID, ObjName: vMod.Title, ObjCover: vMod.Cover, ObjType: vMod.NewsType, }) break case constant.LikeTypeComment: err = cmtmod.CmtIncreaseLikeCountByID(1, objID) if err != nil { code = stderr.LikeErrIncCountFailed log.Error("app service like ThumbsUp CmtIncreaseLikeCountByID err", log.E(err), log.Any("uid", uid), log.Any("objType", objType), log.Any("objID", objID)) return } dynamicContent := fmt.Sprintf("%s 于 %s 点赞了你的评论", user.Name, time.Now().Format("15:04:05")) if !vMod.ID.IsZero() && vMod.PublisherID > 0 { // 增加点赞消息通知动态 messageser.DynamicMsgUserGroup(messagemod.PublicAddMsg{ SendUid: uid, TakeUid: publisherID, MsgType: messagemod.LikeCommentMsg, ObjId: vMod.ID, ObjName: vMod.Title, ObjCover: vMod.Cover, ObjType: vMod.NewsType, Content: dynamicContent, }) } case constant.LikeTypeCartoon, constant.LikeTypeComics, constant.LikeTypeText, constant.LikeTypeDrama: err = mediamod.IncreaseCountLikeByIDs(1, objID) if err != nil { log.Error("app service media like ThumbsUp IncreaseLikeCountByID err", log.E(err), log.Any("uid", uid), log.Any("objType", objType), log.Any("objID", objID)) } if err != nil { log.Error("ReportVideoPurchase fail", log.E(err)) code = stderr.LikeErrThumbsFailed } } }) code = stderr.Success return } func handleMedia(id primitive.ObjectID) (media mediamod.Media, err error) { // 获取播单列表 media, err = mediamod.GetInfo(id) if err != nil { return media, err } if media.ID.IsZero() { return media, errors.New("media is null") } return media, nil } func handleVideo(id primitive.ObjectID) (uid uint64, vMod vidmod.VideoModel, err error) { var publishId uint64 vMod, err = vidmod.GetVideoInfo(id.Hex()) if err != nil { log.Error("app service like ThumbsUp GetVideoInfo err", log.E(err), log.Any("uid", uid), log.Any("objID", id)) return publishId, vMod, err } if vMod.ID.IsZero() { log.Error("app service like ThumbsUp video mod is nil err", log.Any("uid", uid), log.Any("objID", id)) return publishId, vMod, errors.New("video is null") } // 视频未通过审核/未审核 if vMod.Status != 1 && vMod.Status != 3 { return publishId, vMod, errors.New("video is status is err") } publishId = vMod.PublisherID // 增加作者点赞数 common.Go(func() { usermod.IncLikeCount(publishId) }) return publishId, vMod, nil } func handleComment(id primitive.ObjectID) (publishId uint64, cMod cmtmod.Comment, vMod vidmod.VideoModel, err error) { cMod, err = cmtmod.CmtFindOneByID(id) if err != nil { err = stderr.ErrDbQueryError return } if cMod.ID.IsZero() { err = stderr.ErrDbQueryError } if cMod.ObjType == "video" { // 获取视频 vMod, err = vidmod.GetVideoInfo(cMod.ObjID.Hex()) if err != nil { err = stderr.ErrDbQueryError log.Error("app service like ThumbsUp GetVideoInfo err", log.E(err), log.Any("objID", cMod.ObjID.Hex())) return } if vMod.ID.IsZero() { err = stderr.ErrDbQueryError log.Error("app service like ThumbsUp video mod is nil err", log.Any("objID", cMod.ObjID.Hex())) return } // 视频未通过审核/未审核 if vMod.Status != 1 && vMod.Status != 3 { err = stderr.LikeErrVideoIsInvalid return } } return cMod.UserID, cMod, vMod, err } // ThumbsDown 取消点赞 func ThumbsDown(ctx *gin.Context, uid uint64, objType string, objIDs ...primitive.ObjectID) (code stderr.Code, err error) { if len(objIDs) == 0 { return stderr.Success, nil } lMods, err := likemod.FindLikesByObjIDS(objType, uid, objIDs) if err != nil { code = stderr.LikeErrGetDataFailed log.Error("app service like ThumbsDown FindOneByUIDAndObjID err", log.E(err), log.Any("uid", uid), log.Any("objType", objType), log.Any("objIDs", objIDs)) return } if len(lMods) == 0 { code = stderr.LikeHasNotThumbs return } err = likemod.DeleteMany(uid, objType, objIDs) if err != nil { code = stderr.LikeErrThumbsFailed log.Error("app service like ThumbsDown DeleteOne err", log.E(err), log.Any("uid", uid), log.Any("objType", objType), log.Any("objIDs", objIDs)) return } // 减少视频/评论 点赞数 switch objType { case constant.AiPlaza: aiplazamod.DecLikeCount(objIDs) case constant.LikeTypeSP, constant.LikeTypeShort, constant.LikeTypeCover, constant.LikeTypePic, constant.LikeTypeSEED_LINK: err = vidmod.DecLikeCount(objIDs...) if err != nil { code = stderr.LikeErrDecCountFailed log.Error("app service like ThumbsDown DecLikeCount err", log.E(err), log.Any("uid", uid), log.Any("objType", objType), log.Any("objIDs", objIDs)) return } case constant.LikeTypeCartoon, constant.LikeTypeComics, constant.LikeTypeText, constant.LikeTypeDrama: err = mediamod.IncreaseCountLikeByIDs(-1, objIDs...) if err != nil { code = stderr.LikeErrGetDataFailed return } case constant.LikeTypeComment: err = cmtmod.CmtIncreaseLikeCountByID(-1, objIDs...) if err != nil { code = stderr.LikeErrDecCountFailed log.Error("app service like ThumbsDown CmtIncreaseLikeCountByID err", log.E(err), log.Any("uid", uid), log.Any("objType", objType), log.Any("objIDs", objIDs)) return } } code = stderr.Success return }