oc-catalog/models/search.go

102 lines
2.3 KiB
Go

package models
import (
"strings"
"cloud.o-forge.io/core/oc-catalog/services"
"github.com/beego/beego/v2/core/logs"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
type SearchResult struct {
Computing []ComputingModel `json:"computing" required:"true"`
Datacenter []DatacenterModel `json:"datacenter"`
Storage []StorageModel `json:"storage"`
Data []DataModel `json:"data"`
}
func FindByWord(word string) (object *SearchResult, err error) {
returnObject := SearchResult{}
opts := options.Find()
opts.SetLimit(100) //FIXME: Decide if limit and how
var cursor *mongo.Cursor
if strings.TrimSpace(word) == "*" {
word = ""
} else {
word = `(?i).*` + word + `.*`
}
// filter := bson.M{"$text": bson.M{"$search": word}}
if cursor, err = services.MngoCollComputing.Find(
services.MngoCtx,
bson.M{"$or": []bson.M{
{"description": bson.M{"$regex": word}},
{"owner": bson.M{"$regex": word}},
{"license": bson.M{"$regex": word}},
}},
opts,
); err != nil {
logs.Error(err)
return nil, err
}
if err = cursor.All(services.MngoCtx, &returnObject.Computing); err != nil {
logs.Error(err)
return nil, err
}
if cursor, err = services.MngoCollDatacenter.Find(
services.MngoCtx,
bson.M{"$or": []bson.M{
{"name": bson.M{"$regex": word}},
{"description": bson.M{"$regex": word}},
{"owner": bson.M{"$regex": word}},
}}, opts,
); err != nil {
logs.Error(err)
return nil, err
}
if err = cursor.All(services.MngoCtx, &returnObject.Datacenter); err != nil {
logs.Error(err)
return nil, err
}
if cursor, err = services.MngoCollStorage.Find(
services.MngoCtx,
bson.M{"$or": []bson.M{
{"name": bson.M{"$regex": word}},
{"description": bson.M{"$regex": word}},
}},
opts,
); err != nil {
logs.Error(err)
return nil, err
}
if err = cursor.All(services.MngoCtx, &returnObject.Storage); err != nil {
logs.Error(err)
return nil, err
}
if cursor, err = services.MngoCollData.Find(
services.MngoCtx,
bson.M{"$or": []bson.M{
{"description": bson.M{"$regex": word}},
{"example": bson.M{"$regex": word}},
}},
opts,
); err != nil {
logs.Error(err)
return nil, err
}
if err = cursor.All(services.MngoCtx, &returnObject.Data); err != nil {
logs.Error(err)
return nil, err
}
return &returnObject, nil
}