Create & Init Project...

This commit is contained in:
2019-04-22 18:49:16 +08:00
commit fc4fa37393
25440 changed files with 4054998 additions and 0 deletions

View File

@@ -0,0 +1,48 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = [
"config_test.go",
"response_test.go",
],
embed = [":go_default_library"],
tags = ["automanaged"],
deps = [
"//app/admin/main/aegis/model:go_default_library",
"//app/admin/main/aegis/model/resource:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = [
"config.go",
"response.go",
],
importpath = "go-common/app/admin/main/aegis/model/middleware",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = ["//library/log:go_default_library"],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,163 @@
package middleware
import (
"fmt"
"reflect"
"sort"
"strconv"
"strings"
"go-common/library/log"
)
const (
//TypeMiddleAll 全部操作都允许
TypeMiddleAll = int8(0)
//TypeMiddleEncode 只允许编码,后端返回给前端的响应处理
TypeMiddleEncode = int8(1)
//TypeMiddleDecode 只允许解码,前端请求后端的请求参数处理
TypeMiddleDecode = int8(2)
)
//Aggregate 前端映射结构,对应于前后端交互的字段
type Aggregate struct {
Hitn string `json:"hitn"` //name的多个结构体用.表示分级
Hitv string `json:"hitv"` //枚举值
Mapn string `json:"mapn"` //映射字段名可以与hitname不同也可以相同
Mapv string `json:"mapv"` //映射字段值
Delimiter string `json:"delimiter"` //映射字段值的分隔符号
Order int64 `json:"order"` //顺序
Type int8 `json:"type"`
}
func (f *Aggregate) Process(data interface{}, encode bool) {
var (
field, fieldm reflect.Value
fieldExist, hited bool
)
defer func() {
if errs := recover(); errs != nil {
log.Error("Aggregate Process error(%+v)", errs)
}
}()
hitn := f.Hitn
hitv := strings.Split(f.Hitv, f.Delimiter)
mapn := f.Mapn
mapv := f.Mapv
if !encode {
hitn = f.Mapn
hitv = strings.Split(f.Mapv, f.Delimiter)
mapn = f.Hitn
mapv = f.Hitv
}
//check fields exist
fv := reflect.ValueOf(data)
if field, fieldExist = getFieldByName(fv, hitn); !fieldExist {
log.Warn("no field for hit(%s) data(%+v)", hitn, data)
return
}
if mapn == hitn {
fieldm = field
} else if fieldm, fieldExist = getFieldByName(fv, mapn); !fieldExist || !fieldm.CanSet() {
log.Warn("no field for map(%s) data(%+v)", mapn, data)
return
}
fieldv := fmt.Sprintf("%v", field.Interface())
for _, hit := range hitv {
if fieldv == hit {
hited = true
break
}
}
if !hited {
return
}
log.Info("got hit field(%s) value(%s) config(%+v)", hitn, fieldv, f)
switch fieldm.Kind() {
case reflect.String:
fieldm.SetString(mapv)
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
vv, err := strconv.ParseInt(mapv, 10, 64)
if err != nil {
log.Error("strconv.ParseInt(%s) error(%v)", mapv, err)
return
}
fieldm.SetInt(vv)
default:
log.Warn("not support field.kind(%s) for field(%s)", fieldm.Kind().String(), mapn)
}
}
//getFieldByName 迭代遍历struct获取指定名字的字段
func getFieldByName(v reflect.Value, name string) (res reflect.Value, ok bool) {
tp := v.Type()
if tp.Kind() == reflect.Ptr {
v = v.Elem()
tp = tp.Elem()
}
if tp.Kind() != reflect.Struct || !v.IsValid() {
return
}
for i := 0; i < tp.NumField(); i++ {
fn := strings.ToLower(tp.Field(i).Name)
if fn == name {
res = v.Field(i)
ok = true
return
}
if vres, vok := getFieldByName(v.Field(i), name); vok {
ok = vok
res = vres
return
}
}
return
}
//MiddleAggregate 处理聚合逻辑
type MiddleAggregate struct {
Cfg []*Aggregate
Encode bool
}
//Process handle multi aggregate logists
func (m *MiddleAggregate) Process(data interface{}) {
cfgs := []*Aggregate{}
for _, item := range m.Cfg {
if item.Type == TypeMiddleAll || (m.Encode && item.Type == TypeMiddleEncode) || (!m.Encode && item.Type == TypeMiddleDecode) {
cfgs = append(cfgs, item)
}
}
if len(cfgs) == 0 {
return
}
sort.Sort(AggregateArr(cfgs))
for _, item := range cfgs {
item.Process(data, m.Encode)
}
}
//AggregateArr arr
type AggregateArr []*Aggregate
//Len .
func (f AggregateArr) Len() int {
return len(f)
}
//Less .
func (f AggregateArr) Less(i, j int) bool {
return f[i].Order < f[j].Order
}
//Swap .
func (f AggregateArr) Swap(i, j int) {
f[i], f[j] = f[j], f[i]
}

View File

