167 lines
5.4 KiB
Go
167 lines
5.4 KiB
Go
package srv_videocollection
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
"videoweb/pub/common/srvdef"
|
|
"videoweb/pub/models/videocollectionmediamod"
|
|
"videoweb/pub/models/videoinformationmod"
|
|
"videoweb/pub/pubdef"
|
|
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
|
"go.mongodb.org/mongo-driver/mongo/options"
|
|
)
|
|
|
|
func VideoCollectionOptionMedia(ctx context.Context, req *VideoCollectionOptionMediaReq) *srvdef.SrvErr {
|
|
_, err := videoinformationmod.FindOneVideoInformation(ctx, bson.M{
|
|
videoinformationmod.FN.VideoInformation.Id: req.CollectionID,
|
|
videoinformationmod.FN.VideoInformation.MediaType: videoinformationmod.MediaType_Collection,
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if req.IsAdd {
|
|
// 追加视频
|
|
videos, err := videocollectionmediamod.FindManyVideoCollectionMediaModels(ctx, bson.M{
|
|
videocollectionmediamod.FN.VideoCollectionMediaModel.CollectionID: req.CollectionID,
|
|
videocollectionmediamod.FN.VideoCollectionMediaModel.VideoId: bson.M{"$in": req.VideoIds},
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
existVideoIds := make(map[int64]struct{}, len(videos))
|
|
for _, video := range videos {
|
|
existVideoIds[video.VideoId] = struct{}{}
|
|
}
|
|
addIds := make([]int64, 0, len(req.VideoIds))
|
|
for _, id := range req.VideoIds {
|
|
if _, ok := existVideoIds[id]; !ok {
|
|
addIds = append(addIds, id)
|
|
existVideoIds[id] = struct{}{}
|
|
}
|
|
}
|
|
if len(addIds) > 0 {
|
|
now := time.Now()
|
|
addInfos := make(videocollectionmediamod.VideoCollectionMediaModelList, 0, len(addIds))
|
|
for _, id := range addIds {
|
|
addInfos = append(addInfos, &videocollectionmediamod.VideoCollectionMediaModel{
|
|
ID: primitive.NewObjectID(),
|
|
CollectionID: req.CollectionID,
|
|
VideoId: id,
|
|
Status: pubdef.InformationStatusVerifyOK,
|
|
Rank: 0,
|
|
CreatedAt: now,
|
|
UpdatedAt: now,
|
|
})
|
|
}
|
|
err = videocollectionmediamod.InsertManyVideoCollectionMedia(ctx, addInfos)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
} else {
|
|
// 移除视频
|
|
_, err = videocollectionmediamod.DelManyVideoCollectionMediaModel(ctx, bson.M{
|
|
videocollectionmediamod.FN.VideoCollectionMediaModel.CollectionID: req.CollectionID,
|
|
videocollectionmediamod.FN.VideoCollectionMediaModel.VideoId: bson.M{"$in": req.VideoIds},
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
count, err := videocollectionmediamod.CountVideoCollectionMediaModels(ctx, bson.M{
|
|
videocollectionmediamod.FN.VideoCollectionMediaModel.CollectionID: req.CollectionID,
|
|
})
|
|
if err == nil {
|
|
_ = videoinformationmod.UpdateOneVideoInformation(ctx, bson.M{
|
|
videoinformationmod.FN.VideoInformation.Id: req.CollectionID,
|
|
}, bson.M{"$set": bson.M{
|
|
videoinformationmod.FN.VideoInformation.VideoCount: count,
|
|
videoinformationmod.FN.VideoInformation.UpdatedAt: time.Now(),
|
|
}})
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func UpdateCollectionMediaRank(ctx context.Context, req *UpdateCollectionMediaRankReq) *srvdef.SrvErr {
|
|
err := videocollectionmediamod.UpdateOneVideoCollectionMediaModel(ctx, bson.M{
|
|
videocollectionmediamod.FN.VideoCollectionMediaModel.CollectionID: req.CollectionID,
|
|
videocollectionmediamod.FN.VideoCollectionMediaModel.VideoId: req.VideoId,
|
|
}, bson.M{"$set": bson.M{
|
|
videocollectionmediamod.FN.VideoCollectionMediaModel.Rank: req.Rank,
|
|
}})
|
|
return err
|
|
}
|
|
|
|
func GetCollectionMediaList(ctx context.Context, req *GetCollectionMediaListReq) (*GetCollectionMediaListResp, *srvdef.SrvErr) {
|
|
_, err := videoinformationmod.FindOneVideoInformation(ctx, bson.M{
|
|
videoinformationmod.FN.VideoInformation.Id: req.CollectionID,
|
|
videoinformationmod.FN.VideoInformation.MediaType: videoinformationmod.MediaType_Collection,
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
opts := &options.FindOptions{}
|
|
opts.SetSort(bson.M{videocollectionmediamod.FN.VideoCollectionMediaModel.Rank: 1})
|
|
opts.SetLimit(req.PageSize)
|
|
opts.SetSkip((req.PageNum - 1) * req.PageSize)
|
|
total, err := videocollectionmediamod.CountVideoCollectionMediaModels(ctx, bson.M{
|
|
videocollectionmediamod.FN.VideoCollectionMediaModel.CollectionID: req.CollectionID,
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if total == 0 {
|
|
return &GetCollectionMediaListResp{
|
|
Total: 0,
|
|
List: make([]CollectionMediaInfo, 0),
|
|
}, nil
|
|
}
|
|
videos, err := videocollectionmediamod.FindManyVideoCollectionMediaModels(ctx, bson.M{
|
|
videocollectionmediamod.FN.VideoCollectionMediaModel.CollectionID: req.CollectionID,
|
|
}, opts)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
videoIds := make([]int64, 0, len(videos))
|
|
for _, video := range videos {
|
|
videoIds = append(videoIds, video.VideoId)
|
|
}
|
|
videoInfos, err := videoinformationmod.FindManyVideoInformations(ctx, bson.M{
|
|
videoinformationmod.FN.VideoInformation.Id: bson.M{"$in": videoIds},
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
videoInfoMap := make(map[int64]*videoinformationmod.VideoInformation, len(videoInfos))
|
|
for _, info := range videoInfos {
|
|
videoInfoMap[info.Id] = info
|
|
}
|
|
infos := make([]CollectionMediaInfo, 0, len(videos))
|
|
for _, video := range videos {
|
|
info, ok := videoInfoMap[video.VideoId]
|
|
if !ok {
|
|
continue
|
|
}
|
|
infos = append(infos, CollectionMediaInfo{
|
|
Id: video.VideoId,
|
|
Title: info.Title,
|
|
CoverImg: info.CoverImg,
|
|
Desc: info.Desc,
|
|
Remark: info.Remark,
|
|
Nodes: info.Nodes,
|
|
Status: info.Status,
|
|
Video: info.Video,
|
|
Rank: video.Rank,
|
|
UpdatedAt: video.UpdatedAt,
|
|
CreatedAt: video.CreatedAt,
|
|
})
|
|
}
|
|
resp := &GetCollectionMediaListResp{
|
|
Total: total,
|
|
List: infos,
|
|
}
|
|
return resp, nil
|
|
}
|