@@ -0,0 +1,279 @@
|
||||
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
|
||||
}
|
||||
@@ -0,0 +1,140 @@
|
||||
package likeser
|
||||
|
||||
import (
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"91porn-server/app/service/searcher"
|
||||
"91porn-server/common"
|
||||
"91porn-server/common/log"
|
||||
"91porn-server/models/v/likemod"
|
||||
"91porn-server/models/v/usermod"
|
||||
"go.mongodb.org/mongo-driver/bson/primitive"
|
||||
)
|
||||
|
||||
type VideoRes = searcher.VideoRes
|
||||
|
||||
type UserBInfo = usermod.BaseInfo
|
||||
|
||||
type ObjectID = primitive.ObjectID
|
||||
|
||||
type Like = likemod.Like
|
||||
|
||||
type Record struct {
|
||||
//点赞者UID
|
||||
LUID uint64 `json:"lUID"`
|
||||
//点赞者名字
|
||||
LName string `json:"lName"`
|
||||
//点赞者头像
|
||||
LPortrait string `json:"lPortrait"`
|
||||
//点赞类型 video:对视频点赞 comment:对评论点赞
|
||||
LType string `json:"lType"`
|
||||
//点赞时间
|
||||
LTime time.Time `json:"lTime"`
|
||||
//视屏信息
|
||||
Video VideoRes `json:"video"`
|
||||
}
|
||||
|
||||
type RecordPage struct {
|
||||
HasNext bool `json:"hasNext"`
|
||||
List []Record `json:"list"`
|
||||
}
|
||||
|
||||
func RecordPages(uid uint64, skip, limit int64) (RecordPage, error) {
|
||||
limitEx := limit + 1
|
||||
likeList, err := likemod.ListByLikedUserID(uid, skip, limitEx)
|
||||
if err != nil {
|
||||
return RecordPage{}, err
|
||||
}
|
||||
hasNext := false
|
||||
if len(likeList) > int(limit) {
|
||||
hasNext = true
|
||||
likeList = likeList[:limit]
|
||||
}
|
||||
vidMap := make(map[ObjectID]ObjectID, len(likeList)) //object->vid map
|
||||
vids := make([]ObjectID, 0, len(likeList))
|
||||
cmtIDs := make([]ObjectID, 0, len(likeList))
|
||||
uids := make([]uint64, 0, len(likeList))
|
||||
|
||||
for _, v := range likeList {
|
||||
if v.Type == "video" {
|
||||
vids = append(vids, v.ObjID) //视屏ID
|
||||
vidMap[v.ObjID] = v.ObjID
|
||||
} else if v.Type == "comment" {
|
||||
cmtIDs = append(cmtIDs, v.ObjID) //评论ID
|
||||
}
|
||||
uids = append(uids, v.UserID)
|
||||
}
|
||||
|
||||
var (
|
||||
wg = sync.WaitGroup{}
|
||||
videoResList []VideoRes
|
||||
userInfos []*UserBInfo
|
||||
)
|
||||
wg.Add(2)
|
||||
common.Go(func() {
|
||||
defer wg.Done()
|
||||
list, err := searcher.GetVideoResList(uid, vids)
|
||||
if err != nil {
|
||||
log.Error("commentser GetVideoResList faild", log.E(err))
|
||||
}
|
||||
videoResList = list
|
||||
})
|
||||
common.Go(func() {
|
||||
defer wg.Done()
|
||||
list, err := usermod.GetUsersBaseInfo(uids)
|
||||
if err != nil {
|
||||
log.Error("commentser GetUsersBaseInfo faild", log.E(err))
|
||||
}
|
||||
userInfos = list
|
||||
})
|
||||
wg.Wait()
|
||||
videoResMap := make(map[ObjectID]VideoRes, len(videoResList))
|
||||
for _, v := range videoResList {
|
||||
vidp := v.VideoInfo.ID
|
||||
if vidp != nil {
|
||||
videoResMap[*vidp] = v
|
||||
}
|
||||
}
|
||||
userInfoMap := make(map[uint64]*usermod.BaseInfo, len(userInfos))
|
||||
for _, v := range userInfos {
|
||||
userInfoMap[v.UID] = v
|
||||
}
|
||||
recordList := tRecordList(likeList, vidMap, videoResMap, userInfoMap)
|
||||
return RecordPage{
|
||||
hasNext,
|
||||
recordList,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func tRecordList(likeList []Like,
|
||||
vidMap map[ObjectID]ObjectID,
|
||||
videoResMap map[ObjectID]VideoRes,
|
||||
userInfoMap map[uint64]*usermod.BaseInfo,
|
||||
) []Record {
|
||||
recordList := make([]Record, 0, len(likeList))
|
||||
for _, v := range likeList {
|
||||
userInfo, ok := userInfoMap[v.UserID]
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
vid, ok := vidMap[v.ObjID]
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
videoRes, ok := videoResMap[vid]
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
record := Record{
|
||||
LUID: userInfo.UID,
|
||||
LName: userInfo.Name,
|
||||
LPortrait: userInfo.Portrait,
|
||||
LType: v.Type,
|
||||
LTime: v.CreatedAt,
|
||||
Video: videoRes,
|
||||
}
|
||||
recordList = append(recordList, record)
|
||||
}
|
||||
return recordList
|
||||
}
|
||||
Reference in New Issue
Block a user