@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user