Files
huangguo_server/models/v/modulevidmod/modulevid.go
T
rootandClaude Opus 5 8679200f41 Initial commit
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 13:57:10 +08:00

239 lines
6.9 KiB
Go

package modulevidmod
import (
"context"
"fmt"
"time"
"91porn-server/common"
"91porn-server/common/db"
"91porn-server/models"
"91porn-server/models/commod"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
var mdb *db.MongoDB
const table = models.SectionVideo
// InitIndex 设置index
func initIndex() {
many := []mongo.IndexModel{
{
Keys: bson.D{{Key: "sectionID", Value: 1}, {Key: "videoID", Value: 1}},
Options: options.Index().SetUnique(true),
},
{
Keys: bson.D{{Key: "sectionID", Value: 1}, {Key: "sortCode", Value: -1}, {Key: "videoReviewedAt", Value: -1}},
},
{
Keys: bson.D{{Key: "sectionID", Value: 1}, {Key: "newsType", Value: 1}, {Key: "sortCode", Value: -1}, {Key: "videoReviewedAt", Value: -1}},
},
// 改类型的时候,需要根据videoID变更newsType
{
Keys: bson.D{{Key: "videoID", Value: 1}},
},
{
Keys: bson.D{{Key: "sectionID", Value: 1}, {Key: "createdAt", Value: -1}},
},
}
if _, err := coll(nil).CreateIndex(many); err != nil {
panic(fmt.Sprintf("%s model set index err ==>[%+v]", table, err))
}
}
func coll(t *db.MongoTool) *db.MongoTool {
if t == nil {
return mdb.Coll(table)
}
return t.Coll(table)
}
// InsertOne 插入一条数据
func InsertOne(p *SectionVideo) error {
p.CreatedAt = time.Now()
_, err := coll(nil).InsertOne(p)
return err
}
func UpdateNewsTypeByVideoID(videoID primitive.ObjectID, newsType string) (err error) {
filter := bson.M{"videoID": videoID}
_, err = coll(nil).UpdateOne(filter, bson.M{"$set": bson.M{"newsType": newsType}})
return err
}
// UpdateOne 更新一条数据
func UpdateOne(set *EditSelector) error {
set.UpdatedAt = time.Now()
var filter primitive.M
if set.ID != nil && !set.ID.IsZero() {
filter = bson.M{"_id": set.ID}
} else if set.SectionID != nil && !set.SectionID.IsZero() && set.VideoID != nil && !set.VideoID.IsZero() {
filter = bson.M{"sectionID": set.SectionID, "videoID": set.VideoID}
}
_, err := coll(nil).UpdateOne(filter, bson.M{"$set": set})
return err
}
// DeleteOne 删除一条数据
func DeleteOne(id primitive.ObjectID) (err error) {
_, err = coll(nil).DeleteById(id)
return
}
// BatchDeleteVideo 批量删除专题下视频
func BatchDeleteVideo(ctx context.Context, sectionID primitive.ObjectID, vids []primitive.ObjectID) error {
_, err := coll(nil).DeleteMany(bson.M{"sectionID": sectionID, "videoID": bson.M{"$in": vids}})
return err
}
// DeleteManyVideo 批量删除专题下视频
func DeleteManyVideo(ids []primitive.ObjectID) error {
_, err := coll(nil).DeleteMany(bson.M{"_id": bson.M{"$in": ids}})
return err
}
// DeleteManyByVids 批量删除专题下视频,根据视频ID
func DeleteManyByVids(vids []primitive.ObjectID) error {
_, err := coll(nil).DeleteMany(bson.M{"videoID": bson.M{"$in": vids}})
return err
}
// Search 根据条件检索
func Search(q *QuerySelector, page commod.Page) (videos []SectionVideo, hasNext bool, total int64, err error) {
filter, err := common.ToBsonM(q)
if err != nil {
return
}
skip := int64(page.Skip())
limit := int64(page.Limit() + 1)
opts := options.FindOptions{
Skip: &skip,
Limit: &limit,
Sort: page.GetSort(),
}
if err = coll(nil).Find(&videos, filter, &opts); err != nil {
return
}
total, err = coll(nil).Count(filter)
if uint64(len(videos)) > page.Limit() {
hasNext = true
videos = videos[:page.Limit()]
}
return
}
// Find 查询所有
func Find(filter primitive.M, opts ...*options.FindOptions) ([]SectionVideo, error) {
var videos []SectionVideo
return videos, coll(nil).Find(&videos, filter, opts...)
}
func GetBySectionIDWithPage(sectionID primitive.ObjectID, page commod.Page) (videoIDs []primitive.ObjectID, hasNext bool, err error) {
projection := bson.D{
{Key: "_id", Value: 0},
{Key: "videoID", Value: 1},
}
opts := options.FindOptions{}
size := page.Limit()
opts.SetProjection(projection).SetSort(page.GetSort()).SetSkip(int64(page.Skip())).SetLimit(int64(size + 1))
var p []struct {
VideoID primitive.ObjectID `bson:"videoID"`
}
if err = coll(nil).Find(&p, bson.M{"sectionID": sectionID}, &opts); err != nil {
return
}
if uint64(len(p)) > size {
hasNext = true
p = p[:size]
}
videoIDs = make([]primitive.ObjectID, len(p))
for i, v := range p {
videoIDs[i] = v.VideoID
}
return
}
// GetSectionVideosBySectionID 根据专题获取视频列表
func GetSectionVideosBySectionID(sectionID primitive.ObjectID) (list []SectionVideo, err error) {
err = coll(nil).Find(&list, bson.M{"sectionID": sectionID}, options.Find().SetSort(bson.D{{Key: "sortCode", Value: -1}, {Key: "videoReviewedAt", Value: -1}}))
return
}
// SectionVideosBySectionID 根据专题获取视频列表
func SectionVideosBySectionID(sectionID primitive.ObjectID, opts *options.FindOptions) ([]SectionVideo, error) {
var out []SectionVideo
return out, coll(nil).Find(&out, bson.M{"sectionID": sectionID}, opts)
}
func GetVideosBySectionIDs(sectionIDs []primitive.ObjectID) (list []SectionVideo, err error) {
err = coll(nil).Find(&list, bson.M{"sectionID": bson.M{"$in": sectionIDs}})
return
}
// GetSectionVideosBySectionIDSort 根据专题获取视频列表
func GetSectionVideosBySectionIDSort(sectionID primitive.ObjectID, limit int64) (list []SectionVideo, err error) {
err = coll(nil).Find(&list, bson.M{"sectionID": sectionID}, options.Find().SetSort(bson.D{{Key: "SortCode", Value: -1}}).SetLimit(limit))
return
}
func GetBySectionIDAndVids(sectionID primitive.ObjectID, vids []primitive.ObjectID) (videos []SectionVideo, err error) {
filter := bson.M{"videoID": bson.M{"$in": vids}}
if !sectionID.IsZero() {
filter["sectionID"] = sectionID
}
err = coll(nil).Find(&videos, filter)
return
}
func GetBySectionID(sectionID primitive.ObjectID, isSorted bool) (videoIDs []primitive.ObjectID, err error) {
projection := bson.D{
{Key: "_id", Value: 0},
{Key: "videoID", Value: 1},
}
opts := options.FindOptions{}
opts.SetProjection(projection)
var p []struct {
VideoID primitive.ObjectID `bson:"videoID"`
}
filter := bson.M{"sectionID": sectionID}
if isSorted {
filter["sortCode"] = bson.M{"$gt": 0}
opts.SetSort(bson.D{{Key: "sortCode", Value: -1}, {Key: "videoReviewedAt", Value: -1}})
}
if err = coll(nil).Find(&p, filter, &opts); err != nil {
return
}
videoIDs = make([]primitive.ObjectID, len(p))
for i, v := range p {
videoIDs[i] = v.VideoID
}
return
}
func InsertMany(records []SectionVideo) error {
opts := options.InsertMany().SetOrdered(false)
_, err := coll(nil).InsertMany(records, opts)
if !db.IsMongoDupKey(err) {
return err
}
return nil
}
func GetSectionsByVideoId(id primitive.ObjectID) ([]SectionVideo, error) {
if id.IsZero() {
return nil, nil
}
var svs []SectionVideo
return svs, coll(nil).Find(&svs, bson.M{"videoID": id})
}
func GetSectionsByVideoIds(ids []primitive.ObjectID) ([]SectionVideo, error) {
var svs []SectionVideo
return svs, coll(nil).Find(&svs, bson.M{"videoID": bson.M{"$in": ids}})
}