Initial commit: web_hghl_server

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-10-26 16:28:14 +08:00
co-authored by Claude Opus 4.7
commit 65fca60622
653 changed files with 135901 additions and 0 deletions
+42
View File
@@ -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
}