You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
157 lines
3.8 KiB
157 lines
3.8 KiB
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) |
|
}
|
|
|