145 lines
4.4 KiB
Go
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
|
|
}
|