package freeVidmod import ( "encoding/json" "errors" "fmt" "time" "91porn-server/app/appg" "91porn-server/common" "91porn-server/common/db" "91porn-server/common/log" "91porn-server/common/redis" "91porn-server/models" "91porn-server/models/commod" "91porn-server/web/webg" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) var mdb *db.MongoDB const table = models.FreeVidConfig func coll(t *db.MongoTool) *db.MongoTool { if t == nil { return mdb.Coll(table) } return t.Coll(table) } // initIndex 索引设置 func initIndex() { many := []mongo.IndexModel{ { Keys: bson.D{{Key: "uid", Value: 1}}, Options: options.Index().SetUnique(true), }, { Keys: bson.D{{Key: "publisherID", 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 redisFreeVidKey(uid uint64) string { return fmt.Sprintf("freeVidConfigList:%d", uid) } // List 条件获取金币配置表 func List(param ListParam) (data WebResp, err error) { var freeVidConfig []FreeVidConfig std := commod.StdQuery{ Page: &commod.PageBy{ CheckNext: false, Num: param.PageNumber, Size: param.PageSize, }, Order: &[]commod.OrderBy{{Key: "updatedAt", Desc: true}}, } opts := commod.ConvertToListQuery(std) query, _ := common.ToBsonM(param.ListFilter) total, err := coll(nil).Count(query) if err != nil { log.Error(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "List", table, "Count", err)) return } if err = coll(nil).Find(&freeVidConfig, query, opts); err != nil { log.Error(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "List", table, "Find", err)) return } data.List = freeVidConfig data.Total = total return data, nil } // 根据uid查找用户免费观看的发布者列表 func FindFreeVidByUid(uid uint64) (*FreeVidConfig, error) { var back *FreeVidConfig redisKey := redisFreeVidKey(uid) redisc := getRedis() if redisc == nil || !redisc.Exists(redisKey) { if err := coll(nil).FindOne(&back, bson.M{"uid": uid}); err != nil { log.Warn("recharge FindFreeVidByUid FindOne fail", log.E(err)) return nil, err } if redisc == nil { return back, nil } jsonBytes, err := json.Marshal(back) if err != nil { return back, err } _ = redisc.Set(redisKey, string(jsonBytes), 10*time.Minute) return back, err } str, err := redisc.Get(redisKey) if err != nil { log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "FindFreeVidByUid", table, "Find", err)) return nil, err } if str == nil { return back, errors.New("redis key is null") } return back, json.Unmarshal([]byte(*str), &back) } func GetFreeVideoMapByUID(uid uint64) map[uint64]bool { m := make(map[uint64]bool) free, err := FindFreeVidByUid(uid) if err != nil || free == nil { return m } now := time.Now() if free.StartTime.After(now) || free.EndTime.Before(now) { return m } for _, v := range free.PublisherID { m[v] = true } return m } // InsertOne 插入一条数据 func InsertOne(inc *Incr) error { redisCachDel(redisFreeVidKey(inc.Uid)) inc.CreatedAt = time.Now() inc.UpdatedAt = time.Now() if _, err := coll(nil).InsertOne(inc); err != nil { log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "InsertOne", table, "InsertOne", err), log.Any("inc", inc)) return err } return nil } // Delete 删除数据 func Delete(uids []uint64) (int64, error) { for _, uid := range uids { redisCachDel(redisFreeVidKey(uid)) } result, err := coll(nil).DeleteMany(bson.M{"uid": bson.M{"$in": uids}}) if err != nil { log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "Delete", table, "Delete", err)) return 0, err } return result.DeletedCount, err } // Update 免费观看配置更新 func Update(uid uint64, set EditDoc) (int64, error) { defer redisCachDel(redisFreeVidKey(uid)) updateAt := time.Now() set.UpdatedAt = updateAt result, err := coll(nil).UpdateOne(bson.M{"uid": uid}, bson.M{"$set": set}) if err != nil { log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "Update", table, "UpdateOne", err), log.Any("uid", uid), log.Any("set", set), ) return 0, err } return result.ModifiedCount, nil } func redisCachDel(m string) { _, _ = getRedis().Del(m) } func getRedis() *redis.Client { if appg.Redis != nil { return appg.Redis } if webg.Redis != nil { return webg.Redis } return nil }