go-common/app/admin/main/search/http/query.go

158 lines
3.8 KiB
Go
Raw Normal View History

2019-04-22 10:49:16 +00:00
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)
}