Initial commit: web_hghl_server
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
package srv_videocollection
|
||||
|
||||
import (
|
||||
"time"
|
||||
"videoweb/pub/models/videoinformationmod"
|
||||
"videoweb/pub/pubdef"
|
||||
)
|
||||
|
||||
type VideoCollectionOptionMediaReq struct {
|
||||
CollectionID int64 `json:"collectionID" bson:"collectionID"` // 合集ID
|
||||
IsAdd bool `json:"isAdd" bson:"isAdd"` // 增加还是移除
|
||||
VideoIds []int64 `json:"videoIds" bson:"videoIds"` // 视频ID
|
||||
}
|
||||
|
||||
type UpdateCollectionMediaRankReq struct {
|
||||
CollectionID int64 `json:"collectionID" bson:"collectionID"` //合集ID
|
||||
VideoId int64 `json:"videoId" bson:"videoId"` // 视频ID
|
||||
Rank int64 `json:"rank" bson:"rank"` // 排序
|
||||
}
|
||||
|
||||
type GetCollectionMediaListReq struct {
|
||||
CollectionID int64 `json:"collectionID" bson:"collectionID"`
|
||||
pubdef.Page
|
||||
}
|
||||
type GetCollectionMediaListResp struct {
|
||||
Total int64 `json:"total" bson:"total"`
|
||||
List []CollectionMediaInfo `json:"list" bson:"list"`
|
||||
}
|
||||
|
||||
type CollectionMediaInfo struct {
|
||||
Id int64 `json:"id" bson:"_id,omitempty"`
|
||||
Title string `json:"title" bson:"title"` // 帖子标题
|
||||
CoverImg string `bson:"coverImg,omitempty" json:"coverImg"` // 封面
|
||||
Desc string `bson:"desc,omitempty" json:"desc"` // 详细描述
|
||||
Remark string `bson:"remark,omitempty" json:"remark"` // 备注
|
||||
Nodes []videoinformationmod.Node `json:"nodes" bson:"nodes"` // 节点
|
||||
Status pubdef.InformationStatus `json:"status" bson:"status"` // 帖子上架状态
|
||||
Video videoinformationmod.VideoInfo `json:"video" bson:"video"` // 视频
|
||||
Rank int64 `json:"rank" bson:"rank"` // 排序
|
||||
UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"` // 更新时间
|
||||
CreatedAt time.Time `json:"createdAt" bson:"createdAt"` // 创建时间
|
||||
}
|
||||
@@ -0,0 +1,166 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user