Initial commit

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-15 13:57:10 +08:00
co-authored by Claude Opus 5
commit 8679200f41
1897 changed files with 257900 additions and 0 deletions
+182
View File
@@ -0,0 +1,182 @@
package vidmod
import (
"fmt"
"strconv"
"time"
"91porn-server/common/log"
"91porn-server/common/pageopt"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo/options"
)
type VIDSlice []VideoModel
func (v VIDSlice) ToMap() map[ObjectID]*VideoModel {
m := make(map[ObjectID]*VideoModel, len(v))
for i := 0; i < len(v); i++ {
m[v[i].ID] = &v[i]
}
return m
}
func (v VIDSlice) IDs() []ObjectID {
ids := make([]ObjectID, len(v))
for i, v := range v {
ids[i] = v.ID
}
return ids
}
type Matcher = pageopt.Matcher
// IDInMatch
type IDInMatch = pageopt.IDInMatch
// PublisherIDMatch
type PublisherIDMatch struct {
PublisherID *uint64
}
func (c *PublisherIDMatch) New() Matcher {
return pageopt.NewAssignMatch("publisherID", c.PublisherID)
}
// PublisherIDInMatch
type PublisherIDInMatch struct {
PublisherIDList []uint64
}
func (c *PublisherIDInMatch) New() Matcher {
return pageopt.NewInMatch("publisherID", c.PublisherIDList)
}
// StatusInMatch
type StatusInMatch struct {
StatusList []int
}
func (c *StatusInMatch) New() Matcher {
return pageopt.NewInMatch("status", c.StatusList)
}
// StatusInMatch
type StatusMatch struct {
Status int
}
func (c *StatusMatch) New() Matcher {
return pageopt.NewAssignMatch("status", c.Status)
}
// ReviewAtGTEAndLTMatch
type ReviewAtGTEAndLTMatch struct {
GTE *time.Time
LT *time.Time
}
func (c *ReviewAtGTEAndLTMatch) New() Matcher {
return pageopt.NewGTEAndLTMatch("reviewAt", c.GTE, c.LT)
}
// UpdatedAtGTEAndLTMatch
type UpdatedAtGTEAndLTMatch struct {
GTE *time.Time
LT *time.Time
}
func (c *UpdatedAtGTEAndLTMatch) New() Matcher {
return pageopt.NewGTEAndLTMatch("updatedAt", c.GTE, c.LT)
}
type CreatedAtGTEAndLTMatch = pageopt.CreatedAtGTEAndLTMatch
type Sort = bson.D
func List(sort Sort, skip, limit *int64, matchers ...Matcher) (VIDSlice, error) {
filter := pageopt.MergeM(matchers)
opt := &options.FindOptions{}
if len(sort) != 0 {
opt.SetSort(sort)
}
if skip != nil {
opt.SetSkip(*skip)
}
if limit != nil {
opt.SetLimit(*limit)
}
list := VIDSlice{}
if err := coll(nil).Find(&list, filter, opt); err != nil {
log.Error("vidmod List error", log.E(err))
return nil, err
}
return list, nil
}
func Count(matchers ...Matcher) (int64, error) {
filter := pageopt.MergeM(matchers)
count, err := coll(nil).Count(filter)
if err != nil {
log.Error("vidmod Count error", log.E(err))
return 0, err
}
return count, nil
}
func CountMapByPublisherID(matchers ...Matcher) (map[uint64]int64, error) {
filter := pageopt.MergeM(matchers)
pipeline := []M{
{"$match": filter},
{"$group": M{"_id": "$publisherID", "count": M{"$sum": 1}}},
}
var list []struct {
PublisherID uint64 `bson:"_id"`
Count int64 `bson:"count"`
}
if err := coll(nil).Aggregate(&list, pipeline); err != nil {
log.Error(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "CountTotalLikeByUID", table, "Aggregate", err),
log.Any("filter", filter),
)
return nil, err
}
m := make(map[uint64]int64, len(list))
for _, v := range list {
m[v.PublisherID] = v.Count
}
return m, nil
}
func PublisherIDList(matchers ...Matcher) (uids []uint64, err error) {
filter := pageopt.MergeM(matchers)
list, err := coll(nil).Distinct("publisherID", filter)
if err != nil {
return nil, err
}
for _, i := range list {
id, err := strconv.Atoi(fmt.Sprintf("%v", i))
if err != nil {
continue
}
uids = append(uids, uint64(id))
}
return uids, nil
}
func CountNum(filter interface{}) (int64, error) {
count, err := coll(nil).Count(filter)
if err != nil {
log.Error("vidmod Count error", log.E(err))
return 0, err
}
return count, nil
}
func GetListByCond(cond bson.M, opts *options.FindOptions) ([]VideoModel, error) {
var data []VideoModel
if err := coll(nil).Find(&data, cond, opts); err != nil {
return nil, err
}
return data, nil
}