151 lines
3.3 KiB
Go
151 lines
3.3 KiB
Go
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}})
|
|
}
|