add collection search api (#212)

add search api for front component ListView

Reviewed-on: https://git.infini.ltd/infini/console/pulls/212
Co-authored-by: liugq <silenceqi@hotmail.com>
Co-committed-by: liugq <silenceqi@hotmail.com>
This commit is contained in:
liugq 2023-11-01 10:57:53 +08:00 committed by medcl
parent 4b63e81ae1
commit 57bf0976f1
3 changed files with 192 additions and 0 deletions

View File

@ -4,6 +4,7 @@ import (
"infini.sh/console/plugin/api/data"
"infini.sh/console/plugin/api/email"
"infini.sh/console/plugin/api/license"
"infini.sh/console/plugin/api/platform"
"path"
"infini.sh/console/config"
@ -79,4 +80,5 @@ func Init(cfg *config.AppConfig) {
license.InitAPI()
email.InitAPI()
data.InitAPI()
platform.InitAPI()
}

View File

@ -0,0 +1,92 @@
/* Copyright © INFINI Ltd. All rights reserved.
* Web: https://infinilabs.com
* Email: hello#infini.ltd */
package platform
import (
"fmt"
"infini.sh/framework/core/api"
"infini.sh/framework/core/api/rbac"
"infini.sh/framework/core/elastic"
"infini.sh/framework/core/global"
"infini.sh/framework/core/orm"
"infini.sh/framework/core/util"
"io"
"net/http"
httprouter "infini.sh/framework/core/api/router"
log "github.com/cihub/seelog"
)
type PlatformAPI struct {
api.Handler
}
func InitAPI() {
papi := PlatformAPI{}
api.HandleAPIMethod(api.POST, "/collection/:collection_name/_search", papi.searchCollection)
api.HandleAPIMethod(api.GET, "/collection/:collection_name/metadata", papi.RequireLogin(papi.getCollectionMeta))
}
func (h *PlatformAPI) searchCollection(w http.ResponseWriter, req *http.Request, ps httprouter.Params) {
collName := ps.MustGetParameter("collection_name")
collMetas := GetCollectionMetas()
var (
meta CollectionMeta
ok bool
)
if meta, ok = collMetas[collName]; !ok {
h.WriteError(w, fmt.Sprintf("metadata of collection [%s] not found", collName), http.StatusInternalServerError)
return
}
if api.IsAuthEnable(){
claims, err := rbac.ValidateLogin(req.Header.Get("Authorization"))
if err != nil {
h.WriteError(w, err.Error(), http.StatusUnauthorized)
return
}
err = rbac.ValidatePermission(claims, meta.RequirePermission["read"])
if err != nil {
h.WriteError(w, err.Error(), http.StatusForbidden)
return
}
}
client := elastic.GetClient(global.MustLookupString(elastic.GlobalSystemElasticsearchID))
queryDsl, err := io.ReadAll(req.Body)
if err != nil {
log.Error(err)
h.WriteError(w, err.Error(), http.StatusInternalServerError)
return
}
searchRes, err := client.SearchWithRawQueryDSL(orm.GetIndexName(meta.MatchObject), queryDsl)
if err != nil {
h.WriteError(w, err.Error(), http.StatusInternalServerError)
return
}
if searchRes.StatusCode != http.StatusOK {
h.WriteError(w, string(searchRes.RawResult.Body), http.StatusInternalServerError)
return
}
h.WriteJSON(w, searchRes,http.StatusOK)
}
//getCollectionMeta returns metadata of target collection, includes backend index name
func (h *PlatformAPI) getCollectionMeta(w http.ResponseWriter, req *http.Request, ps httprouter.Params) {
collName := ps.MustGetParameter("collection_name")
collMetas := GetCollectionMetas()
var (
meta CollectionMeta
ok bool
)
if meta, ok = collMetas[collName]; !ok {
h.WriteError(w, fmt.Sprintf("metadata of collection [%s] not found", collName), http.StatusInternalServerError)
return
}
indexName := orm.GetIndexName(meta.MatchObject)
h.WriteJSON(w, util.MapStr{
"collection_name": collName,
"metadata": util.MapStr{
"index_name": indexName,
},
}, http.StatusOK)
}

View File

@ -0,0 +1,98 @@
/* Copyright © INFINI Ltd. All rights reserved.
* Web: https://infinilabs.com
* Email: hello#infini.ltd */
package platform
import (
"infini.sh/framework/core/api/rbac/enum"
"infini.sh/framework/core/elastic"
"infini.sh/framework/core/event"
"infini.sh/framework/core/model"
"sync"
)
var (
collectionMetas map[string]CollectionMeta
metasInitOnce sync.Once
)
func GetCollectionMetas() map[string]CollectionMeta{
metasInitOnce.Do(func() {
collectionMetas = map[string]CollectionMeta{
"gateway": {
Name: "gateway",
RequirePermission: map[string][]string{
"read": {
enum.PermissionGatewayInstanceRead,
},
},
MatchObject: &model.Instance{},
},
"agent": {
Name: "agent",
RequirePermission: map[string][]string{
"read": {
enum.PermissionAgentInstanceRead,
},
},
MatchObject: &model.Instance{},
},
"cluster": {
Name: "cluster",
RequirePermission: map[string][]string{
"read": {
enum.PermissionElasticsearchClusterRead,
},
},
MatchObject: &elastic.ElasticsearchConfig{},
},
"node": {
Name: "node",
RequirePermission: map[string][]string{
"read": {
enum.PermissionElasticsearchNodeRead,
},
},
MatchObject: &elastic.NodeConfig{},
},
"index": {
Name: "index",
RequirePermission: map[string][]string{
"read": {
enum.PermissionElasticsearchIndexRead,
},
},
MatchObject: &elastic.IndexConfig{},
},
"command": {
Name: "command",
RequirePermission: map[string][]string{
"read": {
enum.PermissionCommandRead,
},
},
MatchObject: &elastic.CommonCommand{},
},
"activity": {
Name: "activity",
RequirePermission: map[string][]string{
"read": {
enum.PermissionActivityRead,
},
},
MatchObject: &event.Activity{},
},
}
})
return collectionMetas
}
//CollectionMeta includes information about how to visit backend index
type CollectionMeta struct {
//collection name
Name string `json:"name"`
//permissions required to visit collection
RequirePermission map[string][]string `json:"require_permission"`
//use for orm.GetIndexName to get real index name
MatchObject interface{} `json:"match_object"`
}