Files
rootandClaude Opus 5 8679200f41 Initial commit
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 13:57:10 +08:00

170 lines
4.1 KiB
Go

package adreviewmod
import (
"fmt"
"time"
"91porn-server/common/db"
"91porn-server/common/log"
"91porn-server/common/pageopt"
"91porn-server/models"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
)
const table = models.AdReview
var mdb *db.MongoDB
func coll(t *db.MongoTool) *db.MongoTool {
if t == nil {
return mdb.Coll(table)
}
return t.Coll(table)
}
// InitIndex 初始化索引
func initAdsIndex() {
many := []mongo.IndexModel{
{
Keys: bson.D{{Key: "reviewStatus", Value: 1}, {Key: "createdAt", Value: -1}},
},
{
Keys: bson.D{{Key: "districtCode", Value: 1}, {Key: "createdAt", Value: -1}},
},
{
Keys: bson.D{{Key: "passAt", Value: -1}},
},
{
Keys: bson.D{{Key: "refussAt", Value: -1}},
},
{
Keys: bson.D{{Key: "optTypeAt", 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))
}
}
// InsertOne 增加广告
func InsertOne(t *db.MongoTool, doc InsertDoc) error {
if doc.CreatedAt.IsZero() {
doc.CreatedAt = time.Now()
}
if doc.ApplyAt.IsZero() {
doc.ApplyAt = time.Now()
}
if _, err := coll(t).InsertOne(doc); err != nil {
log.Error(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "InsertOne", table, "InsertMany", err))
return err
}
return nil
}
var processong = Processong
func updateOne(doc UpdateDoc, mats ...Matcher) error {
var d struct {
Doc UpdateDoc `bson:",inline"`
ReviewStatus *ReviewStatus `bson:"reviewStatus,omitempty"` //审核状态
}
d.Doc = doc
filter := pageopt.MergeM(mats)
now := time.Now()
if doc.OptType != nil {
doc.ApplyAt = &now
}
if doc.Title != nil || doc.Cover != nil || doc.HrefType != nil || doc.Href != nil || doc.Position != nil || doc.SortCode != nil {
d.ReviewStatus = &processong
}
if doc.UpdatedAt.IsZero() {
doc.UpdatedAt = now
}
res, err := coll(nil).UpdateOne(filter, bson.M{"$set": d})
if err != nil {
log.Error(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "UpdateAds", table, "UpdateOne", err), log.Any("doc", doc), log.Any("filter", filter))
return err
}
if res.MatchedCount == 0 {
return ADReviewNotExistError{}
}
return nil
}
func UpdateOneByID(id ObjectID, doc UpdateDoc) error {
return updateOne(doc, (&IDMatch{ID: &id}).New())
}
func DeleteOne(t *db.MongoTool, id ObjectID) error {
if _, err := coll(t).DeleteById(id); err != nil {
log.Error(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "DeleteOne", table, "DeleteById", err))
if err == mongo.ErrNoDocuments {
return ADReviewNotExistError{}
}
return err
}
return nil
}
func updateReview(review Review, now time.Time, mats ...Matcher) error {
var doc struct {
Review `bson:",inline"`
UpdatedAt time.Time `bson:"updatedAt"` //更新时间
}
doc.Review = review
if doc.ReviewStatus == Pass {
doc.PassAt = now
}
if doc.ReviewStatus == Refuse {
doc.RefussAt = now
}
doc.UpdatedAt = now
filter := pageopt.MergeM(mats)
res, err := coll(nil).UpdateOne(filter, bson.M{"$set": doc})
if err != nil {
log.Error(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "UpdateAds", table, "UpdateOne", err), log.Any("doc", doc), log.Any("filter", filter))
return err
}
if res.MatchedCount == 0 {
return ADReviewNotExistError{}
}
return nil
}
func UpdateReviewByID(id ObjectID, curStatus ReviewStatus, targetStatus ReviewStatus, adID *ObjectID, reviewer string, receiptInfo string, now time.Time) error {
review := Review{
Reviewer: reviewer,
ReviewStatus: targetStatus,
ReceiptInfo: receiptInfo,
}
if adID != nil {
review.ADID = *adID
}
mats := []Matcher{
(&IDMatch{ID: &id}).New(),
(&ReviewStatusMatch{&curStatus}).New(),
}
return updateReview(review, now, mats...)
}
func findOne(mats ...Matcher) (AdReview, error) {
filter := pageopt.MergeM(mats)
ads := AdReview{}
if err := coll(nil).FindOne(&ads, filter); err != nil {
return AdReview{}, err
}
if ads.ID.IsZero() {
return AdReview{}, ADReviewNotExistError{}
}
return ads, nil
}
func FindOneByID(id ObjectID) (AdReview, error) {
return findOne((&IDMatch{ID: &id}).New())
}