package scenebannermod import ( "fmt" "time" "91porn-server/common/db" "91porn-server/models" "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 func Init() { mdb = db.Init(models.SceneBanner) // 旧版本通过 scene_1 唯一索引限制每个场景只能配置一条 Banner。 // 多图轮播需要先移除该索引,已有 Banner 数据不受影响。 if err := coll().DropIndexIfExists("scene_1"); err != nil { panic(fmt.Sprintf("%s model drop legacy index err ==>[%+v]", models.SceneBanner, err)) } if _, err := coll().CreateIndex([]mongo.IndexModel{ { Keys: bson.D{ {Key: "scene", Value: 1}, {Key: "sort", Value: -1}, {Key: "updatedAt", Value: -1}, }, }, { Keys: bson.D{ {Key: "scene", Value: 1}, {Key: "enable", Value: 1}, {Key: "startAt", Value: 1}, {Key: "endAt", Value: 1}, }, }, }); err != nil { panic(fmt.Sprintf("%s model set index err ==>[%+v]", models.SceneBanner, err)) } } func coll() *db.MongoTool { return mdb.Coll(models.SceneBanner) } func Insert(p *SceneBanner) error { p.Normalize() if err := p.Validate(); err != nil { return err } now := time.Now() p.ID = primitive.NewObjectID() p.CreatedAt = now p.UpdatedAt = now _, err := coll().InsertOne(p) return err } func Update(p *SceneBanner) error { if p.ID.IsZero() { return fmt.Errorf("id is required") } p.Normalize() if err := p.Validate(); err != nil { return err } p.UpdatedAt = time.Now() set := bson.M{ "scene": p.Scene, "imageUrl": p.ImageURL, "mediaType": p.MediaType, "linkType": p.LinkType, "linkValue": p.LinkValue, "sort": p.Sort, "enable": p.Enable, "updatedAt": p.UpdatedAt, } update := bson.M{"$set": set} unset := bson.M{} if p.StartAt == nil { unset["startAt"] = "" } else { set["startAt"] = *p.StartAt } if p.EndAt == nil { unset["endAt"] = "" } else { set["endAt"] = *p.EndAt } if len(unset) > 0 { update["$unset"] = unset } result, err := coll().UpdateOne(bson.M{"_id": p.ID}, update) if err != nil { return err } if result.MatchedCount == 0 { return mongo.ErrNoDocuments } return nil } func Delete(id primitive.ObjectID) error { if id.IsZero() { return fmt.Errorf("id is required") } _, err := coll().DeleteById(id) return err } func List(scene string) ([]SceneBanner, error) { filter := bson.M{} if scene != "" { filter["scene"] = scene } var list []SceneBanner err := coll().Find(&list, filter, bannerFindOptions()) return list, err } func FindActive(scene string, now time.Time) ([]SceneBanner, error) { filter := bson.M{ "scene": scene, "enable": true, "$and": bson.A{ bson.M{"$or": bson.A{ bson.M{"startAt": bson.M{"$exists": false}}, bson.M{"startAt": nil}, bson.M{"startAt": bson.M{"$lte": now}}, }}, bson.M{"$or": bson.A{ bson.M{"endAt": bson.M{"$exists": false}}, bson.M{"endAt": nil}, bson.M{"endAt": bson.M{"$gt": now}}, }}, }, } var list []SceneBanner err := coll().Find(&list, filter, bannerFindOptions()) return list, err } func bannerFindOptions() *options.FindOptions { return options.Find(). SetSort(bson.D{{Key: "sort", Value: -1}, {Key: "updatedAt", Value: -1}}) }