@@ -0,0 +1,187 @@
|
||||
package visitlogmod
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"91porn-server/common/db"
|
||||
"91porn-server/common/log"
|
||||
"91porn-server/common/pageopt"
|
||||
"91porn-server/models"
|
||||
"91porn-server/models/v/usermod"
|
||||
|
||||
"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.VisitLog
|
||||
|
||||
func coll(t *db.MongoTool) *db.MongoTool {
|
||||
if t == nil {
|
||||
return mdb.Coll(table)
|
||||
}
|
||||
return t.Coll(table)
|
||||
}
|
||||
|
||||
// InitIndex 设置index
|
||||
func initIndex() {
|
||||
many := []mongo.IndexModel{ //batch set indexes //value is the type 1 or -1
|
||||
{
|
||||
Keys: bson.D{{Key: "uid", Value: 1}},
|
||||
},
|
||||
{
|
||||
Keys: bson.D{{Key: "sumDate", Value: -1}, {Key: "uid", Value: 1}},
|
||||
},
|
||||
{
|
||||
Keys: bson.D{{Key: "createdAt", Value: -1}},
|
||||
},
|
||||
}
|
||||
if _, err := coll(nil).CreateIndex(many); err != nil {
|
||||
panic(fmt.Sprintf("%s model set index err ==>[%+v]", table, err))
|
||||
}
|
||||
}
|
||||
|
||||
func DataClean(deleteAt time.Time) (int64, error) {
|
||||
res, err := coll(nil).DeleteMany(bson.M{"createdAt": bson.M{"$lt": deleteAt}})
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return res.DeletedCount, nil
|
||||
}
|
||||
|
||||
func UpsertUserVisit(l *VisitLog) (*mongo.UpdateResult, error) {
|
||||
l.CreatedAt = time.Now()
|
||||
b, _ := bson.Marshal(l)
|
||||
m := bson.M{}
|
||||
_ = bson.Unmarshal(b, &m)
|
||||
return coll(nil).UpsertOne(bson.M{"sumDate": l.SumDate, "uid": l.UID}, bson.M{"$setOnInsert": m})
|
||||
}
|
||||
|
||||
func UIDListByCreatedTime(start time.Time, end time.Time, mats ...Matcher) ([]uint64, error) {
|
||||
list := []struct {
|
||||
UID uint64 `bson:"uid"` //用户ID
|
||||
}{}
|
||||
mats = append(mats, (&CreatedAtGTEAndLTMatch{GTE: &start, LT: &end}).New())
|
||||
filter := pageopt.MergeM(mats)
|
||||
opt := (&options.FindOptions{}).SetProjection(bson.M{
|
||||
"uid": 1,
|
||||
})
|
||||
if err := coll(nil).Find(&list, filter, opt); err != nil {
|
||||
log.Error("UIDListByCreatedTime failed", log.Any("filter", filter), log.E(err))
|
||||
return nil, err
|
||||
}
|
||||
uids := make([]uint64, len(list))
|
||||
for i, v := range list {
|
||||
uids[i] = v.UID
|
||||
}
|
||||
return uids, nil
|
||||
}
|
||||
|
||||
func GetSumDateCountMap(uidList []uint64) (map[uint64]int64, error) {
|
||||
if len(uidList) == 0 {
|
||||
return make(map[uint64]int64), nil
|
||||
}
|
||||
pipeLine := []bson.M{
|
||||
{
|
||||
"$match": bson.M{
|
||||
"uid": bson.M{
|
||||
"$in": uidList,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
"$group": bson.M{
|
||||
"_id": "$uid",
|
||||
"count": bson.M{
|
||||
"$sum": 1,
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
list := make([]struct {
|
||||
UID uint64 `bson:"_id"`
|
||||
Count int64 `bson:"count"`
|
||||
}, 0, len(uidList))
|
||||
if err := coll(nil).Aggregate(&list, pipeLine); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
countMap := make(map[uint64]int64, len(list))
|
||||
for _, v := range list {
|
||||
countMap[v.UID] = v.Count
|
||||
}
|
||||
return countMap, nil
|
||||
}
|
||||
|
||||
// RetainUserListByTime 存留user
|
||||
func RetainUserListByTime(createUserStart, createUserEnd, visitStart, visitEnd time.Time, mats ...usermod.Matcher) ([]usermod.User, error) {
|
||||
visitFilter := (&CreatedAtGTEAndLTMatch{GTE: &visitStart, LT: &visitEnd}).New().Filter()
|
||||
visitList := make([]struct {
|
||||
UID uint64 `bson:"uid"`
|
||||
}, 0)
|
||||
visitOpt := (&options.FindOptions{}).SetProjection(bson.M{
|
||||
"uid": 1,
|
||||
})
|
||||
if err := coll(nil).Find(&visitList, visitFilter, visitOpt); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
visitUIDList := make([]uint64, len(visitList))
|
||||
for i, v := range visitList {
|
||||
visitUIDList[i] = v.UID
|
||||
}
|
||||
return usermod.UserListByCreateTimeAndUIDS(createUserStart, createUserEnd, visitUIDList, mats...)
|
||||
}
|
||||
|
||||
// RetainUIDListByTime 存留UID
|
||||
func RetainUIDListByTime(createStart, createEnd, visitStart, visitEnd time.Time, mats ...usermod.Matcher) ([]uint64, error) {
|
||||
visitList := make([]struct {
|
||||
UID uint64 `bson:"uid"`
|
||||
}, 0)
|
||||
visitFilter := (&CreatedAtGTEAndLTMatch{GTE: &visitStart, LT: &visitEnd}).New().Filter()
|
||||
visitOpt := (&options.FindOptions{}).SetProjection(bson.M{
|
||||
"uid": 1,
|
||||
})
|
||||
if err := coll(nil).Find(&visitList, visitFilter, visitOpt); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
visitUIDList := make([]uint64, len(visitList))
|
||||
for i, v := range visitList {
|
||||
visitUIDList[i] = v.UID
|
||||
}
|
||||
return usermod.UIDListByCreateTimeAndUIDS(createStart, createEnd, visitUIDList, mats...)
|
||||
}
|
||||
|
||||
// AccessSyncById 每日访问数据同步
|
||||
func AccessSyncById(Id string, size int64) (data []VisitLog, err error) {
|
||||
id, err := primitive.ObjectIDFromHex(Id)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
endTime := time.Now().Add(-time.Minute * 5)
|
||||
visitFilter := bson.M{"_id": bson.M{"$gt": id}, "createdAt": bson.M{"$lt": endTime}}
|
||||
visitOpt := (&options.FindOptions{}).SetLimit(size).SetSort(bson.M{"_id": 1})
|
||||
err = coll(nil).Find(&data, visitFilter, visitOpt)
|
||||
return
|
||||
}
|
||||
|
||||
func AccessSyncByTime(visitTime time.Time, size int64) (data []VisitLog, err error) {
|
||||
endTime := time.Now().Add(-time.Minute * 5)
|
||||
visitFilter := bson.M{"createdAt": bson.M{"$gt": visitTime, "$lt": endTime}}
|
||||
visitOpt := (&options.FindOptions{}).SetLimit(size).SetSort(bson.M{"createdAt": 1})
|
||||
err = coll(nil).Find(&data, visitFilter, visitOpt)
|
||||
return
|
||||
}
|
||||
|
||||
func GetInfoByCond(cond bson.M, opts ...*options.FindOneOptions) (VisitLog, error) {
|
||||
v := VisitLog{}
|
||||
if err := coll(nil).FindOne(&v, cond, opts...); err != nil {
|
||||
log.Error(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "GetInfo", table, "FindOne", err),
|
||||
log.Any("cond", cond),
|
||||
)
|
||||
return v, err
|
||||
}
|
||||
return v, nil
|
||||
}
|
||||
Reference in New Issue
Block a user