Files
huangguo_server/models/v/sensitivewordmod/crud.go
T
rootandClaude Opus 5 8679200f41 Initial commit
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 13:57:10 +08:00

166 lines
3.6 KiB
Go

package sensitivewordmod
import (
"fmt"
"time"
"91porn-server/common/db"
"91porn-server/common/log"
"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
const table = models.SensitiveWord
func coll(t *db.MongoTool) *db.MongoTool {
if t == nil {
return mdb.Coll(table)
}
return t.Coll(table)
}
func Init() {
mdb = db.Init(table)
initIndex()
}
func initIndex() {
many := []mongo.IndexModel{
{
Keys: bson.D{{Key: "word", Value: 1}},
Options: options.Index().SetUnique(true),
},
{
Keys: bson.D{{Key: "category", Value: 1}},
},
{
Keys: bson.D{{Key: "status", Value: 1}},
},
}
if _, err := coll(nil).CreateIndex(many); err != nil {
panic(fmt.Sprintf("%s model set index err ==>[%+v]", table, err))
}
}
// Add 新增单条
func Add(w *SensitiveWord) error {
now := time.Now()
w.CreatedAt = now
w.UpdatedAt = now
w.Status = StatusEnabled
if _, err := coll(nil).InsertOne(w); err != nil {
log.Error(fmt.Sprintf("[sensitivewordmod] Add fail: %+v", err))
return err
}
return nil
}
// UpsertByWord 按主词 upsert(导入时使用)
func UpsertByWord(w *SensitiveWord) error {
now := time.Now()
filter := bson.M{"word": w.Word}
update := bson.M{
"$set": bson.M{
"category": w.Category,
"updatedAt": now,
},
"$setOnInsert": bson.M{
"status": StatusEnabled,
"createdAt": now,
},
}
if _, err := coll(nil).UpsertOne(filter, update); err != nil {
log.Error(fmt.Sprintf("[sensitivewordmod] UpsertByWord fail: %+v", err), log.Any("word", w.Word))
return err
}
return nil
}
// Update 更新单条
func Update(id primitive.ObjectID, fields bson.M) error {
fields["updatedAt"] = time.Now()
cond := bson.M{"_id": id}
if _, err := coll(nil).UpdateOne(cond, bson.M{"$set": fields}); err != nil {
log.Error(fmt.Sprintf("[sensitivewordmod] Update fail: %+v", err))
return err
}
return nil
}
// Delete 批量删除
func Delete(ids []primitive.ObjectID) (int64, error) {
cond := bson.M{"_id": bson.M{"$in": ids}}
result, err := coll(nil).DeleteMany(cond)
if err != nil {
log.Error(fmt.Sprintf("[sensitivewordmod] Delete fail: %+v", err))
return 0, err
}
return result.DeletedCount, nil
}
// List 分页查询
func List(req *ListReq) ([]*SensitiveWord, int64, error) {
cond := buildCond(req)
total, err := coll(nil).Count(cond)
if err != nil {
return nil, 0, err
}
page := req.Page
size := req.Size
if page < 1 {
page = 1
}
if size < 1 {
size = 20
}
skip := (page - 1) * size
opts := options.FindOptions{}
opts.SetSort(bson.D{{Key: "createdAt", Value: -1}}).
SetSkip(skip).
SetLimit(size)
var list []*SensitiveWord
if err = coll(nil).Find(&list, cond, &opts); err != nil {
log.Error(fmt.Sprintf("[sensitivewordmod] List find fail: %+v", err))
return nil, total, err
}
return list, total, nil
}
// FindAll 查询全部(导出时使用)
func FindAll(req *ListReq) ([]*SensitiveWord, error) {
cond := buildCond(req)
opts := options.FindOptions{}
opts.SetSort(bson.D{{Key: "category", Value: 1}, {Key: "createdAt", Value: 1}})
var list []*SensitiveWord
if err := coll(nil).Find(&list, cond, &opts); err != nil {
log.Error(fmt.Sprintf("[sensitivewordmod] FindAll fail: %+v", err))
return nil, err
}
return list, nil
}
func buildCond(req *ListReq) bson.M {
cond := bson.M{}
if req.Category != "" {
cond["category"] = req.Category
}
if req.Status != nil {
cond["status"] = *req.Status
}
if req.Keyword != "" {
cond["word"] = bson.M{"$regex": req.Keyword, "$options": "i"}
}
return cond
}