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
+183
View File
@@ -0,0 +1,183 @@
package adsmod
import (
"time"
"91porn-server/common/log"
"91porn-server/common/pageopt"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo/options"
)
type AdsSlice []Ads
func (r AdsSlice) Len() int {
return len(r)
}
func (r AdsSlice) Swap(i, j int) {
r[i], r[j] = r[j], r[i]
}
func (r AdsSlice) Less(i, j int) bool {
return r[i].SortCode < r[j].SortCode
}
func (a AdsSlice) ToIDs() []ObjectID {
ids := make([]ObjectID, 0, len(a))
for _, v := range a {
ids = append(ids, v.ID)
}
return ids
}
func (a AdsSlice) ToPositions() []AdPosition {
ps := make([]AdPosition, 0, len(a))
for _, v := range a {
ps = append(ps, v.Position)
}
return ps
}
func (a AdsSlice) SliceByPosition(position AdPosition) AdsSlice {
ads := make(AdsSlice, 0, len(a))
for _, v := range a {
if v.Position == position {
ads = append(ads, v)
}
}
return ads
}
type Matcher = pageopt.Matcher
// AdsTypeMatch
type AdsTypeMatch struct {
AdsType *AdsType
}
func (a *AdsTypeMatch) New() Matcher {
return pageopt.NewAssignMatch("adsType", a.AdsType)
}
// AdPositionMatch
type AdPositionMatch struct {
Position *AdPosition
}
func (a *AdPositionMatch) New() Matcher {
return pageopt.NewAssignMatch("position", a.Position)
}
// AdPositionNinMatch
type AdPositionNinMatch struct {
PositionList []AdPosition
}
func (a *AdPositionNinMatch) New() Matcher {
return pageopt.NewNinMatch("position", a.PositionList)
}
// DistrictCodeMatch
type DistrictCodeMatch struct {
DistrictCode *string
}
func (a *DistrictCodeMatch) New() Matcher {
return pageopt.NewAssignMatch("districtCode", a.DistrictCode)
}
// ActiveMatch
type ActiveMatch struct {
Active *bool
}
type StartLTEMatch struct {
t time.Time
}
// IDMatch
type IDMatch = pageopt.IDMatch
// IDInMatch
type IDInMatch = pageopt.IDInMatch
type Sort = bson.D
type EndGTMatch struct {
t time.Time
}
func (a *ActiveMatch) New() Matcher {
return pageopt.NewAssignMatch("active", a.Active)
}
func (s *StartLTEMatch) New() Matcher {
return pageopt.NewLTEMatch("start", s.t)
}
func (e *EndGTMatch) New() Matcher {
return pageopt.NewGTMatch("end", e.t)
}
var (
Sort_createdAt_N1 = Sort{{Key: "createdAt", Value: -1}}
Sort_sortCode_N1 = Sort{{Key: "sortCode", Value: -1}}
)
func List(sort Sort, skip, limit *int64, matchs ...Matcher) (AdsSlice, error) {
filter := pageopt.MergeM(matchs)
opt := (&options.FindOptions{})
if len(sort) != 0 {
opt.SetSort(sort)
}
if skip != nil {
opt.SetSkip(*skip)
}
if limit != nil {
opt.SetLimit(*limit)
}
list := AdsSlice{}
err := coll(nil).Find(&list, filter, opt)
if err != nil {
log.Error("adsmod List error", log.E(err))
return nil, err
}
return list, nil
}
func Count(matchs ...Matcher) (int64, error) {
filter := pageopt.MergeM(matchs)
count, err := coll(nil).Count(filter)
if err != nil {
log.Error("adsmod List error", log.E(err))
return 0, err
}
return count, nil
}
func SumClickByID(matchs ...Matcher) (map[ObjectID]int64, error) {
filter := pageopt.MergeM(matchs)
var pipeline []bson.M
pipeline = append(pipeline, bson.M{"$match": filter})
pipeline = append(pipeline, bson.M{
"$group": bson.M{
"_id": "$_id",
"click": bson.M{"$sum": "$click"},
},
})
var list []struct {
ID ObjectID `bson:"_id"`
Click int64 `bson:"click"` //点击次数
}
err := coll(nil).Aggregate(&list, pipeline)
if err != nil {
return nil, err
}
m := make(map[ObjectID]int64, len(list))
for _, v := range list {
m[v.ID] += v.Click
}
return m, err
}