Initial commit

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-15 13:57:10 +08:00
co-authored by Claude Opus 5
commit 8679200f41
1897 changed files with 257900 additions and 0 deletions
+150
View File
@@ -0,0 +1,150 @@
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}})
}