158 lines
3.8 KiB
Go
158 lines
3.8 KiB
Go
|
package http
|
|||
|
|
|||
|
import (
|
|||
|
"encoding/json"
|
|||
|
"errors"
|
|||
|
"strings"
|
|||
|
|
|||
|
"go-common/app/admin/main/search/model"
|
|||
|
"go-common/library/ecode"
|
|||
|
"go-common/library/log"
|
|||
|
bm "go-common/library/net/http/blademaster"
|
|||
|
)
|
|||
|
|
|||
|
func checkParams(c *bm.Context) (sp *model.QueryParams, err error) {
|
|||
|
sp = &model.QueryParams{
|
|||
|
QueryBody: &model.QueryBody{},
|
|||
|
}
|
|||
|
if err = c.Bind(sp); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
decoder := json.NewDecoder(strings.NewReader(sp.QueryBodyStr))
|
|||
|
decoder.UseNumber()
|
|||
|
if err = decoder.Decode(&sp.QueryBody); err != nil {
|
|||
|
log.Error("s.http.upsert(%v) json error(%v)", err, sp.QueryBodyStr)
|
|||
|
}
|
|||
|
if sp.QueryBody == nil {
|
|||
|
c.JSON(nil, ecode.RequestErr)
|
|||
|
return
|
|||
|
}
|
|||
|
// eq
|
|||
|
if sp.QueryBody.Where != nil {
|
|||
|
|
|||
|
for k, v := range sp.QueryBody.Where.EQ {
|
|||
|
if integer, ok := v.(json.Number); ok {
|
|||
|
if sp.QueryBody.Where.EQ[k], err = integer.Int64(); err != nil {
|
|||
|
log.Error("sp.QueryBody.Where.EQ.numberToInt64(%v)(%v)", integer, err)
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
// or
|
|||
|
for k, v := range sp.QueryBody.Where.Or {
|
|||
|
if integer, ok := v.(json.Number); ok {
|
|||
|
if sp.QueryBody.Where.Or[k], err = integer.Int64(); err != nil {
|
|||
|
log.Error("sp.QueryBody.Where.EQ.numberToInt64(%v)(%v)", integer, err)
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
// in
|
|||
|
for k, v := range sp.QueryBody.Where.In {
|
|||
|
vs := make([]interface{}, 0)
|
|||
|
for _, v2 := range v {
|
|||
|
if integer, ok := v2.(json.Number); ok {
|
|||
|
vs = append(vs, integer)
|
|||
|
} else {
|
|||
|
vs = append(vs, v2)
|
|||
|
}
|
|||
|
}
|
|||
|
sp.QueryBody.Where.In[k] = vs
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if sp.QueryBody.From == "" {
|
|||
|
err = errors.New("query from is empty")
|
|||
|
return
|
|||
|
}
|
|||
|
// deny *
|
|||
|
if b, ok := model.PermConf["star"][sp.Business]; !(ok && b == "true") {
|
|||
|
if strings.Contains(sp.QueryBody.From, "*") {
|
|||
|
err = errors.New("query from * is denied")
|
|||
|
return
|
|||
|
}
|
|||
|
}
|
|||
|
if err = svr.CheckQueryConf(c, sp); err != nil {
|
|||
|
log.Error("svr.QueryConf(%+v) error(%v)", sp, err)
|
|||
|
return
|
|||
|
}
|
|||
|
if sp.QueryBody.Pn == 0 {
|
|||
|
sp.QueryBody.Pn = 1
|
|||
|
}
|
|||
|
if sp.QueryBody.Ps == 0 {
|
|||
|
sp.QueryBody.Ps = 10
|
|||
|
}
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
func querySearch(c *bm.Context) {
|
|||
|
var (
|
|||
|
err error
|
|||
|
sp *model.QueryParams
|
|||
|
res *model.QueryResult
|
|||
|
)
|
|||
|
res = &model.QueryResult{}
|
|||
|
if sp, err = checkParams(c); err != nil {
|
|||
|
log.Error("checkParams(%v) error(%v)", sp, err)
|
|||
|
c.JSON(res, err)
|
|||
|
return
|
|||
|
}
|
|||
|
//query mode
|
|||
|
switch sp.AppIDConf.QueryMode {
|
|||
|
case model.QueryModeBasic: //完全通用查询,支持nested方式
|
|||
|
res, _, err = svr.QueryBasic(c, sp)
|
|||
|
case model.QueryModeExtra: //半自定义,在查询体基础上加额外条件
|
|||
|
res, _, err = svr.QueryExtra(c, sp)
|
|||
|
case 4: //完整自定义查询
|
|||
|
// todo
|
|||
|
default:
|
|||
|
res, _, err = svr.QueryBasic(c, sp)
|
|||
|
}
|
|||
|
if err != nil {
|
|||
|
log.Error("srv.QueryBasic(%v) error(%v)", sp, err)
|
|||
|
c.JSON(nil, err)
|
|||
|
return
|
|||
|
}
|
|||
|
c.JSON(res, err)
|
|||
|
}
|
|||
|
|
|||
|
// queryDebug 1. queryBody is right or not 2. return dsl body 3. return dsl profile
|
|||
|
func queryDebug(c *bm.Context) {
|
|||
|
var (
|
|||
|
err error
|
|||
|
sp *model.QueryParams
|
|||
|
resDebug = &model.QueryDebugResult{}
|
|||
|
)
|
|||
|
if sp, err = checkParams(c); err != nil {
|
|||
|
log.Error("checkParams(%v) error(%v)", c, err)
|
|||
|
resDebug.AddErrMsg(err.Error())
|
|||
|
resDebug.QueryBody = sp.QueryBodyStr
|
|||
|
c.JSON(resDebug, ecode.RequestErr)
|
|||
|
return
|
|||
|
}
|
|||
|
// 默认高级debug
|
|||
|
if sp.DebugLevel == 0 {
|
|||
|
sp.DebugLevel = 2
|
|||
|
}
|
|||
|
switch sp.AppIDConf.QueryMode {
|
|||
|
case 0, model.QueryModeBasic: //完全通用查询
|
|||
|
if _, resDebug, err = svr.QueryBasic(c, sp); err != nil {
|
|||
|
log.Error("QueryDebug(%v) error(%v)", sp, err)
|
|||
|
resDebug.AddErrMsg(err.Error())
|
|||
|
c.JSON(resDebug, ecode.RequestErr)
|
|||
|
return
|
|||
|
}
|
|||
|
case model.QueryModeExtra: //半自定义,根据查询体基础再做额外处理
|
|||
|
if _, resDebug, err = svr.QueryExtra(c, sp); err != nil {
|
|||
|
log.Error("QueryDebug(%v) error(%v)", sp, err)
|
|||
|
resDebug.AddErrMsg(err.Error())
|
|||
|
c.JSON(resDebug, ecode.RequestErr)
|
|||
|
return
|
|||
|
}
|
|||
|
case 3: //完全自定义
|
|||
|
//todo
|
|||
|
default:
|
|||
|
|
|||
|
}
|
|||
|
resDebug.QueryBody = sp.QueryBodyStr
|
|||
|
c.JSON(resDebug, err)
|
|||
|
}
|