diff --git a/middleware/apollo/search.go b/middleware/apollo/search.go new file mode 100644 index 0000000..f067ce3 --- /dev/null +++ b/middleware/apollo/search.go @@ -0,0 +1,99 @@ +// Package apollo... +// +// Description : apollo... +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 2021-11-24 10:26 下午 +package apollo + +import ( + "encoding/json" + "errors" + + "git.zhangdeman.cn/zhangdeman/gopkg/util" +) + +const ( + // OperateTypeIs 固定值 + OperateTypeIs = "is" + // OperateTypeIn 在指定枚举值中 + OperateTypeIn = "in" + // OperateTypeNotIn 不在指定枚举值中 + OperateTypeNotIn = "not_in" + // OperateGt 大于 + OperateGt = "gt" + // OperateGte 大于等于 + OperateGte = "gte" + // OperateLt 小于 + OperateLt = "lt" + // OperateLte 小于等于 + OperateLte = "lte" +) + +// Rule 数据过滤规则 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 10:32 下午 2021/11/24 +type Rule struct { + Name string `json:"name"` // 规则名称 + ConditionList []Condition `json:"condition_list"` // 条件列表 + Data map[string]interface{} `json:"data"` // 满足条件时返回的数据 +} + +// Condition 条件处理 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 10:27 下午 2021/11/24 +type Condition struct { + InputKey string `json:"input_key"` // 从输入数据中读取的key + Operate string `json:"operate"` // 操作 + TargetValue string `json:"target_value"` // 目标值 +} + +// Search 搜索key并按照指定条件过滤 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 11:01 下午 2021/11/24 +func Search(key string, inputData map[string]interface{}, receiver interface{}) error { + if nil == receiver { + return errors.New("receiver is nil") + } + if nil == inputData { + inputData = make(map[string]interface{}) + } + var ( + readResult string + err error + formatResult []Rule + ) + if readResult = Client.GetStringValue(key, ""); len(readResult) == 0 { + return errors.New("key is not found : " + key) + } + if err = json.Unmarshal([]byte(readResult), &formatResult); nil != err { + return errors.New("parse read config fail : " + err.Error()) + } + for _, rule := range formatResult { + if checkRule(rule, inputData) { + byteData, mErr := json.Marshal(rule.Data) + if nil != mErr { + return mErr + } + // 命中规则, 返回数据 + return util.JSONUnmarshalWithNumber(byteData, receiver) + } + } + return nil +} + +// checkRule 检测数据是否命中规则 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 10:59 下午 2021/11/24 +func checkRule(rule Rule, inputData map[string]interface{}) bool { + return true +}