go-common/app/admin/main/search/http/query.go
2019-04-22 18:49:16 +08:00

158 lines
3.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)
}