@@ -0,0 +1,111 @@
package middleware
import (
"fmt"
"reflect"
"testing"
"github.com/smartystreets/goconvey/convey"
"go-common/app/admin/main/aegis/model"
"go-common/app/admin/main/aegis/model/resource"
)
var (
d = &Aggregate{
Hitn: "extra1",
Hitv: "2,3,4,5,6,7",
Mapn: "extra1",
Mapv: "2",
Order: 1,
}
ds = MiddleAggregate{
Cfg: []*Aggregate{d},
Encode: true,
}
)
func TestMiddleware_AggregateProcess(t *testing.T) {
var (
data = &model.AuditInfo{
Resource: &resource.Res{Extra1: 6},
}
encode bool = true
data2 = &model.SearchParams{
Extra1: "2",
}
)
convey.Convey("AggregateProcess", t, func(ctx convey.C) {
d.Process(data, encode) //将extra1=6替换成extra1=2
d.Process(data2, !encode) //将extra1=2替换成extra1=2,3,4,5,6,7
ctx.Convey("extra1 equal", func(ctx convey.C) {
ctx.So(fmt.Sprintf("%d", data.Resource.Extra1), convey.ShouldEqual, d.Mapv)
ctx.So(data2.Extra1, convey.ShouldEqual, d.Hitv)
})
})
}
func TestMiddlewaregetFieldByName(t *testing.T) {
var (
v = reflect.ValueOf(&model.AuditInfo{
Resource: &resource.Res{Extra1: 6},
})
name = "extra1"
)
convey.Convey("getFieldByName", t, func(ctx convey.C) {
res, ok := getFieldByName(v, name)
ctx.Convey("Then res,ok should not be nil.", func(ctx convey.C) {
ctx.So(ok, convey.ShouldEqual, true)
ctx.So(res, convey.ShouldNotBeNil)
})
})
}
func TestMiddlewareProcess(t *testing.T) {
var (
data = &model.AuditInfo{
Resource: &resource.Res{Extra1: 6},
}
)
convey.Convey("Process", t, func(ctx convey.C) {
ds.Encode = true
ds.Process(data)
ctx.Convey("No return values", func(ctx convey.C) {
//将extra1=6替换成extra1=2
ctx.So(fmt.Sprintf("%d", data.Resource.Extra1), convey.ShouldEqual, d.Mapv)
})
})
}
func TestMiddlewareLen(t *testing.T) {
convey.Convey("Len", t, func(ctx convey.C) {
p1 := AggregateArr(ds.Cfg).Len()
ctx.Convey("Then p1 should not be nil.", func(ctx convey.C) {
ctx.So(p1, convey.ShouldEqual, 1)
})
})
}
func TestMiddlewareLess(t *testing.T) {
var (
i = int(0)
j = int(0)
)
convey.Convey("Less", t, func(ctx convey.C) {
p1 := AggregateArr(ds.Cfg).Less(i, j)
ctx.Convey("Then p1 should not be nil.", func(ctx convey.C) {
ctx.So(p1, convey.ShouldEqual, false)
})
})
}
func TestMiddlewareSwap(t *testing.T) {
var (
i = int(0)
j = int(0)
)
convey.Convey("Swap", t, func(ctx convey.C) {
AggregateArr(ds.Cfg).Swap(i, j)
ctx.Convey("No return values", func(ctx convey.C) {
})
})
}

View File

@@ -0,0 +1,26 @@
package middleware
//IMiddleware handler
type IMiddleware interface {
Process(data interface{})
}
//ResponseRender .
type ResponseRender func(data interface{}, err error)
//Response response handler
func Response(data interface{}, err error, r ResponseRender, i IMiddleware) {
if data != nil && i != nil {
i.Process(data)
}
if r != nil {
r(data, err)
}
}
//Request request handler
func Request(data interface{}, i IMiddleware) {
if data != nil && i != nil {
i.Process(data)
}
}

View File

@@ -0,0 +1,44 @@
package middleware
import (
"testing"
"fmt"
"github.com/smartystreets/goconvey/convey"
"go-common/app/admin/main/aegis/model"
"go-common/app/admin/main/aegis/model/resource"
)
func TestMiddlewareRequest(t *testing.T) {
convey.Convey("Request", t, func(ctx convey.C) {
opt := new(model.SearchParams)
opt2 := &model.SearchParams{
Extra1: "2",
}
ds.Encode = false
Request(opt, &ds)
Request(opt2, &ds)
ctx.Convey("No return values", func(ctx convey.C) {
ctx.So(opt.Extra1, convey.ShouldEqual, "")
ctx.So(opt2.Extra1, convey.ShouldEqual, ds.Cfg[0].Hitv)
})
})
}
func TestMiddlewareResponse(t *testing.T) {
convey.Convey("Response", t, func(ctx convey.C) {
opt := new(model.AuditInfo)
opt2 := &model.AuditInfo{
Resource: &resource.Res{Extra1: 4},
}
ds.Encode = true
Response(opt, nil, nil, &ds)
Response(opt2, nil, nil, &ds)
ctx.Convey("No return values", func(ctx convey.C) {
ctx.So(opt.Resource, convey.ShouldBeNil)
ctx.So(fmt.Sprintf("%v", opt2.Resource.Extra1), convey.ShouldEqual, ds.Cfg[0].Mapv)
})
})
}