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

145 lines
4.4 KiB
Go

package faqmod
import (
"fmt"
"strings"
"time"
"91porn-server/common"
"91porn-server/common/db"
"91porn-server/common/log"
"91porn-server/common/stderr"
"91porn-server/models"
"91porn-server/models/commod"
"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"
)
// CateRes 列表
type CateRes struct {
Category string `json:"category" bson:"_id"`
}
var mdb *db.MongoDB
const table = models.FaqTable
func faqColl(t *db.MongoTool) *db.MongoTool {
if t == nil {
return mdb.Coll(table)
}
return t.Coll(table)
}
func initFaqIndex() {
many := []mongo.IndexModel{ //batch set indexes //value is the type 1 or -1
{
Keys: bson.D{{Key: "category", Value: 1}},
},
{
Keys: bson.D{{Key: "query", Value: 1}},
Options: options.Index().SetUnique(true).SetPartialFilterExpression(bson.M{"query": bson.M{"$exists": true}}),
},
{
Keys: bson.D{{Key: "answer", Value: 1}},
},
}
if _, err := faqColl(nil).CreateIndex(many); err != nil {
panic(fmt.Sprintf("%s model set index err ==>[%+v]", table, err))
}
}
// FaqInsert 新增常见问题
func FaqInsert(f Faq) (code stderr.Code, err error) {
f.CreatedAt = time.Now()
f.UpdatedAt = time.Now()
if _, err = faqColl(nil).InsertOne(f); err != nil {
if strings.Contains(err.Error(), "E11000 duplicate key") {
code = stderr.ErrDbInputExist
} else {
code = stderr.ErrDbInsertError
}
log.ZapLog.Error(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "FaqInsert", "Faq", "InsertOne", err))
return
}
return
}
// FaqUpdate 修改常见问题
func FaqUpdate(id primitive.ObjectID, doc FaqUpdateDoc) (err error) {
doc.UpdatedAt = time.Now()
update, _ := common.ToBsonM(doc)
if _, err = faqColl(nil).UpdateOne(bson.M{"_id": id}, bson.M{
"$set": update,
}); err != nil {
log.ZapLog.Error(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "FaqUpdate", "Faq", "UpdateOne", err))
return
}
return
}
// FaqDelete 批量删除常见问题
func FaqDelete(ids []primitive.ObjectID) (err error) {
if _, err = faqColl(nil).DeleteMany(bson.M{"_id": bson.M{"$in": ids}}); err != nil {
log.ZapLog.Error(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "FaqDelete", "Faq", "DeleteMany", err))
return
}
return
}
// FaqCateList 常见问题列表
func FaqCateList() (data []CateRes, err error) {
query := []bson.M{bson.M{"$group": bson.M{"_id": "$category"}}}
if err = faqColl(nil).Aggregate(&data, query); err != nil {
log.ZapLog.Error(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "FaqAggregate", "Faq", "Aggregate", err))
return
}
return
}
func faqCount(filter bson.M) (cnt int64, err error) {
cnt, err = faqColl(nil).Count(filter)
if err != nil {
log.ZapLog.Error(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "FqaListForSearch", "Faq", "Find", err))
return
}
return
}
// FqaListForSearch 根据搜索条件 获取问题列表
func FaqListForSearch(category string, keywords string, s commod.StdQuery) (data []Faq, total int64, err error) {
query := bson.M{}
q1 := bson.M{"query": bson.M{"$regex": keywords, "$options": "i"}}
q2 := bson.M{"answer": bson.M{"$regex": keywords, "$options": "i"}}
q3 := bson.M{"category": bson.M{"$regex": keywords, "$options": "i"}}
if category != "" && keywords != "" {
query = bson.M{"$and": []bson.M{bson.M{"category": category}, bson.M{"$or": []bson.M{q1, q2}}}}
} else if keywords != "" {
query = bson.M{"$or": []bson.M{q1, q2, q3}}
} else if category != "" {
query = bson.M{"category": category}
}
total, _ = faqCount(query)
s.Order = &[]commod.OrderBy{{Key: "sortCode", Desc: true}, {Key: "updatedAt", Desc: true}}
if err = faqColl(nil).Find(&data, query, commod.ConvertToListQuery(s)); err != nil {
log.ZapLog.Error(fmt.Sprintf("FaqListForSearch FqaListForSearch Faq Find err: %v", err))
return
}
return
}
// FaqList 根据类别条件 获取问题列表
func FaqList(cate string, status bool, s commod.StdQuery) (data []Faq, total int64, err error) {
query := bson.M{"category": cate, "status": status}
total, _ = faqCount(query)
s.Order = &[]commod.OrderBy{{Key: "sortCode", Desc: true}, {Key: "updatedAt", Desc: true}}
if err = faqColl(nil).Find(&data, query, commod.ConvertToListQuery(s)); err != nil {
log.ZapLog.Error(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "FqaListForSearch", "Faq", "Find", err))
return
}
return
}