作者 陈志颖

Merge branch 'dev' of http://gitlab.fjmaimaimai.com/mmm-go-pp/partner01 into 3-project-init-order

正在显示 68 个修改的文件 包含 2261 行增加35 行删除
@@ -19,9 +19,9 @@ metadata: @@ -19,9 +19,9 @@ metadata:
19 - method: sendSmsCode 19 - method: sendSmsCode
20 route: 20 route:
21 post: /sendSmsCode 21 post: /sendSmsCode
22 - - method: rovoke 22 + - method: revoke
23 route: 23 route:
24 - post: /rovoke  
25 - - method: changePassword 24 + post: /revoke
  25 + - method: changePassword
26 route: 26 route:
27 post: /changePhonePassword 27 post: /changePhonePassword
@@ -22,6 +22,3 @@ metadata: @@ -22,6 +22,3 @@ metadata:
22 params: 22 params:
23 - name: offset 23 - name: offset
24 - name: limit 24 - name: limit
25 - - method: delivery  
26 - route:  
27 - get: /delivery  
@@ -25,6 +25,6 @@ metadata: @@ -25,6 +25,6 @@ metadata:
25 - method: convertUserStatus 25 - method: convertUserStatus
26 route: 26 route:
27 post: /convertUserStatus 27 post: /convertUserStatus
28 - - method: setPermisson 28 + - method: setPermission
29 route: 29 route:
30 - post: /setPermisson  
  30 + post: /setPermission
@@ -3,6 +3,5 @@ kind: Attribute @@ -3,6 +3,5 @@ kind: Attribute
3 metadata: 3 metadata:
4 name: cooperateTime 4 name: cooperateTime
5 description: 合作时间 5 description: 合作时间
6 -  
7 type: 6 type:
8 primitive: datetime 7 primitive: datetime
@@ -3,6 +3,5 @@ kind: Attribute @@ -3,6 +3,5 @@ kind: Attribute
3 metadata: 3 metadata:
4 name: status 4 name: status
5 description: 状态(1:启用或者0:禁用) 5 description: 状态(1:启用或者0:禁用)
6 -  
7 type: 6 type:
8 primitive: int 7 primitive: int
@@ -9,7 +9,7 @@ metadata: @@ -9,7 +9,7 @@ metadata:
9 type: 9 type:
10 primitive: int64 10 primitive: int64
11 - name: orderNo 11 - name: orderNo
12 - descriptiopn: 订单编号 12 + description: 订单编号
13 type: 13 type:
14 primitive: string 14 primitive: string
15 - name: orderNum 15 - name: orderNum
@@ -11,17 +11,14 @@ metadata: @@ -11,17 +11,14 @@ metadata:
11 primitive: string 11 primitive: string
12 result: 12 result:
13 - name: refreshToken 13 - name: refreshToken
14 - description: Attribute描述 14 + description: 刷新码
15 type: 15 type:
16 primitive: string 16 primitive: string
17 - name: accessToken 17 - name: accessToken
18 - description: Attribute描述 18 + description: accessToken
19 type: 19 type:
20 primitive: string 20 primitive: string
21 - name: expiresIn 21 - name: expiresIn
22 - description: Attribute描述  
23 - type:  
24 - primitive: string  
25 - - name: auth 22 + description: 过期时间
26 type: 23 type:
27 - schema: auth 24 + primitive: int64
@@ -6,22 +6,19 @@ metadata: @@ -6,22 +6,19 @@ metadata:
6 description: 更新授权令牌accessToken 6 description: 更新授权令牌accessToken
7 payload: 7 payload:
8 - name: refreshToken 8 - name: refreshToken
9 - description: Attribute描述 9 + description: refreshToken
10 type: 10 type:
11 primitive: string 11 primitive: string
12 result: 12 result:
13 - name: refreshToken 13 - name: refreshToken
14 - description: Attribute描述 14 + description: refreshToken
15 type: 15 type:
16 primitive: string 16 primitive: string
17 - name: accessToken 17 - name: accessToken
18 - description: Attribute描述 18 + description: accessToken
19 type: 19 type:
20 primitive: string 20 primitive: string
21 - name: expiresIn 21 - name: expiresIn
22 - description: Attribute描述 22 + description: 过期时间
23 type: 23 type:
24 - primitive: string  
25 - - name: auth  
26 - type:  
27 - schema: auth 24 + primitive: int64
@@ -10,4 +10,4 @@ metadata: @@ -10,4 +10,4 @@ metadata:
10 primitive: int 10 primitive: int
11 - name: msg 11 - name: msg
12 type: 12 type:
13 - primitive: int  
  13 + primitive: string
@@ -6,7 +6,7 @@ metadata: @@ -6,7 +6,7 @@ metadata:
6 description: 发送验证码 6 description: 发送验证码
7 payload: 7 payload:
8 - name: phone 8 - name: phone
9 - description: Attribute描述 9 + description: 手机号
10 type: 10 type:
11 primitive: string 11 primitive: string
12 result: 12 result:
@@ -9,5 +9,6 @@ metadata: @@ -9,5 +9,6 @@ metadata:
9 required: true 9 required: true
10 result: 10 result:
11 - name: statistics 11 - name: statistics
  12 + description: 统计数据
