generated from pkg/go-template
125 lines
3.8 KiB
Go
125 lines
3.8 KiB
Go
|
package model
|
|||
|
|
|||
|
import (
|
|||
|
"fmt"
|
|||
|
"git.icechen.cn/monorepo/backend/app/brahma/api/murder/internal/error_process"
|
|||
|
"github.com/pkg/errors"
|
|||
|
"strings"
|
|||
|
)
|
|||
|
|
|||
|
const (
|
|||
|
jsonArray = "jsonArr"
|
|||
|
normal = "normal"
|
|||
|
)
|
|||
|
|
|||
|
type (
|
|||
|
//区分query中不同规则
|
|||
|
ruleType struct {
|
|||
|
rule string
|
|||
|
value string
|
|||
|
}
|
|||
|
QueryMap map[string]ruleType
|
|||
|
)
|
|||
|
|
|||
|
type GetSqlMapFromQuery interface {
|
|||
|
// ProcessMap 生成queryMap
|
|||
|
ProcessMap() (QueryMap, error)
|
|||
|
}
|
|||
|
|
|||
|
type GetQuery struct {
|
|||
|
Query string
|
|||
|
}
|
|||
|
|
|||
|
type ScriptsDto struct {
|
|||
|
ScriptName string `json:"script_name" gorm:"column:script_name"`
|
|||
|
ScriptIntro string `json:"script_intro" gorm:"column:script_intro"`
|
|||
|
ScriptTag strs `json:"script_tag" gorm:"column:script_tag"`
|
|||
|
ScriptScore float64 `json:"script_score" gorm:"column:script_score"`
|
|||
|
GroupDuration int `json:"group_duration" gorm:"column:group_duration"`
|
|||
|
ScriptCoverUrl string `json:"script_cover_url" gorm:"column:script_cover_url"`
|
|||
|
ScriptTextContext string `json:"script_text_context" gorm:"column:script_text_context"`
|
|||
|
ScriptPlotScore float64 `json:"script_plot_score" gorm:"column:script_plot_score"`
|
|||
|
ScriptImageContent strs `json:"script_image_content" gorm:"column:script_image_content"`
|
|||
|
ScriptMalePlayer int `json:"script_male_player" gorm:"column:script_male_player"`
|
|||
|
ScriptFemalePlayer int `json:"script_female_player" gorm:"column:script_female_player"`
|
|||
|
ScriptDifficultDegree string `json:"script_difficult_degree" gorm:"column:script_difficult_degree"`
|
|||
|
ScriptPlayerLimit int `json:"script_player_limit" gorm:"column:script_player_limit"`
|
|||
|
Uuid string `json:"uuid" gorm:"column:uuid" valid:"no_empty"`
|
|||
|
ScriptComplexScore float64 `json:"script_complex_score" gorm:"column:script_complex_score"`
|
|||
|
}
|
|||
|
|
|||
|
//检查语法
|
|||
|
func checkGrammar(value string) bool {
|
|||
|
//如果 = 左右两侧 不是完整的key、value返回错误
|
|||
|
var pairs []string
|
|||
|
if pairs = strings.Split(value, "="); len(pairs) != 2 {
|
|||
|
return false
|
|||
|
}
|
|||
|
//如果 value 没有完整闭合括号则返回错误
|
|||
|
bytes := []byte(pairs[1])
|
|||
|
if (bytes[0] == '(' && bytes[len(bytes)-1] != ')') || (bytes[len(bytes)-1] == ')' && bytes[0] != '(') {
|
|||
|
return false
|
|||
|
}
|
|||
|
return true
|
|||
|
}
|
|||
|
|
|||
|
//处理json数组
|
|||
|
func processJsonArr(pair []string) (string, bool) {
|
|||
|
value := fmt.Sprintf("JSON_CONTAINS(%v,JSON_ARRAY(", pair[0])
|
|||
|
//处理括号,遍历元素
|
|||
|
arrs := strings.Split(string([]byte(pair[1])[1:len([]byte(pair[1]))-1]), "|")
|
|||
|
for _, v := range arrs {
|
|||
|
//如果大括号里面没有元素
|
|||
|
if v == "" {
|
|||
|
return "", false
|
|||
|
}
|
|||
|
value = fmt.Sprintf("%v%v,", value, v)
|
|||
|
}
|
|||
|
s := []byte(value)
|
|||
|
value = string(s[0:len(s)-1]) + "))"
|
|||
|
return value, true
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
// ProcessMap 生成查询map
|
|||
|
func (g GetQuery) ProcessMap() (QueryMap, error) {
|
|||
|
m := make(QueryMap)
|
|||
|
//寻找没有软删掉的数据
|
|||
|
m["is_del"] = ruleType{rule: normal, value: `0`}
|
|||
|
//不满足最小查询条件直接返回
|
|||
|
if len([]byte(g.Query)) < 5 {
|
|||
|
return m, nil
|
|||
|
}
|
|||
|
//括号不匹配直接返回
|
|||
|
if bytes := []byte(g.Query); bytes[0] != '(' || bytes[len(bytes)-1] != ')' {
|
|||
|
return nil, errors.New(error_process.GrammerError)
|
|||
|
}
|
|||
|
//处理query字符串、掐头去尾
|
|||
|
g.Query = string([]byte(g.Query)[1 : len([]byte(g.Query))-1])
|
|||
|
//遍历处理过的字符串,根据query规则生成queryMap
|
|||
|
for _, v := range strings.Split(g.Query, ",") {
|
|||
|
if !checkGrammar(v) {
|
|||
|
return nil, errors.New(error_process.GrammerError)
|
|||
|
}
|
|||
|
pairs := strings.Split(v, "=")
|
|||
|
bytes := []byte(pairs[1])
|
|||
|
//是否是json数组
|
|||
|
if bytes[0] == '(' && bytes[len(bytes)-1] == ')' {
|
|||
|
if value, usable := processJsonArr(pairs); usable {
|
|||
|
m[pairs[0]] = ruleType{
|
|||
|
rule: jsonArray,
|
|||
|
value: value,
|
|||
|
}
|
|||
|
continue
|
|||
|
}
|
|||
|
return nil, errors.New(error_process.GrammerError)
|
|||
|
}
|
|||
|
//普通字段
|
|||
|
m[pairs[0]] = ruleType{
|
|||
|
rule: normal,
|
|||
|
value: pairs[1],
|
|||
|
}
|
|||
|
}
|
|||
|
return m, nil
|
|||
|
}
|