12 type: 13 type:
13 - schema: any 14 + primitive : string
@@ -23,4 +23,4 @@ metadata: @@ -23,4 +23,4 @@ metadata:
23 - name: statistics 23 - name: statistics
24 description: 统计数据 24 description: 统计数据
25 type: 25 type:
26 - primitive: any 26 + primitive: string
@@ -11,4 +11,4 @@ metadata: @@ -11,4 +11,4 @@ metadata:
11 - name: statistics 11 - name: statistics
12 description: 统计数据 12 description: 统计数据
13 type: 13 type:
14 - primitive: any 14 + primitive: string
@@ -10,4 +10,4 @@ metadata: @@ -10,4 +10,4 @@ metadata:
10 result: 10 result:
11 - name: partnersProfile 11 - name: partnersProfile
12 type: 12 type:
13 - primitive: any 13 + primitive: string
@@ -5,7 +5,7 @@ metadata: @@ -5,7 +5,7 @@ metadata:
5 type: command 5 type: command
6 description: 创建 6 description: 创建
7 payload: 7 payload:
8 - - ref: userTypes 8 + - ref: userType
9 required: true 9 required: true
10 - ref: adminType 10 - ref: adminType
11 required: true 11 required: true
1 version: v1 1 version: v1
2 kind: Method 2 kind: Method
3 metadata: 3 metadata:
4 - name: setPermisson 4 + name: setPermission
5 type: command 5 type: command
6 description: 设置权限 6 description: 设置权限
7 payload: 7 payload:
@@ -7,7 +7,7 @@ metadata: @@ -7,7 +7,7 @@ metadata:
7 payload: 7 payload:
8 - ref: userId 8 - ref: userId
9 required: true 9 required: true
10 - - ref: userTypes 10 + - ref: userType
11 required: false 11 required: false
12 - ref: adminType 12 - ref: adminType
13 required: false 13 required: false
  1 +FROM golang:latest
  2 +MAINTAINER mmm-go-pp <>
  3 +ENV APP_DIR $GOPATH/src/partner01
  4 +RUN mkdir -p $APP_DIR
  5 +WORKDIR $APP_DIR/
  6 +COPY ./pkg pkg
  7 +COPY ./conf conf
  8 +COPY ./go.mod go.mod
  9 +COPY ./go.sum go.sum
  10 +COPY ./main.go main.go
  11 +RUN ["ln","-sf","/usr/share/zoneinfo/Asia/Shanghai","/etc/localtime"]
  12 +ENV GO111MODULE on
  13 +ENV GOPROXY https://goproxy.io
  14 +RUN ["go","mod","tidy"]
  15 +RUN ["ls"]
  16 +RUN ["go","build"]
  17 +ENTRYPOINT ["./partner01"]
  1 +#!/bin/bash
  2 +export PATH=/root/local/bin:$PATH
  3 +kubectl -n <replace-your-k8s-namespace> get pods | grep -q partner01
  4 +if [ "$?" == "1" ];then
  5 + kubectl create -f /tmp/dev/partner01/partner01.yaml --record
  6 + kubectl -n <replace-your-k8s-namespace> get svc | grep -q partner01
  7 + if [ "$?" == "0" ];then
  8 + echo "partner01 service install success!"
  9 + else
  10 + echo "partner01 service install fail!"
  11 + fi
  12 + kubectl -n <replace-your-k8s-namespace> get pods | grep -q partner01
  13 + if [ "$?" == "0" ];then
  14 + echo "partner01 deployment install success!"
  15 + else
  16 + echo "partner01 deployment install fail!"
  17 + fi
  18 +else
  19 + kubectl delete -f /tmp/dev/partner01/partner01.yaml
  20 + kubectl -n <replace-your-k8s-namespace> get svc | grep -q partner01
  21 + while [ "$?" == "0" ]
  22 + do
  23 + kubectl -n <replace-your-k8s-namespace> get svc | grep -q partner01
  24 + done
  25 + kubectl -n <replace-your-k8s-namespace> get pods | grep -q partner01
  26 + while [ "$?" == "0" ]
  27 + do
  28 + kubectl -n <replace-your-k8s-namespace> get pods | grep -q partner01
  29 + done
  30 + kubectl create -f /tmp/dev/partner01/partner01.yaml --record
  31 + kubectl -n <replace-your-k8s-namespace> get svc | grep -q partner01
  32 + if [ "$?" == "0" ];then
  33 + echo "partner01 service update success!"
  34 + else
  35 + echo "partner01 service update fail!"
  36 + fi
  37 + kubectl -n <replace-your-k8s-namespace> get pods | grep -q partner01
  38 + if [ "$?" == "0" ];then
  39 + echo "partner01 deployment update success!"
  40 + else
  41 + echo "partner01 deployment update fail!"
  42 + fi
  43 +fi
  1 +apiVersion: v1
  2 +kind: Service
  3 +metadata:
  4 + name: partner01
  5 + namespace: <replace-your-k8s-namespace>
  6 + labels:
  7 + k8s-app: partner01
  8 +spec:
  9 + ports:
  10 + - name: "http"
  11 + port: 80
  12 + targetPort: 8082
  13 + selector:
  14 + k8s-app: partner01
  15 +---
  16 +apiVersion: extensions/v1beta1
  17 +kind: Deployment
  18 +metadata:
  19 + name: partner01
  20 + namespace: <replace-your-k8s-namespace>
  21 + labels:
  22 + k8s-app: partner01
  23 +spec:
  24 + replicas: 1
  25 + template:
  26 + metadata:
  27 + labels:
  28 + k8s-app: partner01
  29 + spec:
  30 + affinity:
  31 + nodeAffinity:
  32 + preferredDuringSchedulingIgnoredDuringExecution:
  33 + - preference: {}
  34 + weight: 100
  35 + requiredDuringSchedulingIgnoredDuringExecution:
  36 + nodeSelectorTerms:
  37 + - matchExpressions:
  38 + - key: kubernetes.io/hostname
  39 + operator: In
  40 + values:
  41 + - cn-hangzhou.i-bp1djh1xn7taumbue1ze
  42 + - cn-hangzhou.i-bp1djh1xn7taumbue1zd
  43 + - cn-hangzhou.i-bp1euf5u1ph9kbhtndhb
  44 + - cn-hangzhou.i-bp1hyp5oips9cdwxxgxy
  45 + containers:
  46 + - name: partner01
  47 + image: 192.168.0.243:5000/mmm/partner01:dev
  48 + imagePullPolicy: Always
  49 + ports:
  50 + - containerPort: 8082
  51 + volumeMounts:
  52 + - mountPath: /opt/logs
  53 + name: accesslogs
  54 + env:
  55 + - name: LOG_LEVEL
  56 + value: "debug"
  57 + - name: ERROR_BASE_CODE
  58 + value: "1"
  59 + - name: ERROR_BASE_CODE_MULTIPLE
  60 + value: "1000"
  61 + volumes:
  62 + - name: accesslogs
  63 + emptyDir: {}
  1 +module gitlab.fjmaimaimai.com/mmm-go-pp/partner01
  2 +
  3 +go 1.16
  4 +
  5 +require (
  6 + github.com/ajg/form v1.5.1 // indirect
  7 + github.com/beego/beego/v2 v2.0.1
  8 + github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072 // indirect
  9 + github.com/fatih/structs v1.1.0 // indirect
  10 + github.com/gavv/httpexpect v2.0.0+incompatible
  11 + github.com/go-pg/pg/v10 v10.9.0
  12 + github.com/google/go-querystring v1.1.0 // indirect
  13 + github.com/gorilla/websocket v1.4.2 // indirect
  14 + github.com/imkira/go-interpol v1.1.0 // indirect
  15 + github.com/linmadan/egglib-go v0.0.0-20210313060205-8b5e456b11f7
  16 + github.com/mattn/go-colorable v0.1.8 // indirect
  17 + github.com/moul/http2curl v1.0.0 // indirect
  18 + github.com/onsi/ginkgo v1.15.2
  19 + github.com/onsi/gomega v1.11.0
  20 + github.com/sergi/go-diff v1.2.0 // indirect
  21 + github.com/smartystreets/goconvey v1.6.4 // indirect
  22 + github.com/valyala/fasthttp v1.23.0 // indirect
  23 + github.com/xeipuuv/gojsonschema v1.2.0 // indirect
  24 + github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 // indirect
  25 + github.com/yudai/gojsondiff v1.0.0 // indirect
  26 + github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 // indirect
  27 + github.com/yudai/pp v2.0.1+incompatible // indirect
  28 +)
  1 +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
  2 +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
  3 +github.com/DataDog/zstd v1.3.6-0.20190409195224-796139022798/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo=
  4 +github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
  5 +github.com/OwnLocal/goes v1.0.0/go.mod h1:8rIFjBGTue3lCU0wplczcUgt9Gxgrkkrw7etMIcn8TM=
  6 +github.com/Shopify/sarama v1.23.1/go.mod h1:XLH1GYJnLVE0XCr6KdJGVJRTwY30moWNJ4sERjXX6fs=
  7 +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
  8 +github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU=
  9 +github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY=
  10 +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
  11 +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
  12 +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
  13 +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
  14 +github.com/alicebob/gopher-json v0.0.0-20180125190556-5a6b3ba71ee6/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc=
  15 +github.com/alicebob/miniredis v2.5.0+incompatible/go.mod h1:8HZjEj4yU0dwhYHky+DxYx+6BMjkBbe5ONFIF1MXffk=
  16 +github.com/andybalholm/brotli v1.0.1 h1:KqhlKozYbRtJvsPrrEeXcO+N2l6NYT5A2QAFmSULpEc=
  17 +github.com/andybalholm/brotli v1.0.1/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y=
  18 +github.com/astaxie/beego v1.12.0/go.mod h1:fysx+LZNZKnvh4GED/xND7jWtjCR6HzydR2Hh2Im57o=
  19 +github.com/beego/beego/v2 v2.0.1 h1:07a7Z0Ok5vbqyqh+q53sDPl9LdhKh0ZDy3gbyGrhFnE=
  20 +github.com/beego/beego/v2 v2.0.1/go.mod h1:8zyHi1FnWO1mZLwTn62aKRIZF/aIKvkCBB2JYs+eqQI=
  21 +github.com/beego/goyaml2 v0.0.0-20130207012346-5545475820dd/go.mod h1:1b+Y/CofkYwXMUU0OhQqGvsY2Bvgr4j6jfT699wyZKQ=
  22 +github.com/beego/x2j v0.0.0-20131220205130-a0352aadc542/go.mod h1:kSeGC/p1AbBiEp5kat81+DSQrZenVBZXklMLaELspWU=
  23 +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
  24 +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
  25 +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
  26 +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
  27 +github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60=
  28 +github.com/casbin/casbin v1.7.0/go.mod h1:c67qKN6Oum3UF5Q1+BByfFxkwKvhwW57ITjqwtzR1KE=
  29 +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
  30 +github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
  31 +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
  32 +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
  33 +github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80=
  34 +github.com/coreos/etcd v3.3.25+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
  35 +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
  36 +github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
  37 +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
  38 +github.com/couchbase/go-couchbase v0.0.0-20181122212707-3e9b6e1258bb/go.mod h1:TWI8EKQMs5u5jLKW/tsb9VwauIrMIxQG1r5fMsswK5U=
  39 +github.com/couchbase/go-couchbase v0.0.0-20200519150804-63f3cdb75e0d/go.mod h1:TWI8EKQMs5u5jLKW/tsb9VwauIrMIxQG1r5fMsswK5U=
  40 +github.com/couchbase/gomemcached v0.0.0-20181122193126-5125a94a666c/go.mod h1:srVSlQLB8iXBVXHgnqemxUXqN6FCvClgCMPCsjBDR7c=
  41 +github.com/couchbase/gomemcached v0.0.0-20200526233749-ec430f949808/go.mod h1:srVSlQLB8iXBVXHgnqemxUXqN6FCvClgCMPCsjBDR7c=
  42 +github.com/couchbase/goutils v0.0.0-20180530154633-e865a1461c8a/go.mod h1:BQwMFlJzDjFDG3DJUdU0KORxn88UlsOULuxLExMh3Hs=
  43 +github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76/go.mod h1:vYwsqCOLxGiisLwp9rITslkFNpZD5rz43tf41QFkTWY=
  44 +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
  45 +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
  46 +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
  47 +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
  48 +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
  49 +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
  50 +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
  51 +github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
  52 +github.com/elastic/go-elasticsearch/v6 v6.8.5/go.mod h1:UwaDJsD3rWLM5rKNFzv9hgox93HoX8utj1kxD9aFUcI=
  53 +github.com/elazarl/go-bindata-assetfs v1.0.0 h1:G/bYguwHIzWq9ZoyUQqrjTmJbbYn3j3CKKpKinvZLFk=
  54 +github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4=
  55 +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
  56 +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
  57 +github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072 h1:DddqAaWDpywytcG8w/qoQ5sAN8X12d3Z3koB0C3Rxsc=
  58 +github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8=
  59 +github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
  60 +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
  61 +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
  62 +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
  63 +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
  64 +github.com/gavv/httpexpect v2.0.0+incompatible h1:1X9kcRshkSKEjNJJxX9Y9mQ5BRfbxU5kORdjhlA1yX8=
  65 +github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc=
  66 +github.com/glendc/gopher-json v0.0.0-20170414221815-dc4743023d0c/go.mod h1:Gja1A+xZ9BoviGJNA2E9vFkPjjsl+CoJxSXiQM1UXtw=
  67 +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
  68 +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
  69 +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
  70 +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
  71 +github.com/go-pg/pg/v10 v10.7.7/go.mod h1:d0w17Xw5x2DtbD/UgB9rnZg3FAck3eDHXff0Srrzuuk=
  72 +github.com/go-pg/pg/v10 v10.9.0 h1:mNIxE7H7/5fHOniVrLgUXNoIgHiJXXvhiNY+PxqtV6k=
  73 +github.com/go-pg/pg/v10 v10.9.0/go.mod h1:rgmTPgHgl5EN2CNKKoMwC7QT62t8BqsdpEkUQuiZMQs=
  74 +github.com/go-pg/zerochecker v0.2.0 h1:pp7f72c3DobMWOb2ErtZsnrPaSvHd2W4o9//8HtF4mU=
  75 +github.com/go-pg/zerochecker v0.2.0/go.mod h1:NJZ4wKL0NmTtz0GKCoJ8kym6Xn/EQzXRl2OnAe7MmDo=
  76 +github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
  77 +github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg=
  78 +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
  79 +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
  80 +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
  81 +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
  82 +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
  83 +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
  84 +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
  85 +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
  86 +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
  87 +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
  88 +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
  89 +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
  90 +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
  91 +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
  92 +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
  93 +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
  94 +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
  95 +github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM=
  96 +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
  97 +github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
  98 +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
  99 +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
  100 +github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
  101 +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
  102 +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
  103 +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
  104 +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
  105 +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
  106 +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
  107 +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
  108 +github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
  109 +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
  110 +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
  111 +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
  112 +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
  113 +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
  114 +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
  115 +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
  116 +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
  117 +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
  118 +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
  119 +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
  120 +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
  121 +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
  122 +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
  123 +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
  124 +github.com/imkira/go-interpol v1.1.0 h1:KIiKr0VSG2CUW1hl1jpiyuzuJeKUUpC8iM1AIE7N1Vk=
  125 +github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA=
  126 +github.com/jcmturner/gofork v0.0.0-20190328161633-dc7c13fece03/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o=
  127 +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
  128 +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
  129 +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
  130 +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
  131 +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
  132 +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
  133 +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
  134 +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
  135 +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
  136 +github.com/klauspost/compress v1.11.8 h1:difgzQsp5mdAz9v8lm3P/I+EpDKMU/6uTMw1y1FObuo=
  137 +github.com/klauspost/compress v1.11.8/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
  138 +github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
  139 +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
  140 +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
  141 +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
  142 +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
  143 +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
  144 +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
  145 +github.com/ledisdb/ledisdb v0.0.0-20200510135210-d35789ec47e6/go.mod h1:n931TsDuKuq+uX4v1fulaMbA/7ZLLhjc85h7chZGBCQ=
  146 +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
  147 +github.com/linmadan/egglib-go v0.0.0-20210313060205-8b5e456b11f7 h1:FgprAjWC4BtDccFwMNnw3lRMQC2jCw1nR2CRNNkDE8w=
  148 +github.com/linmadan/egglib-go v0.0.0-20210313060205-8b5e456b11f7/go.mod h1:XWcVSL/TctSbOvDM73VAeWE/pevgi8lCuzk9gu/yYV4=
  149 +github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8=
  150 +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
  151 +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
  152 +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
  153 +github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
  154 +github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
  155 +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
  156 +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
  157 +github.com/mitchellh/mapstructure v1.3.3 h1:SzB1nHZ2Xi+17FP0zVQBHIZqvwRN9408fJO8h+eeNA8=
  158 +github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
  159 +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
  160 +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
  161 +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
  162 +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
  163 +github.com/moul/http2curl v1.0.0 h1:dRMWoAtb+ePxMlLkrCbAqh4TlPHXvoGUSQ323/9Zahs=
  164 +github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ=
  165 +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
  166 +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
  167 +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
  168 +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
  169 +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
  170 +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
  171 +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
  172 +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
  173 +github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
  174 +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
  175 +github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
  176 +github.com/onsi/ginkgo v1.15.2 h1:l77YT15o814C2qVL47NOyjV/6RbaP7kKdrvZnxQ3Org=
  177 +github.com/onsi/ginkgo v1.15.2/go.mod h1:Dd6YFfwBW84ETqqtL0CPyPXillHgY6XhQH3uuCCTr/o=
  178 +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
  179 +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
  180 +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
  181 +github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=
  182 +github.com/onsi/gomega v1.11.0 h1:+CqWgvj0OZycCaqclBD1pxKHAU+tOkHmQIWvDHq2aug=
  183 +github.com/onsi/gomega v1.11.0/go.mod h1:azGKhqFUon9Vuj0YmTfLSmx0FUwqXYSTl5re8lQLTUg=
  184 +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
  185 +github.com/pelletier/go-toml v1.0.1/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
  186 +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
  187 +github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc=
  188 +github.com/peterh/liner v1.0.1-0.20171122030339-3681c2a91233/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc=
  189 +github.com/pierrec/lz4 v0.0.0-20190327172049-315a67e90e41/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
  190 +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
  191 +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
  192 +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
  193 +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
  194 +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=
  195 +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
  196 +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
  197 +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
  198 +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
  199 +github.com/prometheus/client_golang v1.7.0 h1:wCi7urQOGBsYcQROHqpUUX4ct84xp40t9R9JX0FuA/U=
  200 +github.com/prometheus/client_golang v1.7.0/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
  201 +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
  202 +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
  203 +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
  204 +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
  205 +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
  206 +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
  207 +github.com/prometheus/common v0.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lNawc=
  208 +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
  209 +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
  210 +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
  211 +github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8=
  212 +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
  213 +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
  214 +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
  215 +github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ=
  216 +github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
  217 +github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 h1:X+yvsM2yrEktyI+b2qND5gpH8YhURn0k8OCaeRnkINo=
  218 +github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg=
  219 +github.com/siddontang/go v0.0.0-20170517070808-cb568a3e5cc0/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw=
  220 +github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw=
  221 +github.com/siddontang/goredis v0.0.0-20150324035039-760763f78400/go.mod h1:DDcKzU3qCuvj/tPnimWSsZZzvk9qvkvrIL5naVBPh5s=
  222 +github.com/siddontang/ledisdb v0.0.0-20181029004158-becf5f38d373/go.mod h1:mF1DpOSOUiJRMR+FDqaqu3EBqrybQtrDDszLUZ6oxPg=
  223 +github.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d/go.mod h1:AMEsy7v5z92TR1JKMkLLoaOQk++LVnOKL3ScbJ8GNGA=
  224 +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
  225 +github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
  226 +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
  227 +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
  228 +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
  229 +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
  230 +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
  231 +github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec/go.mod h1:QBvMkMya+gXctz3kmljlUCu/yB3GZ6oee+dUozsezQE=
  232 +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
  233 +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
  234 +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
  235 +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
  236 +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
  237 +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
  238 +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
  239 +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
  240 +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
  241 +github.com/syndtr/goleveldb v0.0.0-20160425020131-cfa635847112/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
  242 +github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
  243 +github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc h1:9lRDQMhESg+zvGYmW5DyG0UqvY96Bu5QYsTLvCHdrgo=
  244 +github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc/go.mod h1:bciPuU6GHm1iF1pBvUfxfsH0Wmnc2VbpgvbI9ZWuIRs=
  245 +github.com/ugorji/go v0.0.0-20171122102828-84cb69a8af83/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ=
  246 +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
  247 +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
  248 +github.com/valyala/fasthttp v1.23.0 h1:0ufwSD9BhWa6f8HWdmdq4FHQ23peRo3Ng/Qs8m5NcFs=
  249 +github.com/valyala/fasthttp v1.23.0/go.mod h1:0mw2RjXGOzxf4NL2jni3gUQ7LfjjUSiG5sskOUUSEpU=
  250 +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio=
  251 +github.com/vmihailenco/bufpool v0.1.11 h1:gOq2WmBrq0i2yW5QJ16ykccQ4wH9UyEsgLm6czKAd94=
  252 +github.com/vmihailenco/bufpool v0.1.11/go.mod h1:AFf/MOy3l2CFTKbxwt0mp2MwnqjNEs5H/UxrkA5jxTQ=
  253 +github.com/vmihailenco/msgpack/v5 v5.2.0/go.mod h1:fEM7KuHcnm0GvDCztRpw9hV0PuoO2ciTismP6vjggcM=
  254 +github.com/vmihailenco/msgpack/v5 v5.3.0 h1:8G3at/kelmBKeHY6d6cKnGsYO3BLn+uubitdOtOhyNI=
  255 +github.com/vmihailenco/msgpack/v5 v5.3.0/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc=
  256 +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc=
  257 +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI=
  258 +github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g=
  259 +github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds=
  260 +github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc=
  261 +github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I=
  262 +github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
  263 +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c=
  264 +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
  265 +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=
  266 +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
  267 +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=
  268 +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
  269 +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY=
  270 +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI=
  271 +github.com/yudai/gojsondiff v1.0.0 h1:27cbfqXLVEJ1o8I6v3y9lg8Ydm53EKqHXAOMxEGlCOA=
  272 +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg=
  273 +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 h1:BHyfKlQyqbsFN5p3IfnEUduWvb9is428/nNb5L3U01M=
  274 +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM=
  275 +github.com/yudai/pp v2.0.1+incompatible h1:Q4//iY4pNF6yPLZIigmvcl7k/bPgrcTPIFIcmawg5bI=
  276 +github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc=
  277 +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
  278 +github.com/yuin/gopher-lua v0.0.0-20171031051903-609c9cd26973/go.mod h1:aEV29XrmTYFr3CiRxZeGHpkvbwq+prZduBqMaascyCU=
  279 +go.etcd.io/etcd v3.3.25+incompatible/go.mod h1:yaeTdrJi5lOmYerz05bd8+V7KubZs8YSFZfzsF9A6aI=
  280 +go.opentelemetry.io/otel v0.17.0/go.mod h1:Oqtdxmf7UtEvL037ohlgnaYa1h7GtMh0NcSd9eqkC9s=
  281 +go.opentelemetry.io/otel v0.19.0 h1:Lenfy7QHRXPZVsw/12CWpxX6d/JkrX8wrx2vO8G80Ng=
  282 +go.opentelemetry.io/otel v0.19.0/go.mod h1:j9bF567N9EfomkSidSfmMwIwIBuP37AMAIzVW85OxSg=
  283 +go.opentelemetry.io/otel/metric v0.17.0/go.mod h1:hUz9lH1rNXyEwWAhIWCMFWKhYtpASgSnObJFnU26dJ0=
  284 +go.opentelemetry.io/otel/metric v0.19.0 h1:dtZ1Ju44gkJkYvo+3qGqVXmf88tc+a42edOywypengg=
  285 +go.opentelemetry.io/otel/metric v0.19.0/go.mod h1:8f9fglJPRnXuskQmKpnad31lcLJ2VmNNqIsx/uIwBSc=
  286 +go.opentelemetry.io/otel/oteltest v0.17.0/go.mod h1:JT/LGFxPwpN+nlsTiinSYjdIx3hZIGqHCpChcIZmdoE=
  287 +go.opentelemetry.io/otel/oteltest v0.19.0 h1:YVfA0ByROYqTwOxqHVZYZExzEpfZor+MU1rU+ip2v9Q=
  288 +go.opentelemetry.io/otel/oteltest v0.19.0/go.mod h1:tI4yxwh8U21v7JD6R3BcA/2+RBoTKFexE/PJ/nSO7IA=
  289 +go.opentelemetry.io/otel/trace v0.17.0/go.mod h1:bIujpqg6ZL6xUTubIUgziI1jSaUPthmabA/ygf/6Cfg=
  290 +go.opentelemetry.io/otel/trace v0.19.0 h1:1ucYlenXIDA1OlHVLDZKX0ObXV5RLaq06DtUKz5e5zc=
  291 +go.opentelemetry.io/otel/trace v0.19.0/go.mod h1:4IXiNextNOpPnRlI4ryK69mn5iC84bjBWZQA5DXz/qg=
  292 +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
  293 +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
  294 +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
  295 +go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=
  296 +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
  297 +golang.org/x/crypto v0.0.0-20180910181607-0e37d006457b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
  298 +golang.org/x/crypto v0.0.0-20181127143415-eb0de9b17e85/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
  299 +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
  300 +golang.org/x/crypto v0.0.0-20190404164418-38d8ce5564a5/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
  301 +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
  302 +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
  303 +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
  304 +golang.org/x/crypto v0.0.0-20210218145215-b8e89b74b9df/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
  305 +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
  306 +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w=
  307 +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
  308 +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
  309 +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
  310 +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
  311 +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
  312 +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
  313 +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
  314 +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
  315 +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
  316 +golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4=
  317 +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
  318 +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
  319 +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
  320 +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
  321 +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
  322 +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
  323 +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
  324 +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
  325 +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
  326 +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
  327 +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
  328 +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
  329 +golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
  330 +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
  331 +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
  332 +golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
  333 +golang.org/x/net v0.0.0-20210226101413-39120d07d75e/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
  334 +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw=
  335 +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
  336 +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
  337 +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
  338 +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
  339 +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
  340 +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
  341 +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
  342 +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
  343 +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
  344 +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
  345 +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
  346 +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
  347 +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
  348 +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
  349 +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
  350 +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
  351 +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
  352 +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
  353 +golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
  354 +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
  355 +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
  356 +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
  357 +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
  358 +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
  359 +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
  360 +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
  361 +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
  362 +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
  363 +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
  364 +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
  365 +golang.org/x/sys v0.0.0-20210218155724-8ebf48af031b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
  366 +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
  367 +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4 h1:EZ2mChiOa8udjfp6rRmswTbtZN/QzUQp4ptM4rnjHvc=
  368 +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
  369 +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
  370 +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
  371 +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
  372 +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
  373 +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
  374 +golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ=
  375 +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
  376 +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
  377 +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
  378 +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
  379 +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
  380 +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
  381 +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
  382 +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
  383 +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
  384 +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
  385 +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
  386 +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
  387 +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
  388 +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
  389 +golang.org/x/tools v0.0.0-20201211185031-d93e913c1a58/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
  390 +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e h1:4nW4NLDYnU28ojHaHO8OVxFHk/aQ33U01a9cjED+pzE=
  391 +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
  392 +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
  393 +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
  394 +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
  395 +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
  396 +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
  397 +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
  398 +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
  399 +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
  400 +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
  401 +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
  402 +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
  403 +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
  404 +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
  405 +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
  406 +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
  407 +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
  408 +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
  409 +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
  410 +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
  411 +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
  412 +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
  413 +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
  414 +google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=
  415 +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
  416 +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
  417 +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
  418 +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
  419 +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
  420 +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
  421 +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
  422 +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
  423 +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
  424 +gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo=
  425 +gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q=
  426 +gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4=
  427 +gopkg.in/jcmturner/gokrb5.v7 v7.2.3/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM=
  428 +gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8=
  429 +gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
  430 +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
  431 +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
  432 +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
  433 +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
  434 +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
  435 +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
  436 +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
  437 +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
  438 +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
  439 +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
  440 +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
  441 +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
  442 +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
  443 +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
  444 +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
  445 +honnef.co/go/tools v0.0.1-2020.1.5/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
  446 +mellium.im/sasl v0.2.1 h1:nspKSRg7/SyO0cRGY71OkfHab8tf9kCts6a6oTDut0w=
  447 +mellium.im/sasl v0.2.1/go.mod h1:ROaEDLQNuf9vjKqE1SrAfnsobm2YKXT1gnN1uDp1PjQ=
  1 +package main
  2 +
  3 +import (
  4 + "github.com/beego/beego/v2/server/web"
  5 + _ "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg"
  6 + _ "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/port/beego"
  7 +)
  8 +
  9 +func main() {
  10 + web.Run()
  11 +}
  1 +package factory
  2 +
  3 +import (
  4 + "github.com/linmadan/egglib-go/transaction/pg"
  5 + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/domain"
  6 + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/repository"
  7 +)
  8 +
  9 +func CreatePartnerCategoryRepository(options map[string]interface{}) (domain.PartnerCategoryRepository, error) {
  10 + var transactionContext *pg.TransactionContext
  11 + if value, ok := options["transactionContext"]; ok {
  12 + transactionContext = value.(*pg.TransactionContext)
  13 + }
  14 + return repository.NewPartnerCategoryRepository(transactionContext)
  15 +}
  16 +
  17 +func CreatePermissionRepository(options map[string]interface{}) (domain.PermissionRepository, error) {
  18 + var transactionContext *pg.TransactionContext
  19 + if value, ok := options["transactionContext"]; ok {
  20 + transactionContext = value.(*pg.TransactionContext)
  21 + }
  22 + return repository.NewPermissionRepository(transactionContext)
  23 +}
  24 +
  25 +func CreateUserAuthRepository(options map[string]interface{}) (domain.UserAuthRepository, error) {
  26 + var transactionContext *pg.TransactionContext
  27 + if value, ok := options["transactionContext"]; ok {
  28 + transactionContext = value.(*pg.TransactionContext)
  29 + }
  30 + return repository.NewUserAuthRepository(transactionContext)
  31 +}
  1 +package factory
  2 +
  3 +import (
  4 + "github.com/linmadan/egglib-go/core/application"
  5 + pG "github.com/linmadan/egglib-go/transaction/pg"
  6 + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg"
  7 +)
  8 +
  9 +func CreateTransactionContext(options map[string]interface{}) (application.TransactionContext, error) {
  10 + return pG.NewPGTransactionContext(pg.DB), nil
  11 +}
  1 +package command
  2 +
  3 +import (
  4 + "fmt"
  5 +
  6 + "github.com/beego/beego/v2/core/validation"
  7 +)
  8 +
  9 +type CreatePartnerCommand struct {
  10 +}
  11 +
  12 +func (createPartnerCommand *CreatePartnerCommand) Valid(validation *validation.Validation) {
  13 + validation.SetError("CustomValid", "未实现的自定义认证")
  14 +}
  15 +
  16 +func (createPartnerCommand *CreatePartnerCommand) ValidateCommand() error {
  17 + valid := validation.Validation{}
  18 + b, err := valid.Valid(createPartnerCommand)
  19 + if err != nil {
  20 + return err
  21 + }
  22 + if !b {
  23 + for _, validErr := range valid.Errors {
  24 + return fmt.Errorf("%s %s", validErr.Key, validErr.Message)
  25 + }
  26 + }
  27 + return nil
  28 +}
  1 +package command
  2 +
  3 +import (
  4 + "fmt"
  5 +
  6 + "github.com/beego/beego/v2/core/validation"
  7 +)
  8 +
  9 +type RemovePartnerCommand struct {
  10 + // 合伙人id
  11 + PartnerId int64 `json:"partnerId" valid:"Required"`
  12 +}
  13 +
  14 +func (removePartnerCommand *RemovePartnerCommand) Valid(validation *validation.Validation) {
  15 + validation.SetError("CustomValid", "未实现的自定义认证")
  16 +}
  17 +
  18 +func (removePartnerCommand *RemovePartnerCommand) ValidateCommand() error {
  19 + valid := validation.Validation{}
  20 + b, err := valid.Valid(removePartnerCommand)
  21 + if err != nil {
  22 + return err
  23 + }
  24 + if !b {
  25 + for _, validErr := range valid.Errors {
  26 + return fmt.Errorf("%s %s", validErr.Key, validErr.Message)
  27 + }
  28 + }
  29 + return nil
  30 +}
  1 +package command
  2 +
  3 +import (
  4 + "fmt"
  5 +
  6 + "github.com/beego/beego/v2/core/validation"
  7 +)
  8 +
  9 +type UpdatePartnerCommand struct {
  10 + // 合伙人id
  11 + PartnerId int64 `json:"partnerId" valid:"Required"`
  12 +}
  13 +
  14 +func (updatePartnerCommand *UpdatePartnerCommand) Valid(validation *validation.Validation) {
  15 + validation.SetError("CustomValid", "未实现的自定义认证")
  16 +}
  17 +
  18 +func (updatePartnerCommand *UpdatePartnerCommand) ValidateCommand() error {
  19 + valid := validation.Validation{}
  20 + b, err := valid.Valid(updatePartnerCommand)
  21 + if err != nil {
  22 + return err
  23 + }
  24 + if !b {
  25 + for _, validErr := range valid.Errors {
  26 + return fmt.Errorf("%s %s", validErr.Key, validErr.Message)
  27 + }
  28 + }
  29 + return nil
  30 +}
  1 +package query
  2 +
  3 +import (
  4 + "fmt"
  5 +
  6 + "github.com/beego/beego/v2/core/validation"
  7 +)
  8 +
  9 +type GetPartnerQuery struct {
  10 + // 合伙人id
  11 + PartnerId int64 `json:"partnerId" valid:"Required"`
  12 +}
  13 +
  14 +func (getPartnerQuery *GetPartnerQuery) Valid(validation *validation.Validation) {
  15 + validation.SetError("CustomValid", "未实现的自定义认证")
  16 +}
  17 +
  18 +func (getPartnerQuery *GetPartnerQuery) ValidateQuery() error {
  19 + valid := validation.Validation{}
  20 + b, err := valid.Valid(getPartnerQuery)
  21 + if err != nil {
  22 + return err
  23 + }
  24 + if !b {
  25 + for _, validErr := range valid.Errors {
  26 + return fmt.Errorf("%s %s", validErr.Key, validErr.Message)
  27 + }
  28 + }
  29 + return nil
  30 +}
  1 +package query
  2 +
  3 +import (
  4 + "fmt"
  5 +
  6 + "github.com/beego/beego/v2/core/validation"
  7 +)
  8 +
  9 +type ListPartnerQuery struct {
  10 + // 查询偏离量
  11 + Offset int `json:"offset" valid:"Required"`
  12 + // 查询限制
  13 + Limit int `json:"limit" valid:"Required"`
  14 +}
  15 +
  16 +func (listPartnerQuery *ListPartnerQuery) Valid(validation *validation.Validation) {
  17 + validation.SetError("CustomValid", "未实现的自定义认证")
  18 +}
  19 +
  20 +func (listPartnerQuery *ListPartnerQuery) ValidateQuery() error {
  21 + valid := validation.Validation{}
  22 + b, err := valid.Valid(listPartnerQuery)
  23 + if err != nil {
  24 + return err
  25 + }
  26 + if !b {
  27 + for _, validErr := range valid.Errors {
  28 + return fmt.Errorf("%s %s", validErr.Key, validErr.Message)
  29 + }
  30 + }
  31 + return nil
  32 +}
  1 +package query
  2 +
  3 +import (
  4 + "fmt"
  5 +
  6 + "github.com/beego/beego/v2/core/validation"
  7 +)
  8 +
  9 +type PartnerCategoriesQuery struct {
  10 +}
  11 +
  12 +func (partnerCategoriesQuery *PartnerCategoriesQuery) Valid(validation *validation.Validation) {
  13 +
  14 +}
  15 +
  16 +func (partnerCategoriesQuery *PartnerCategoriesQuery) ValidateQuery() error {
  17 + valid := validation.Validation{}
  18 + b, err := valid.Valid(partnerCategoriesQuery)
  19 + if err != nil {
  20 + return err
  21 + }
  22 + if !b {
  23 + for _, validErr := range valid.Errors {
  24 + return fmt.Errorf("%s %s", validErr.Key, validErr.Message)
  25 + }
  26 + }
  27 + return nil
  28 +}
  1 +package service
  2 +
  3 +import (
  4 + "github.com/linmadan/egglib-go/core/application"
  5 + //"github.com/linmadan/egglib-go/utils/tool_funs"
  6 + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/application/factory"
  7 + //"gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/application/partner/command"
  8 + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/application/partner/query"
  9 + //"gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/domain"
  10 +)
  11 +
  12 +// 合伙人服务
  13 +type PartnerService struct {
  14 +}
  15 +
  16 +//// 创建合伙人增删改查
  17 +//func (partnerService *PartnerService) CreatePartner(createPartnerCommand *command.CreatePartnerCommand) (interface{}, error) {
  18 +// if err := createPartnerCommand.ValidateCommand(); err != nil {
  19 +// return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  20 +// }
  21 +// transactionContext, err := factory.CreateTransactionContext(nil)
  22 +// if err != nil {
  23 +// return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  24 +// }
  25 +// if err := transactionContext.StartTransaction(); err != nil {
  26 +// return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  27 +// }
  28 +// defer func() {
  29 +// transactionContext.RollbackTransaction()
  30 +// }()
  31 +// newPartner := &domain.Partner{}
  32 +// var partnerRepository partner.PartnerRepository
  33 +// if value, err := factory.CreatePartnerRepository(map[string]interface{}{
  34 +// "transactionContext": transactionContext,
  35 +// }); err != nil {
  36 +// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  37 +// } else {
  38 +// partnerRepository = value
  39 +// }
  40 +// if partner, err := partnerRepository.Save(newPartner); err != nil {
  41 +// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  42 +// } else {
  43 +// if err := transactionContext.CommitTransaction(); err != nil {
  44 +// return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  45 +// }
  46 +// return partner, nil
  47 +// }
  48 +//}
  49 +//
  50 +//// 返回合伙人增删改查
  51 +//func (partnerService *PartnerService) GetPartner(getPartnerQuery *query.GetPartnerQuery) (interface{}, error) {
  52 +// if err := getPartnerQuery.ValidateQuery(); err != nil {
  53 +// return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  54 +// }
  55 +// transactionContext, err := factory.CreateTransactionContext(nil)
  56 +// if err != nil {
  57 +// return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  58 +// }
  59 +// if err := transactionContext.StartTransaction(); err != nil {
  60 +// return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  61 +// }
  62 +// defer func() {
  63 +// transactionContext.RollbackTransaction()
  64 +// }()
  65 +// var partnerRepository partner.PartnerRepository
  66 +// if value, err := factory.CreatePartnerRepository(map[string]interface{}{
  67 +// "transactionContext": transactionContext,
  68 +// }); err != nil {
  69 +// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  70 +// } else {
  71 +// partnerRepository = value
  72 +// }
  73 +// partner, err := partnerRepository.FindOne(map[string]interface{}{"partnerId": getPartnerQuery.PartnerId})
  74 +// if err != nil {
  75 +// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  76 +// }
  77 +// if partner == nil {
  78 +// return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(getPartnerQuery.PartnerId)))
  79 +// } else {
  80 +// if err := transactionContext.CommitTransaction(); err != nil {
  81 +// return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  82 +// }
  83 +// return partner, nil
  84 +// }
  85 +//}
  86 +//
  87 +//// 返回合伙人增删改查列表
  88 +//func (partnerService *PartnerService) ListPartner(listPartnerQuery *query.ListPartnerQuery) (interface{}, error) {
  89 +// if err := listPartnerQuery.ValidateQuery(); err != nil {
  90 +// return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  91 +// }
  92 +// transactionContext, err := factory.CreateTransactionContext(nil)
  93 +// if err != nil {
  94 +// return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  95 +// }
  96 +// if err := transactionContext.StartTransaction(); err != nil {
  97 +// return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  98 +// }
  99 +// defer func() {
  100 +// transactionContext.RollbackTransaction()
  101 +// }()
  102 +// var partnerRepository partner.PartnerRepository
  103 +// if value, err := factory.CreatePartnerRepository(map[string]interface{}{
  104 +// "transactionContext": transactionContext,
  105 +// }); err != nil {
  106 +// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  107 +// } else {
  108 +// partnerRepository = value
  109 +// }
  110 +// if count, partners, err := partnerRepository.Find(tool_funs.SimpleStructToMap(listPartnerQuery)); err != nil {
  111 +// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  112 +// } else {
  113 +// if err := transactionContext.CommitTransaction(); err != nil {
  114 +// return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  115 +// }
  116 +// return map[string]interface{}{
  117 +// "count": count,
  118 +// "partners": partners,
  119 +// }, nil
  120 +// }
  121 +//}
  122 +
  123 +// 合伙人分类列表
  124 +func (partnerService *PartnerService) PartnerCategories(partnerCategoriesQuery *query.PartnerCategoriesQuery) (interface{}, error) {
  125 + if err := partnerCategoriesQuery.ValidateQuery(); err != nil {
  126 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  127 + }
  128 + transactionContext, err := factory.CreateTransactionContext(nil)
  129 + if err != nil {
  130 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  131 + }
  132 + if err := transactionContext.StartTransaction(); err != nil {
  133 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  134 + }
  135 + defer func() {
  136 + transactionContext.RollbackTransaction()
  137 + }()
  138 + PartnerCategoryRepository, err := factory.CreatePartnerCategoryRepository(map[string]interface{}{"transactionContext": transactionContext})
  139 + if err != nil {
  140 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  141 + }
  142 + total, categories, err := PartnerCategoryRepository.Find(map[string]interface{}{})
  143 + if err != nil {
  144 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  145 + }
  146 + if err := transactionContext.CommitTransaction(); err != nil {
  147 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  148 + }
  149 + return map[string]interface{}{"total": total, "categories": categories}, nil
  150 +}
  151 +
  152 +//// 移除合伙人增删改查
  153 +//func (partnerService *PartnerService) RemovePartner(removePartnerCommand *command.RemovePartnerCommand) (interface{}, error) {
  154 +// if err := removePartnerCommand.ValidateCommand(); err != nil {
  155 +// return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  156 +// }
  157 +// transactionContext, err := factory.CreateTransactionContext(nil)
  158 +// if err != nil {
  159 +// return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  160 +// }
  161 +// if err := transactionContext.StartTransaction(); err != nil {
  162 +// return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  163 +// }
  164 +// defer func() {
  165 +// transactionContext.RollbackTransaction()
  166 +// }()
  167 +// var partnerRepository partner.PartnerRepository
  168 +// if value, err := factory.CreatePartnerRepository(map[string]interface{}{
  169 +// "transactionContext": transactionContext,
  170 +// }); err != nil {
  171 +// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  172 +// } else {
  173 +// partnerRepository = value
  174 +// }
  175 +// partner, err := partnerRepository.FindOne(map[string]interface{}{"partnerId": removePartnerCommand.PartnerId})
  176 +// if err != nil {
  177 +// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  178 +// }
  179 +// if partner == nil {
  180 +// return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(removePartnerCommand.PartnerId)))
  181 +// }
  182 +// if partner, err := partnerRepository.Remove(partner); err != nil {
  183 +// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  184 +// } else {
  185 +// if err := transactionContext.CommitTransaction(); err != nil {
  186 +// return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  187 +// }
  188 +// return partner, nil
  189 +// }
  190 +//}
  191 +//
  192 +//// 更新合伙人增删改查
  193 +//func (partnerService *PartnerService) UpdatePartner(updatePartnerCommand *command.UpdatePartnerCommand) (interface{}, error) {
  194 +// if err := updatePartnerCommand.ValidateCommand(); err != nil {
  195 +// return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  196 +// }
  197 +// transactionContext, err := factory.CreateTransactionContext(nil)
  198 +// if err != nil {
  199 +// return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  200 +// }
  201 +// if err := transactionContext.StartTransaction(); err != nil {
  202 +// return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  203 +// }
  204 +// defer func() {
  205 +// transactionContext.RollbackTransaction()
  206 +// }()
  207 +// var partnerRepository partner.PartnerRepository
  208 +// if value, err := factory.CreatePartnerRepository(map[string]interface{}{
  209 +// "transactionContext": transactionContext,
  210 +// }); err != nil {
  211 +// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  212 +// } else {
  213 +// partnerRepository = value
  214 +// }
  215 +// partner, err := partnerRepository.FindOne(map[string]interface{}{"partnerId": updatePartnerCommand.PartnerId})
  216 +// if err != nil {
  217 +// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  218 +// }
  219 +// if partner == nil {
  220 +// return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(updatePartnerCommand.PartnerId)))
  221 +// }
  222 +// if err := partner.Update(tool_funs.SimpleStructToMap(updatePartnerCommand)); err != nil {
  223 +// return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error())
  224 +// }
  225 +// if partner, err := partnerRepository.Save(partner); err != nil {
  226 +// return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  227 +// } else {
  228 +// if err := transactionContext.CommitTransaction(); err != nil {
  229 +// return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  230 +// }
  231 +// return partner, nil
  232 +// }
  233 +//}
  234 +
  235 +func NewPartnerService(options map[string]interface{}) *PartnerService {
  236 + newPartnerService := &PartnerService{}
  237 + return newPartnerService
  238 +}
  1 +package query
  2 +
  3 +import (
  4 + "fmt"
  5 +
  6 + "github.com/beego/beego/v2/core/validation"
  7 +)
  8 +
  9 +type MenusQuery struct {
  10 + // 用户id
  11 + UserId int64 `json:"userId"`
  12 +}
  13 +
  14 +func (menusQuery *MenusQuery) Valid(validation *validation.Validation) {
  15 +
  16 +}
  17 +
  18 +func (menusQuery *MenusQuery) ValidateQuery() error {
  19 + valid := validation.Validation{}
  20 + b, err := valid.Valid(menusQuery)
  21 + if err != nil {
  22 + return err
  23 + }
  24 + if !b {
  25 + for _, validErr := range valid.Errors {
  26 + return fmt.Errorf("%s %s", validErr.Key, validErr.Message)
  27 + }
  28 + }
  29 + return nil
  30 +}
  1 +package service
  2 +
  3 +import (
  4 + "github.com/linmadan/egglib-go/core/application"
  5 + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/application/factory"
  6 + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/application/permission/query"
  7 +)
  8 +
  9 +// 权限服务
  10 +type PermissionService struct {
  11 +}
  12 +
  13 +// 根据当前用户返回权限列表
  14 +func (permissionService *PermissionService) Menus(menusQuery *query.MenusQuery) (interface{}, error) {
  15 + if err := menusQuery.ValidateQuery(); err != nil {
  16 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  17 + }
  18 + transactionContext, err := factory.CreateTransactionContext(nil)
  19 + if err != nil {
  20 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  21 + }
  22 + if err := transactionContext.StartTransaction(); err != nil {
  23 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  24 + }
  25 + defer func() {
  26 + transactionContext.RollbackTransaction()
  27 + }()
  28 +
  29 + PermissionRepository, err := factory.CreatePermissionRepository(map[string]interface{}{"transactionContext": transactionContext})
  30 + if err != nil {
  31 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  32 + }
  33 + total, permissions, err := PermissionRepository.Find(map[string]interface{}{})
  34 + if err != nil {
  35 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  36 + }
  37 + if err := transactionContext.CommitTransaction(); err != nil {
  38 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  39 + }
  40 + return map[string]interface{}{"total": total, "permissions": permissions}, nil
  41 +}
  42 +
  43 +func NewPermissionService(options map[string]interface{}) *PermissionService {
  44 + newPermissionService := &PermissionService{}
  45 + return newPermissionService
  46 +}
  1 +package constant
  2 +
  3 +import "os"
  4 +
  5 +const SERVICE_NAME = "partner01"
  6 +
  7 +var LOG_LEVEL = "debug"
  8 +
  9 +func init() {
  10 + if os.Getenv("LOG_LEVEL") != "" {
  11 + LOG_LEVEL = os.Getenv("LOG_LEVEL")
  12 + }
  13 +}
  1 +package constant
  2 +
  3 +import "os"
  4 +
  5 +var POSTGRESQL_DB_NAME = "partner01"
  6 +var POSTGRESQL_USER = "postgres"
  7 +var POSTGRESQL_PASSWORD = "123456"
  8 +var POSTGRESQL_HOST = "127.0.0.1"
  9 +var POSTGRESQL_PORT = "5432"
  10 +var DISABLE_CREATE_TABLE = false
  11 +var DISABLE_SQL_GENERATE_PRINT = false
  12 +
  13 +func init() {
  14 + if os.Getenv("POSTGRESQL_DB_NAME") != "" {
  15 + POSTGRESQL_DB_NAME = os.Getenv("POSTGRESQL_DB_NAME")
  16 + }
  17 + if os.Getenv("POSTGRESQL_USER") != "" {
  18 + POSTGRESQL_USER = os.Getenv("POSTGRESQL_USER")
  19 + }
  20 + if os.Getenv("POSTGRESQL_PASSWORD") != "" {
  21 + POSTGRESQL_PASSWORD = os.Getenv("POSTGRESQL_PASSWORD")
  22 + }
  23 + if os.Getenv("POSTGRESQL_HOST") != "" {
  24 + POSTGRESQL_HOST = os.Getenv("POSTGRESQL_HOST")
  25 + }
  26 + if os.Getenv("POSTGRESQL_PORT") != "" {
  27 + POSTGRESQL_PORT = os.Getenv("POSTGRESQL_PORT")
  28 + }
  29 + if os.Getenv("DISABLE_CREATE_TABLE") != "" {
  30 + DISABLE_CREATE_TABLE = true
  31 + }
  32 + if os.Getenv("DISABLE_SQL_GENERATE_PRINT") != "" {
  33 + DISABLE_SQL_GENERATE_PRINT = true
  34 + }
  35 +}
  1 +package domain
  2 +
  3 +// 买家信息值对象
  4 +type BuyerInfo struct {
  5 + // 买家名称
  6 + BuyerName string `json:"buyerName"`
  7 + // 联系信息
  8 + ContactInfo string `json:"contactInfo"`
  9 + // 发货地址
  10 + ShippingAddress string `json:"shippingAddress"`
  11 +}
  1 +package domain
  2 +
  3 +// 分红值对象
  4 +type Dividend struct {
  5 + // 计划分红
  6 + PlanBonus float64 `json:"planBonus"`
  7 + // 调整后分红
  8 + UseBonus float64 `json:"useBonus"`
  9 + // 已收分红
  10 + BonusHas float64 `json:"bonusHas"`
  11 + // 未收分红
  12 + BonusNot float64 `json:"bonusNot"`
  13 + // 分红支出
  14 + BonusExpense float64 `json:"bonusExpense"`
  15 + // 分红状态(1:待支付 2:已支付)
  16 + BonusStatus int `json:"bonusStatus"`
  17 + // 合伙人分红比例
  18 + PartnerBonusPercent float64 `json:"partnerBonusPercent"`
  19 + // 业务员抽成比例
  20 + SalesmanBonusPercent float64 `json:"salesmanBonusPercent"`
  21 + // 业务员抽成
  22 + SalesmanBonus float64 `json:"salesmanBonus"`
  23 +}
  1 +package domain
  2 +
  3 +// 订单详情实体
  4 +type OrderDetail struct {
  5 + // 订单详情id
  6 + OrderDetailId int64 `json:"orderDetailId"`
  7 + // 订单编号
  8 + OrderNo string `json:"orderNo"`
  9 + // 订单数量
  10 + OrderNum int `json:"orderNum"`
  11 + // 订单总金额
  12 + TotalPrice float64 `json:"totalPrice"`
  13 + // 调整后订单数量
  14 + AdjustedNum int `json:"adjustedNum"`
  15 + // 调整后订单总金额
  16 + AdjustedTotalPrice float64 `json:"adjustedTotalPrice"`
  17 +}
  1 +package domain
  2 +
  3 +// 合伙人类别 (实体)
  4 +type PartnerCategory struct {
  5 + // 合伙人类别id
  6 + PartnerCategoryId int `json:"partnerCategoryId"`
  7 + // 合伙人类别编码
  8 + PartnerCategoryCode string `json:"partnerCategoryCode"`
  9 + // 合伙人类别名称
  10 + PartnerCategoryName string `json:"partnerCategoryName"`
  11 +}
  12 +
  13 +type PartnerCategoryRepository interface {
  14 + Save(partnerCategory *PartnerCategory) (*PartnerCategory, error)
  15 + Remove(partnerCategory *PartnerCategory) (*PartnerCategory, error)
  16 + FindOne(queryOptions map[string]interface{}) (*PartnerCategory, error)
  17 + Find(queryOptions map[string]interface{}) (int64, []*PartnerCategory, error)
  18 +}
  19 +
  20 +func (partnerCategory *PartnerCategory) Identify() interface{} {
  21 + if partnerCategory.PartnerCategoryId == 0 {
  22 + return nil
  23 + }
  24 + return partnerCategory.PartnerCategoryId
  25 +}
  26 +
  27 +func (partnerCategory *PartnerCategory) Update(data map[string]interface{}) error {
  28 + if partnerCategoryId, ok := data["partnerCategoryId"]; ok {
  29 + partnerCategory.PartnerCategoryId = partnerCategoryId.(int)
  30 + }
  31 + if partnerCategoryCode, ok := data["partnerCategoryCode"]; ok {
  32 + partnerCategory.PartnerCategoryCode = partnerCategoryCode.(string)
  33 + }
  34 + if partnerCategoryName, ok := data["partnerCategoryName"]; ok {
  35 + partnerCategory.PartnerCategoryName = partnerCategoryName.(string)
  36 + }
  37 + return nil
  38 +}
  1 +package domain
  2 +
  3 +import "time"
  4 +
  5 +// 合伙人信息
  6 +type PartnerInfo struct {
  7 + // 合伙人账号
  8 + PartnerAccount string `json:"partnerAccount"`
  9 + // 合伙人姓名
  10 + PartnerName string `json:"partnerName"`
  11 + // 订单区域信息
  12 + RegionInfo *RegionInfo `json:"regionInfo"`
  13 + // 状态 1正常 2禁用
  14 + Status int64 `json:"status"`
  15 + // 合伙时间
  16 + CooperateTime time.Time `json:"cooperateTime"`
  17 + // 业务员
  18 + Salesmans []*Salesman `json:"salesmans"`
  19 + // 合伙人类型
  20 + PartnerCategorys []*PartnerCategory `json:"partnerCategorys"`
  21 +}
  1 +package domain
  2 +
  3 +// 权限
  4 +type Permission struct {
  5 + // 权限id
  6 + PermissionId int `json:"permissionId"`
  7 + // 公司名称
  8 + Name string `json:"name"`
  9 + // 权限编码
  10 + Code string `json:"code"`
  11 + // 父级id
  12 + ParentId int `json:"parentId"`
  13 + // 排序
  14 + Sort int `json:"sort"`
  15 + // 图标
  16 + Icon string `json:"icon"`
  17 +}
  18 +
  19 +type PermissionRepository interface {
  20 + Save(permission *Permission) (*Permission, error)
  21 + Remove(permission *Permission) (*Permission, error)
  22 + FindOne(queryOptions map[string]interface{}) (*Permission, error)
  23 + Find(queryOptions map[string]interface{}) (int64, []*Permission, error)
  24 +}
  25 +
  26 +func (permission *Permission) Identify() interface{} {
  27 + if permission.PermissionId == 0 {
  28 + return nil
  29 + }
  30 + return permission.PermissionId
  31 +}
  32 +
  33 +func (permission *Permission) Update(data map[string]interface{}) error {
  34 + if permissionId, ok := data["permissionId"]; ok {
  35 + permission.PermissionId = permissionId.(int)
  36 + }
  37 + if name, ok := data["name"]; ok {
  38 + permission.Name = name.(string)
  39 + }
  40 + if code, ok := data["code"]; ok {
  41 + permission.Code = code.(string)
  42 + }
  43 + if parentId, ok := data["parentId"]; ok {
  44 + permission.ParentId = parentId.(int)
  45 + }
  46 + if sort, ok := data["sort"]; ok {
  47 + permission.Sort = sort.(int)
  48 + }
  49 + if icon, ok := data["icon"]; ok {
  50 + permission.Icon = icon.(string)
  51 + }
  52 + return nil
  53 +}
  1 +package domain
  2 +
  3 +// 手机认证
  4 +type PhoneAuth struct {
  5 + // 手机号
  6 + Phone string `json:"phone"`
  7 + // 密码
  8 + Password string `json:"password"`
  9 +}
  1 +package domain
  2 +
  3 +// 区域信息
  4 +type RegionInfo struct {
  5 + // 区域名称 eg:华南地区
  6 + RegionName string `json:"regionName"`
  7 +}
  1 +package domain
  2 +
  3 +// 业务员
  4 +type Salesman struct {
  5 + // 名称
  6 + Name string `json:"name"`
  7 + // 手机号码
  8 + Telephone string `json:"telephone"`
  9 +}
  1 +package domain
  2 +
  3 +import "time"
  4 +
  5 +// 用户认证实体
  6 +type UserAuth struct {
  7 + // 用户认证编号
  8 + UserAuthId int64 `json:"userAuthId"`
  9 + // 用户id列表
  10 + Users []int64 `json:"users"`
  11 + // 手机认证
  12 + PhoneAuth *PhoneAuth `json:"phoneAuth"`
  13 + // 创建时间
  14 + CreateAt time.Time `json:"createAt"`
  15 + // 更新时间
  16 + UpdateAt time.Time `json:"updateAt"`
  17 +}
  18 +
  19 +type UserAuthRepository interface {
  20 + Save(userAuth *UserAuth) (*UserAuth, error)
  21 + Remove(userAuth *UserAuth) (*UserAuth, error)
  22 + FindOne(queryOptions map[string]interface{}) (*UserAuth, error)
  23 + Find(queryOptions map[string]interface{}) (int64, []*UserAuth, error)
  24 +}
  25 +
  26 +func (userAuth *UserAuth) Identify() interface{} {
  27 + if userAuth.UserAuthId == 0 {
  28 + return nil
  29 + }
  30 + return userAuth.UserAuthId
  31 +}
  32 +
  33 +func (userAuth *UserAuth) Update(data map[string]interface{}) error {
  34 + if userAuthId, ok := data["userAuthId"]; ok {
  35 + userAuth.UserAuthId = userAuthId.(int64)
  36 + }
  37 + if users, ok := data["users"]; ok {
  38 + userAuth.Users = users.([]int64)
  39 + }
  40 + if phone, ok := data["phone"]; ok {
  41 + userAuth.PhoneAuth.Phone = phone.(string)
  42 + }
  43 + if password, ok := data["password"]; ok {
  44 + userAuth.PhoneAuth.Password = password.(string)
  45 + }
  46 + if createAt, ok := data["createAt"]; ok {
  47 + userAuth.CreateAt = createAt.(time.Time)
  48 + }
  49 + if updateAt, ok := data["updateAt"]; ok {
  50 + userAuth.UpdateAt = updateAt.(time.Time)
  51 + }
  52 + return nil
  53 +}
  1 +package pg
  2 +
  3 +import (
  4 + "fmt"
  5 + "github.com/go-pg/pg/v10"
  6 + "github.com/go-pg/pg/v10/orm"
  7 + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/constant"
  8 + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg/models"
  9 +
  10 + //_ "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg/models"
  11 + "github.com/linmadan/egglib-go/persistent/pg/hooks"
  12 +)
  13 +
  14 +var DB *pg.DB
  15 +
  16 +func init() {
  17 + DB = pg.Connect(&pg.Options{
  18 + User: constant.POSTGRESQL_USER,
  19 + Password: constant.POSTGRESQL_PASSWORD,
  20 + Database: constant.POSTGRESQL_DB_NAME,
  21 + Addr: fmt.Sprintf("%s:%s", constant.POSTGRESQL_HOST, constant.POSTGRESQL_PORT),
  22 + })
  23 + if !constant.DISABLE_SQL_GENERATE_PRINT {
  24 + DB.AddQueryHook(hooks.SqlGeneratePrintHook{})
  25 + }
  26 + if !constant.DISABLE_CREATE_TABLE {
  27 + for _, model := range []interface{}{
  28 + (*models.Permission)(nil),
  29 + (*models.PartnerCategory)(nil),
  30 + (*models.UserAuth)(nil),
  31 + } {
  32 + err := DB.Model(model).CreateTable(&orm.CreateTableOptions{
  33 + Temp: false,
  34 + IfNotExists: true,
  35 + FKConstraints: true,
  36 + })
  37 + if err != nil {
  38 + panic(err)
  39 + }
  40 + }
  41 + }
  42 +}
  1 +package models
  2 +
  3 +type PartnerCategory struct {
  4 + tableName string `pg:"partner_category"`
  5 + // 合伙人类别id
  6 + PartnerCategoryId int `pg:",pk"`
  7 + // 合伙人类别编码
  8 + PartnerCategoryCode string
  9 + // 合伙人类别名称
  10 + PartnerCategoryName string
  11 +}
  1 +package models
  2 +
  3 +type Permission struct {
  4 + tableName string `pg:"permissions,alias:permission"`
  5 + // 权限id
  6 + PermissionId int `pg:",pk"`
  7 + // 公司名称
  8 + Name string
  9 + // 权限编码
  10 + Code string
  11 + // 父级id
  12 + ParentId int
  13 + // 排序
  14 + Sort int
  15 + // 图标
  16 + Icon string
  17 +}
  1 +package models
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/domain"
  5 + "time"
  6 +)
  7 +
  8 +type UserAuth struct {
  9 + tableName string `pg:"user_auth"`
  10 + // 用户认证编号
  11 + UserAuthId int64
  12 + // 用户id列表
  13 + Users []int64 `pg:",array"`
  14 + // 手机认证
  15 + PhoneAuth *domain.PhoneAuth
  16 + // 创建时间
  17 + CreateAt time.Time
  18 + // 更新时间
  19 + UpdateAt time.Time
  20 +}
  1 +package transform
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/domain"
  5 + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg/models"
  6 +)
  7 +
  8 +func TransformToPartnerCategoryDomainModelFromPgModels(partnerCategoryModel *models.PartnerCategory) (*domain.PartnerCategory, error) {
  9 + return &domain.PartnerCategory{
  10 + PartnerCategoryId: partnerCategoryModel.PartnerCategoryId,
  11 + PartnerCategoryCode: partnerCategoryModel.PartnerCategoryCode,
  12 + PartnerCategoryName: partnerCategoryModel.PartnerCategoryName,
  13 + }, nil
  14 +}
  1 +package transform
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/domain"
  5 + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg/models"
  6 +)
  7 +
  8 +func TransformToPermissionDomainModelFromPgModels(permissionModel *models.Permission) (*domain.Permission, error) {
  9 + return &domain.Permission{
  10 + PermissionId: permissionModel.PermissionId,
  11 + Name: permissionModel.Name,
  12 + Code: permissionModel.Code,
  13 + ParentId: permissionModel.ParentId,
  14 + Sort: permissionModel.Sort,
  15 + Icon: permissionModel.Icon,
  16 + }, nil
  17 +}
  1 +package transform
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/domain"
  5 + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg/models"
  6 +)
  7 +
  8 +func TransformToUserAuthDomainModelFromPgModels(userAuthModel *models.UserAuth) (*domain.UserAuth, error) {
  9 + return &domain.UserAuth{
  10 + UserAuthId: userAuthModel.UserAuthId,
  11 + Users: userAuthModel.Users,
  12 + PhoneAuth: userAuthModel.PhoneAuth,
  13 + CreateAt: userAuthModel.CreateAt,
  14 + UpdateAt: userAuthModel.UpdateAt,
  15 + }, nil
  16 +}
  1 +package repository
  2 +
  3 +import (
  4 + "fmt"
  5 + "github.com/go-pg/pg/v10"
  6 +
  7 + "github.com/linmadan/egglib-go/persistent/pg/sqlbuilder"
  8 + pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
  9 + "github.com/linmadan/egglib-go/utils/snowflake"
  10 + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/domain"
  11 + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg/models"
  12 + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg/transform"
  13 +)
  14 +
  15 +type PartnerCategoryRepository struct {
  16 + transactionContext *pgTransaction.TransactionContext
  17 +}
  18 +
  19 +func (repository *PartnerCategoryRepository) nextIdentify() (int64, error) {
  20 + IdWorker, err := snowflake.NewIdWorker(1)
  21 + if err != nil {
  22 + return 0, err
  23 + }
  24 + id, err := IdWorker.NextId()
  25 + return id, err
  26 +}
  27 +func (repository *PartnerCategoryRepository) Save(partnerCategory *domain.PartnerCategory) (*domain.PartnerCategory, error) {
  28 + sqlBuildFields := []string{
  29 + "partner_category_id",
  30 + "partner_category_code",
  31 + "partner_category_name",
  32 + }
  33 + insertFieldsSnippet := sqlbuilder.SqlFieldsSnippet(sqlBuildFields)
  34 + insertPlaceHoldersSnippet := sqlbuilder.SqlPlaceHoldersSnippet(sqlBuildFields)
  35 + returningFieldsSnippet := sqlbuilder.SqlFieldsSnippet(sqlBuildFields)
  36 + updateFields := sqlbuilder.RemoveSqlFields(sqlBuildFields, "partnerCategory_id")
  37 + updateFieldsSnippet := sqlbuilder.SqlUpdateFieldsSnippet(updateFields)
  38 + tx := repository.transactionContext.PgTx
  39 + if partnerCategory.Identify() == nil {
  40 + partnerCategoryId, err := repository.nextIdentify()
  41 + if err != nil {
  42 + return partnerCategory, err
  43 + } else {
  44 + partnerCategory.PartnerCategoryId = int(partnerCategoryId)
  45 + }
  46 + if _, err := tx.QueryOne(
  47 + pg.Scan(
  48 + &partnerCategory.PartnerCategoryId,
  49 + &partnerCategory.PartnerCategoryCode,
  50 + &partnerCategory.PartnerCategoryName,
  51 + ),
  52 + fmt.Sprintf("INSERT INTO partner_categorys (%s) VALUES (%s) RETURNING %s", insertFieldsSnippet, insertPlaceHoldersSnippet, returningFieldsSnippet),
  53 + partnerCategory.PartnerCategoryId,
  54 + partnerCategory.PartnerCategoryCode,
  55 + partnerCategory.PartnerCategoryName,
  56 + ); err != nil {
  57 + return partnerCategory, err
  58 + }
  59 + } else {
  60 + if _, err := tx.QueryOne(
  61 + pg.Scan(
  62 + &partnerCategory.PartnerCategoryId,
  63 + &partnerCategory.PartnerCategoryCode,
  64 + &partnerCategory.PartnerCategoryName,
  65 + ),
  66 + fmt.Sprintf("UPDATE partner_categorys SET %s WHERE partner_category_id=? RETURNING %s", updateFieldsSnippet, returningFieldsSnippet),
  67 + partnerCategory.PartnerCategoryId,
  68 + partnerCategory.PartnerCategoryCode,
  69 + partnerCategory.PartnerCategoryName,
  70 + partnerCategory.Identify(),
  71 + ); err != nil {
  72 + return partnerCategory, err
  73 + }
  74 + }
  75 + return partnerCategory, nil
  76 +}
  77 +func (repository *PartnerCategoryRepository) Remove(partnerCategory *domain.PartnerCategory) (*domain.PartnerCategory, error) {
  78 + tx := repository.transactionContext.PgTx
  79 + partnerCategoryModel := new(models.PartnerCategory)
  80 + partnerCategoryModel.PartnerCategoryId = partnerCategory.Identify().(int)
  81 + if _, err := tx.Model(partnerCategoryModel).WherePK().Delete(); err != nil {
  82 + return partnerCategory, err
  83 + }
  84 + return partnerCategory, nil
  85 +}
  86 +func (repository *PartnerCategoryRepository) FindOne(queryOptions map[string]interface{}) (*domain.PartnerCategory, error) {
  87 + tx := repository.transactionContext.PgTx
  88 + partnerCategoryModel := new(models.PartnerCategory)
  89 + query := sqlbuilder.BuildQuery(tx.Model(partnerCategoryModel), queryOptions)
  90 + query.SetWhereByQueryOption("partner_category.partner_category_id = ?", "partnerCategoryId")
  91 + if err := query.First(); err != nil {
  92 + if err.Error() == "pg: no rows in result set" {
  93 + return nil, fmt.Errorf("没有此资源")
  94 + } else {
  95 + return nil, err
  96 + }
  97 + }
  98 + if partnerCategoryModel.PartnerCategoryId == 0 {
  99 + return nil, nil
  100 + } else {
  101 + return transform.TransformToPartnerCategoryDomainModelFromPgModels(partnerCategoryModel)
  102 + }
  103 +}
  104 +func (repository *PartnerCategoryRepository) Find(queryOptions map[string]interface{}) (int64, []*domain.PartnerCategory, error) {
  105 + tx := repository.transactionContext.PgTx
  106 + var partnerCategoryModels []*models.PartnerCategory
  107 + partnerCategorys := make([]*domain.PartnerCategory, 0)
  108 + query := sqlbuilder.BuildQuery(tx.Model(&partnerCategoryModels), queryOptions)
  109 + query.SetOffsetAndLimit(20)
  110 + query.SetOrderDirect("partner_category_id", "DESC")
  111 + if count, err := query.SelectAndCount(); err != nil {
  112 + return 0, partnerCategorys, err
  113 + } else {
  114 + for _, partnerCategoryModel := range partnerCategoryModels {
  115 + if partnerCategory, err := transform.TransformToPartnerCategoryDomainModelFromPgModels(partnerCategoryModel); err != nil {
  116 + return 0, partnerCategorys, err
  117 + } else {
  118 + partnerCategorys = append(partnerCategorys, partnerCategory)
  119 + }
  120 + }
  121 + return int64(count), partnerCategorys, nil
  122 + }
  123 +}
  124 +func NewPartnerCategoryRepository(transactionContext *pgTransaction.TransactionContext) (*PartnerCategoryRepository, error) {
  125 + if transactionContext == nil {
  126 + return nil, fmt.Errorf("transactionContext参数不能为nil")
  127 + } else {
  128 + return &PartnerCategoryRepository{
  129 + transactionContext: transactionContext,
  130 + }, nil
  131 + }
  132 +}
  1 +package repository
  2 +
  3 +import (
  4 + "fmt"
  5 + "github.com/go-pg/pg/v10"
  6 +
  7 + "github.com/linmadan/egglib-go/persistent/pg/sqlbuilder"
  8 + pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
  9 + "github.com/linmadan/egglib-go/utils/snowflake"
  10 + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/domain"
  11 + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg/models"
  12 + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg/transform"
  13 +)
  14 +
  15 +type PermissionRepository struct {
  16 + transactionContext *pgTransaction.TransactionContext
  17 +}
  18 +
  19 +func (repository *PermissionRepository) nextIdentify() (int64, error) {
  20 + IdWorker, err := snowflake.NewIdWorker(1)
  21 + if err != nil {
  22 + return 0, err
  23 + }
  24 + id, err := IdWorker.NextId()
  25 + return id, err
  26 +}
  27 +func (repository *PermissionRepository) Save(permission *domain.Permission) (*domain.Permission, error) {
  28 + sqlBuildFields := []string{
  29 + "permission_id",
  30 + "name",
  31 + "code",
  32 + "parent_id",
  33 + "sort",
  34 + "icon",
  35 + }
  36 + insertFieldsSnippet := sqlbuilder.SqlFieldsSnippet(sqlBuildFields)
  37 + insertPlaceHoldersSnippet := sqlbuilder.SqlPlaceHoldersSnippet(sqlBuildFields)
  38 + returningFieldsSnippet := sqlbuilder.SqlFieldsSnippet(sqlBuildFields)
  39 + updateFields := sqlbuilder.RemoveSqlFields(sqlBuildFields, "permission_id")
  40 + updateFieldsSnippet := sqlbuilder.SqlUpdateFieldsSnippet(updateFields)
  41 + tx := repository.transactionContext.PgTx
  42 + if permission.Identify() == nil {
  43 + permissionId, err := repository.nextIdentify()
  44 + if err != nil {
  45 + return permission, err
  46 + } else {
  47 + permission.PermissionId = int(permissionId)
  48 + }
  49 + if _, err := tx.QueryOne(
  50 + pg.Scan(
  51 + &permission.PermissionId,
  52 + &permission.Name,
  53 + &permission.Code,
  54 + &permission.ParentId,
  55 + &permission.Sort,
  56 + &permission.Icon,
  57 + ),
  58 + fmt.Sprintf("INSERT INTO permissions (%s) VALUES (%s) RETURNING %s", insertFieldsSnippet, insertPlaceHoldersSnippet, returningFieldsSnippet),
  59 + permission.PermissionId,
  60 + permission.Name,
  61 + permission.Code,
  62 + permission.ParentId,
  63 + permission.Sort,
  64 + permission.Icon,
  65 + ); err != nil {
  66 + return permission, err
  67 + }
  68 + } else {
  69 + if _, err := tx.QueryOne(
  70 + pg.Scan(
  71 + &permission.PermissionId,
  72 + &permission.Name,
  73 + &permission.Code,
  74 + &permission.ParentId,
  75 + &permission.Sort,
  76 + &permission.Icon,
  77 + ),
  78 + fmt.Sprintf("UPDATE permissions SET %s WHERE permission_id=? RETURNING %s", updateFieldsSnippet, returningFieldsSnippet),
  79 + permission.PermissionId,
  80 + permission.Name,
  81 + permission.Code,
  82 + permission.ParentId,
  83 + permission.Sort,
  84 + permission.Icon,
  85 + permission.Identify(),
  86 + ); err != nil {
  87 + return permission, err
  88 + }
  89 + }
  90 + return permission, nil
  91 +}
  92 +func (repository *PermissionRepository) Remove(permission *domain.Permission) (*domain.Permission, error) {
  93 + tx := repository.transactionContext.PgTx
  94 + permissionModel := new(models.Permission)
  95 + permissionModel.PermissionId = permission.Identify().(int)
  96 + if _, err := tx.Model(permissionModel).WherePK().Delete(); err != nil {
  97 + return permission, err
  98 + }
  99 + return permission, nil
  100 +}
  101 +func (repository *PermissionRepository) FindOne(queryOptions map[string]interface{}) (*domain.Permission, error) {
  102 + tx := repository.transactionContext.PgTx
  103 + permissionModel := new(models.Permission)
  104 + query := sqlbuilder.BuildQuery(tx.Model(permissionModel), queryOptions)
  105 + query.SetWhereByQueryOption("permission.permission_id = ?", "permissionId")
  106 + if err := query.First(); err != nil {
  107 + if err.Error() == "pg: no rows in result set" {
  108 + return nil, fmt.Errorf("没有此资源")
  109 + } else {
  110 + return nil, err
  111 + }
  112 + }
  113 + if permissionModel.PermissionId == 0 {
  114 + return nil, nil
  115 + } else {
  116 + return transform.TransformToPermissionDomainModelFromPgModels(permissionModel)
  117 + }
  118 +}
  119 +func (repository *PermissionRepository) Find(queryOptions map[string]interface{}) (int64, []*domain.Permission, error) {
  120 + tx := repository.transactionContext.PgTx
  121 + var permissionModels []*models.Permission
  122 + permissions := make([]*domain.Permission, 0)
  123 + query := sqlbuilder.BuildQuery(tx.Model(&permissionModels), queryOptions)
  124 + query.SetOffsetAndLimit(20)
  125 + query.SetOrderDirect("permission_id", "DESC")
  126 + if count, err := query.SelectAndCount(); err != nil {
  127 + return 0, permissions, err
  128 + } else {
  129 + for _, permissionModel := range permissionModels {
  130 + if permission, err := transform.TransformToPermissionDomainModelFromPgModels(permissionModel); err != nil {
  131 + return 0, permissions, err
  132 + } else {
  133 + permissions = append(permissions, permission)
  134 + }
  135 + }
  136 + return int64(count), permissions, nil
  137 + }
  138 +}
  139 +func NewPermissionRepository(transactionContext *pgTransaction.TransactionContext) (*PermissionRepository, error) {
  140 + if transactionContext == nil {
  141 + return nil, fmt.Errorf("transactionContext参数不能为nil")
  142 + } else {
  143 + return &PermissionRepository{
  144 + transactionContext: transactionContext,
  145 + }, nil
  146 + }
  147 +}
  1 +package repository
  2 +
  3 +import (
  4 + "fmt"
  5 + "github.com/go-pg/pg/v10"
  6 +
  7 + "github.com/linmadan/egglib-go/persistent/pg/sqlbuilder"
  8 + pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
  9 + "github.com/linmadan/egglib-go/utils/snowflake"
  10 + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/domain"
  11 + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg/models"
  12 + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg/transform"
  13 +)
  14 +
  15 +type UserAuthRepository struct {
  16 + transactionContext *pgTransaction.TransactionContext
  17 +}
  18 +
  19 +func (repository *UserAuthRepository) nextIdentify() (int64, error) {
  20 + IdWorker, err := snowflake.NewIdWorker(1)
  21 + if err != nil {
  22 + return 0, err
  23 + }
  24 + id, err := IdWorker.NextId()
  25 + return id, err
  26 +}
  27 +func (repository *UserAuthRepository) Save(userAuth *domain.UserAuth) (*domain.UserAuth, error) {
  28 + sqlBuildFields := []string{
  29 + "user_auth_id",
  30 + "users",
  31 + "phone_auth",
  32 + "create_at",
  33 + "update_at",
  34 + }
  35 + insertFieldsSnippet := sqlbuilder.SqlFieldsSnippet(sqlBuildFields)
  36 + insertPlaceHoldersSnippet := sqlbuilder.SqlPlaceHoldersSnippet(sqlBuildFields)
  37 + returningFieldsSnippet := sqlbuilder.SqlFieldsSnippet(sqlBuildFields)
  38 + updateFields := sqlbuilder.RemoveSqlFields(sqlBuildFields, "userAuth_id")
  39 + updateFieldsSnippet := sqlbuilder.SqlUpdateFieldsSnippet(updateFields)
  40 + tx := repository.transactionContext.PgTx
  41 + if userAuth.Identify() == nil {
  42 + userAuthId, err := repository.nextIdentify()
  43 + if err != nil {
  44 + return userAuth, err
  45 + } else {
  46 + userAuth.UserAuthId = userAuthId
  47 + }
  48 + if _, err := tx.QueryOne(
  49 + pg.Scan(
  50 + &userAuth.UserAuthId,
  51 + pg.Array(&userAuth.Users),
  52 + &userAuth.PhoneAuth,
  53 + &userAuth.CreateAt,
  54 + &userAuth.UpdateAt,
  55 + ),
  56 + fmt.Sprintf("INSERT INTO user_auths (%s) VALUES (%s) RETURNING %s", insertFieldsSnippet, insertPlaceHoldersSnippet, returningFieldsSnippet),
  57 + userAuth.UserAuthId,
  58 + pg.Array(userAuth.Users),
  59 + userAuth.PhoneAuth,
  60 + userAuth.CreateAt,
  61 + userAuth.UpdateAt,
  62 + ); err != nil {
  63 + return userAuth, err
  64 + }
  65 + } else {
  66 + if _, err := tx.QueryOne(
  67 + pg.Scan(
  68 + &userAuth.UserAuthId,
  69 + pg.Array(&userAuth.Users),
  70 + &userAuth.PhoneAuth,
  71 + &userAuth.CreateAt,
  72 + &userAuth.UpdateAt,
  73 + ),
  74 + fmt.Sprintf("UPDATE user_auths SET %s WHERE user_auth_id=? RETURNING %s", updateFieldsSnippet, returningFieldsSnippet),
  75 + userAuth.UserAuthId,
  76 + pg.Array(userAuth.Users),
  77 + userAuth.PhoneAuth,
  78 + userAuth.CreateAt,
  79 + userAuth.UpdateAt,
  80 + userAuth.Identify(),
  81 + ); err != nil {
  82 + return userAuth, err
  83 + }
  84 + }
  85 + return userAuth, nil
  86 +}
  87 +func (repository *UserAuthRepository) Remove(userAuth *domain.UserAuth) (*domain.UserAuth, error) {
  88 + tx := repository.transactionContext.PgTx
  89 + userAuthModel := new(models.UserAuth)
  90 + userAuthModel.UserAuthId = userAuth.Identify().(int64)
  91 + if _, err := tx.Model(userAuthModel).WherePK().Delete(); err != nil {
  92 + return userAuth, err
  93 + }
  94 + return userAuth, nil
  95 +}
  96 +func (repository *UserAuthRepository) FindOne(queryOptions map[string]interface{}) (*domain.UserAuth, error) {
  97 + tx := repository.transactionContext.PgTx
  98 + userAuthModel := new(models.UserAuth)
  99 + query := sqlbuilder.BuildQuery(tx.Model(userAuthModel), queryOptions)
  100 + query.SetWhereByQueryOption("user_auth.user_auth_id = ?", "userAuthId")
  101 + if err := query.First(); err != nil {
  102 + if err.Error() == "pg: no rows in result set" {
  103 + return nil, fmt.Errorf("没有此资源")
  104 + } else {
  105 + return nil, err
  106 + }
  107 + }
  108 + if userAuthModel.UserAuthId == 0 {
  109 + return nil, nil
  110 + } else {
  111 + return transform.TransformToUserAuthDomainModelFromPgModels(userAuthModel)
  112 + }
  113 +}
  114 +func (repository *UserAuthRepository) Find(queryOptions map[string]interface{}) (int64, []*domain.UserAuth, error) {
  115 + tx := repository.transactionContext.PgTx
  116 + var userAuthModels []*models.UserAuth
  117 + userAuths := make([]*domain.UserAuth, 0)
  118 + query := sqlbuilder.BuildQuery(tx.Model(&userAuthModels), queryOptions)
  119 + query.SetOffsetAndLimit(20)
  120 + query.SetOrderDirect("user_auth_id", "DESC")
  121 + if count, err := query.SelectAndCount(); err != nil {
  122 + return 0, userAuths, err
  123 + } else {
  124 + for _, userAuthModel := range userAuthModels {
  125 + if userAuth, err := transform.TransformToUserAuthDomainModelFromPgModels(userAuthModel); err != nil {
  126 + return 0, userAuths, err
  127 + } else {
  128 + userAuths = append(userAuths, userAuth)
  129 + }
  130 + }
  131 + return int64(count), userAuths, nil
  132 + }
  133 +}
  134 +func NewUserAuthRepository(transactionContext *pgTransaction.TransactionContext) (*UserAuthRepository, error) {
  135 + if transactionContext == nil {
  136 + return nil, fmt.Errorf("transactionContext参数不能为nil")
  137 + } else {
  138 + return &UserAuthRepository{
  139 + transactionContext: transactionContext,
  140 + }, nil
  141 + }
  142 +}
  1 +package log
  2 +
  3 +import (
  4 + "github.com/linmadan/egglib-go/log"
  5 + "github.com/linmadan/egglib-go/log/logrus"
  6 + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/constant"
  7 +)
  8 +
  9 +var Logger log.Logger
  10 +
  11 +func init() {
  12 + Logger = logrus.NewLogrusLogger()
  13 + Logger.SetServiceName(constant.SERVICE_NAME)
  14 + Logger.SetLevel(constant.LOG_LEVEL)
  15 +}
  1 +package beego
  2 +
  3 +import (
  4 + "github.com/beego/beego/v2/server/web"
  5 + "github.com/linmadan/egglib-go/web/beego/filters"
  6 + "os"
  7 + "strconv"
  8 +
  9 + . "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/log"
  10 + _ "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/port/beego/routers"
  11 +)
  12 +
  13 +func init() {
  14 + web.BConfig.AppName = "partner01"
  15 + web.BConfig.CopyRequestBody = true
  16 + web.BConfig.RunMode = "dev"
  17 + web.BConfig.Listen.HTTPPort = 8080
  18 + web.BConfig.Listen.EnableAdmin = false
  19 + web.BConfig.WebConfig.CommentRouterPath = "/pkg/port/beego"
  20 + if os.Getenv("RUN_MODE") != "" {
  21 + web.BConfig.RunMode = os.Getenv("RUN_MODE")
  22 + }
  23 + if os.Getenv("HTTP_PORT") != "" {
  24 + portStr := os.Getenv("HTTP_PORT")
  25 + if port, err := strconv.Atoi(portStr); err == nil {
  26 + web.BConfig.Listen.HTTPPort = port
  27 + }
  28 + }
  29 + web.InsertFilter("/*", web.BeforeExec, filters.AllowCors())
  30 + web.InsertFilter("/*", web.BeforeExec, filters.CreateRequstLogFilter(Logger))
  31 + web.InsertFilter("/*", web.AfterExec, filters.CreateResponseLogFilter(Logger), web.WithReturnOnOutput(false))
  32 +}
  1 +package controllers
  2 +
  3 +import (
  4 + "github.com/linmadan/egglib-go/web/beego"
  5 + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/application/partner/query"
  6 + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/application/partner/service"
  7 +)
  8 +
  9 +type PartnerController struct {
  10 + beego.BaseController
  11 +}
  12 +
  13 +func (controller *PartnerController) PartnerCategories() {
  14 + partnerService := service.NewPartnerService(nil)
  15 + partnerCategoriesQuery := &query.PartnerCategoriesQuery{}
  16 + data, err := partnerService.PartnerCategories(partnerCategoriesQuery)
  17 + controller.Response(data, err)
  18 +}
  1 +package controllers
  2 +
  3 +import (
  4 + "github.com/linmadan/egglib-go/web/beego"
  5 + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/application/permission/query"
  6 + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/application/permission/service"
  7 +)
  8 +
  9 +type PermissionController struct {
  10 + beego.BaseController
  11 +}
  12 +
  13 +func (controller *PermissionController) Menus() {
  14 + permissionService := service.NewPermissionService(nil)
  15 + menusQuery := &query.MenusQuery{}
  16 + data, err := permissionService.Menus(menusQuery)
  17 + controller.Response(data, err)
  18 +}
  1 +package routers
  2 +
  3 +import (
  4 + "github.com/beego/beego/v2/server/web"
  5 + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/port/beego/controllers"
  6 +)
  7 +
  8 +func init() {
  9 + web.Router("/partners/categories", &controllers.PartnerController{}, "Get:PartnerCategories")
  10 +}
  1 +package routers
  2 +
  3 +import (
  4 + "github.com/beego/beego/v2/server/web"
  5 + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/port/beego/controllers"
  6 +)
  7 +
  8 +func init() {
  9 + web.Router("/permission/menus", &controllers.PermissionController{}, "Get:Menus")
  10 +}
  1 +package partner
  2 +
  3 +import (
  4 + "github.com/go-pg/pg/v10"
  5 + "net/http"
  6 +
  7 + "github.com/gavv/httpexpect"
  8 + . "github.com/onsi/ginkgo"
  9 + . "github.com/onsi/gomega"
  10 + pG "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg"
  11 +)
  12 +
  13 +var _ = Describe("合伙人分类列表", func() {
  14 + var id int64
  15 + BeforeEach(func() {
  16 + _, err := pG.DB.QueryOne(
  17 + pg.Scan(&id),
  18 + "INSERT INTO partner_category (partner_category_id,partner_category_code,partner_category_name) VALUES (?,?,?) RETURNING partner_category_id",
  19 + 1000, "testPartnerCategoryCode", "testPartnerCategoryName")
  20 + Expect(err).NotTo(HaveOccurred())
  21 + })
  22 + Describe("合伙人分类列表", func() {
  23 + Context("", func() {
  24 + It("", func() {
  25 + httpExpect := httpexpect.New(GinkgoT(), server.URL)
  26 + httpExpect.GET("/partners/categories").
  27 + Expect().
  28 + Status(http.StatusOK).
  29 + JSON().
  30 + Object().
  31 + ContainsKey("code").ValueEqual("code", 0).
  32 + ContainsKey("msg").ValueEqual("msg", "ok").
  33 + ContainsKey("data").Value("data").Object()
  34 + })
  35 + })
  36 + })
  37 + AfterEach(func() {
  38 + _, err := pG.DB.Exec("DELETE FROM partner_category WHERE partner_category_id = 1000")
  39 + Expect(err).NotTo(HaveOccurred())
  40 + })
  41 +})
  1 +package partner
  2 +
  3 +import (
  4 + "net/http"
  5 + "net/http/httptest"
  6 + "testing"
  7 +
  8 + "github.com/beego/beego/v2/server/web"
  9 + . "github.com/onsi/ginkgo"
  10 + . "github.com/onsi/gomega"
  11 + _ "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg"
  12 + _ "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/port/beego"
  13 +)
  14 +
  15 +func TestPartner(t *testing.T) {
  16 + RegisterFailHandler(Fail)
  17 + RunSpecs(t, "Beego Port Partner Correlations Test Case Suite")
  18 +}
  19 +
  20 +var handler http.Handler
  21 +var server *httptest.Server
  22 +
  23 +var _ = BeforeSuite(func() {
  24 + handler = web.BeeApp.Handlers
  25 + server = httptest.NewServer(handler)
  26 +})
  27 +
  28 +var _ = AfterSuite(func() {
  29 + server.Close()
  30 +})
  1 +package permission
  2 +
  3 +import (
  4 + "github.com/go-pg/pg/v10"
  5 + "net/http"
  6 +
  7 + "github.com/gavv/httpexpect"
  8 + . "github.com/onsi/ginkgo"
  9 + . "github.com/onsi/gomega"
  10 + pG "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg"
  11 +)
  12 +
  13 +var _ = Describe("根据当前用户返回权限列表", func() {
  14 + var permissionId int64
  15 + BeforeEach(func() {
  16 + _, err := pG.DB.QueryOne(
  17 + pg.Scan(&permissionId),
  18 + "INSERT INTO permissions (permission_id,name,code,parent_id,sort,icon) VALUES (?,?,?,?,?,?) RETURNING permission_id",
  19 + 1000, "testPermission", "testPermissionCode", 0, 1, "testPermissionIcon")
  20 + Expect(err).NotTo(HaveOccurred())
  21 + })
  22 + Describe("根据当前用户返回权限列表", func() {
  23 + Context("", func() {
  24 + It("", func() {
  25 + httpExpect := httpexpect.New(GinkgoT(), server.URL)
  26 + httpExpect.GET("/permission/menus").
  27 + Expect().
  28 + Status(http.StatusOK).
  29 + JSON().
  30 + Object().
  31 + ContainsKey("code").ValueEqual("code", 0).
  32 + ContainsKey("msg").ValueEqual("msg", "ok").
  33 + ContainsKey("data").Value("data").Object().ValueNotEqual("total", 0)
  34 + })
  35 + })
  36 + })
  37 + AfterEach(func() {
  38 + _, err := pG.DB.Exec("DELETE FROM permissions WHERE permission_id = 1000")
  39 + Expect(err).NotTo(HaveOccurred())
  40 + })
  41 +})
  1 +package permission
  2 +
  3 +import (
  4 + "net/http"
  5 + "net/http/httptest"
  6 + "testing"
  7 +
  8 + "github.com/beego/beego/v2/server/web"
  9 + . "github.com/onsi/ginkgo"
  10 + . "github.com/onsi/gomega"
  11 + _ "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg"
  12 + _ "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/port/beego"
  13 +)
  14 +
  15 +func TestPermission(t *testing.T) {
  16 + RegisterFailHandler(Fail)
  17 + RunSpecs(t, "Beego Port Permission Correlations Test Case Suite")
  18 +}
  19 +
  20 +var handler http.Handler
  21 +var server *httptest.Server
  22 +
  23 +var _ = BeforeSuite(func() {
  24 + handler = web.BeeApp.Handlers
  25 + server = httptest.NewServer(handler)
  26 +})
  27 +
  28 +var _ = AfterSuite(func() {
  29 + server.Close()
  30 +})