feat:MONGO ORM

This commit is contained in:
aliang
2022-09-02 11:43:10 +08:00
parent a08cd9a033
commit e9df0cf869
5 changed files with 503 additions and 8 deletions

224
console/commands/mongo.go Normal file
View File

@@ -0,0 +1,224 @@
package commands
import (
_ "embed"
"fmt"
"github.com/ctfang/command"
"github.com/go-home-admin/toolset/console/commands/orm"
"github.com/go-home-admin/toolset/parser"
"os"
"path/filepath"
"strings"
)
// MongoCommand @Bean
type MongoCommand struct{}
//go:embed mongo/orm.go.text
var ormTemplate string
func (MongoCommand) Configure() command.Configure {
return command.Configure{
Name: "make:mongo",
Description: "根据proto文件, 生成mongodb的orm源码",
Input: command.Argument{
Argument: []command.ArgParam{
{
Name: "proto_file",
Description: "一个以数据库名命名的proto文件",
},
},
Option: []command.ArgParam{
{
Name: "out",
Description: "输出目录",
Default: "@root/app/entity",
},
},
},
}
}
func (MongoCommand) Execute(input command.Input) {
root := getRootPath()
file := input.GetArgument("proto_file")
if file[0:1] != "/" && file[0:1] != "@" {
file = "@root" + "/" + file
}
file = strings.Replace(file, "@root", root, 1)
if !orm.IsExist(file) {
panic("找不到proto文件")
}
out := input.GetOption("out")
if out[0:1] != "/" && out[0:1] != "@" {
out = "@root" + "/" + out
}
out = strings.Replace(out, "@root", root, 1)
protoc, _ := parser.GetProtoFileParser(file)
db := strings.Split(filepath.Base(file), ".")[0]
out = out + "/" + db
if !orm.IsExist(out) {
_ = os.MkdirAll(out, 0766)
}
//生成枚举
enumFile := out + "/" + "db_enum_gen.go"
enumStr := "package " + db + "\n\n"
for enumName, enumInfo := range protoc.Enums {
enumStr += formatDoc(enumInfo.Doc, true) + "type " + enumName + " int32\n\n"
enumStr += "const ("
for _, attr := range enumInfo.Opt {
enumStr += "\n" + formatDoc(attr.Doc, true)
enumStr += enumName + "_" + attr.Name + " " + enumName + " = " + fmt.Sprint(attr.Num)
}
enumStr += "\n)\n\n"
}
err := os.WriteFile(enumFile, []byte(enumStr), 0766)
if err != nil {
panic("生成枚举文件出错:" + err.Error())
}
runOtherCommand("go", "fmt", enumFile)
//生成结构文件
structMap := make(map[string]int, 0)
for structName, _ := range protoc.Messages {
structMap[structName] = 1
}
structFile := out + "/" + "db_struct_gen.go"
structStr := "package " + db + "\n"
for structName, structInfo := range protoc.Messages {
if strings.Index(structInfo.Doc, "@Struct") != -1 || strings.Index(structInfo.Doc, "@struct") != -1 {
structStr += "\n" + formatDoc(structInfo.Doc, true)
structStr += genOrmStruct(structName, structInfo.Attr, structMap) + "\n"
}
}
err = os.WriteFile(structFile, []byte(structStr), 0766)
if err != nil {
panic("生成结构文件出错:" + err.Error())
}
runOtherCommand("go", "fmt", structFile)
//生成ORM文件
for tableName, tableInfo := range protoc.Messages {
if strings.Index(tableInfo.Doc, "@Struct") != -1 || strings.Index(tableInfo.Doc, "@struct") != -1 {
continue
}
str := ormTemplate
tableNameSnake := parser.StringToSnake(tableName)
ormFile := out + "/" + tableNameSnake + "_gen.go"
for old, newStr := range map[string]string{
"{database}": db,
"{tableName}": tableName,
"{tableNameSnake}": tableNameSnake,
"{ormStruct}": genOrmStruct(tableName, tableInfo.Attr, structMap),
"{createdAt}": genCreateAt(tableInfo.Attr),
"{updatedAt}": genUpdatedAt(tableInfo.Attr),
"{where}": genWhere(tableName, tableInfo.Attr),
} {
str = strings.ReplaceAll(str, old, newStr)
}
err = os.WriteFile(ormFile, []byte(str), 0766)
if err != nil {
panic("生成ORM文件出错" + err.Error())
}
runOtherCommand("go", "fmt", ormFile)
}
}
func genOrmStruct(tableName string, columns []parser.Attr, structMap map[string]int) string {
str := "type " + tableName + " struct {"
str += "\n\tId string `bson:\"_id\" form:\"id\" json:\"id,omitempty\"`"
for _, column := range columns {
if column.Name == "id" || column.Name == "_id" {
continue
}
fieldName := parser.StringToHump(column.Name)
str += fmt.Sprintf("\n\t%v %v `%v` %v", fieldName, getGoType(column, structMap), genGormTag(column), formatDoc(column.Doc))
}
return str + "\n}"
}
func genGormTag(column parser.Attr) string {
return strings.ReplaceAll(`bson:"{field}" form:"{field}" json:"{field},omitempty"`, "{field}", column.Name)
}
func formatDoc(doc string, wrap ...bool) string {
if doc == "" {
return ""
}
end := ""
if len(wrap) > 0 && wrap[0] == true {
end = "\n"
}
return "// " + strings.ReplaceAll(strings.ReplaceAll(doc, "@Struct", ""), "@struct", "") + end
}
func getGoType(column parser.Attr, structMap map[string]int) string {
t := column.Ty
switch t {
case "double", "float":
t = "float64"
}
if _, ok := structMap[t]; ok {
t = "*" + t
}
if column.Repeated {
t = "[]" + t
}
return t
}
func genCreateAt(columns []parser.Attr) string {
str := ""
for _, column := range columns {
if column.Name == "created_at" || column.Name == "updated_at" {
columnName := parser.StringToHump(column.Name)
if strings.Contains(column.Ty, "int") {
timeStr := "time.Now().Unix()"
if column.Ty != "int64" {
timeStr = column.Ty + "(" + timeStr + ")"
}
str += fmt.Sprintf("if data.%v == 0 {\ndata.%v = %v\n}\n", columnName, columnName, timeStr)
} else if column.Ty == "string" {
str += strings.ReplaceAll("if data.{field} == \"\" {\ndata.{field} = time.Now().Format(\"2006-01-02 15:04:05\")\n}\n", "{field}", columnName)
}
}
}
return str
}
func genUpdatedAt(columns []parser.Attr) string {
str := ""
for _, column := range columns {
if column.Name == "updated_at" {
if strings.Contains(column.Ty, "int") {
str += "if data[\"UpdatedAt\"] == 0 {\ndata[\"UpdatedAt\"] = time.Now().Unix()\n}\n"
} else if column.Ty == "string" {
str += "if _,ok := data[\"UpdatedAt\"]; !ok {\ndata[\"UpdatedAt\"] = time.Now().Format(\"2006-01-02 15:04:05\")\n}\n"
}
}
}
return str
}
func genWhere(tableName string, columns []parser.Attr) string {
var supportType = map[string]int{
"int": 1,
"int32": 1,
"uint32": 1,
"int64": 1,
"float32": 1,
"float64": 1,
"string": 1,
}
template := "func (receiver *Orm%v) Where%v(value %v) *Orm%v {\nreturn receiver.Where(\"%v\", value)\n}\n\n"
str := ""
for _, column := range columns {
if _, ok := supportType[column.Ty]; ok {
field := parser.StringToHump(column.Name)
str += fmt.Sprintf(template, tableName, field, column.Ty, tableName, column.Name)
}
}
return str
}

View File

@@ -0,0 +1,220 @@
package {database}
import (
"context"
"errors"
provider "github.com/go-home-admin/home/bootstrap/providers/mongo"
log "github.com/sirupsen/logrus"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"gopkg.in/mgo.v2/bson"
"strings"
"time"
)
{ormStruct}
type Orm{tableName} struct {
ctx context.Context
query bson.M
findOpt *options.FindOptions
info *{tableName}
collection *mongo.Collection
list Orm{tableName}List // 列表查询时候赋值
}
type Orm{tableName}List []*{tableName}
func (receiver *Orm{tableName}) Init() {
receiver.collection = provider.NewMongoProvider().GetBean("{database}").(*mongo.Database).Collection("{tableNameSnake}")
receiver.query = make(bson.M)
receiver.ctx = context.Background()
receiver.findOpt = options.Find()
}
func (receiver *Orm{tableName}) Collection() *mongo.Collection {
return receiver.collection
}
func NewOrm{tableName}() *Orm{tableName} {
obj := Orm{tableName}{}
obj.Init()
return &obj
}
func (receiver *Orm{tableName}) Where(key string, value interface{}) *Orm{tableName} {
if key == "id" {
receiver.query["_id"] = value
} else {
receiver.query[key] = value
}
return receiver
}
func (receiver *Orm{tableName}) Select(columns ...string) *Orm{tableName} {
if len(columns) == 1 && columns[0] != "*" {
columns = strings.Split(strings.ReplaceAll(columns[0], " ", ""), ",")
}
if len(columns) > 0 {
m := make(bson.M)
for _, column := range columns {
m[column] = 1
}
receiver.findOpt.SetProjection(m)
}
return receiver
}
func (receiver *Orm{tableName}) Create(data *{tableName}) (*{tableName}, error) {
{createdAt}if data.Id == "" {
data.Id = primitive.NewObjectID().String()
}
_, err := receiver.collection.InsertOne(receiver.ctx, data)
if err != nil {
return nil, err
}
return data, nil
}
func (receiver *Orm{tableName}) Updates(data map[string]interface{}) int64 {
{updatedAt}res, err := receiver.collection.UpdateMany(receiver.ctx, receiver.query, bson.M{"$set": data})
if err != nil {
log.Error("MongoOrm Updates错误" + err.Error())
return 0
}
return res.ModifiedCount
}
func (receiver *Orm{tableName}) Update(key string, value interface{}) int64 {
return receiver.Updates(map[string]interface{}{key: value})
}
func (receiver *Orm{tableName}) Delete() (int64, error) {
if receiver.query == nil || len(receiver.query) == 0 {
return 0, errors.New("MongoOrm Delete错误删除条件不能为空")
}
res, err := receiver.collection.DeleteMany(receiver.ctx, receiver.query)
if err != nil {
return 0, err
}
return res.DeletedCount, nil
}
func (receiver *Orm{tableName}) Limit(num int64) *Orm{tableName} {
receiver.findOpt.SetLimit(num)
return receiver
}
func (receiver *Orm{tableName}) Skin(num int64) *Orm{tableName} {
receiver.findOpt.SetSkip(num)
return receiver
}
func (receiver *Orm{tableName}) Order(order string) *Orm{tableName} {
arr := strings.Split(order, ",")
if len(arr) > 1 {
panic("官方mongo驱动暂时不支持多字段排序")
}
m := make(bson.M)
for _, item := range arr {
item = strings.Trim(item, " ")
strArr := strings.Split(item, " ")
if len(strArr) > 1 && strings.ToLower(strArr[1]) == "desc" {
m[strArr[0]] = -1
} else {
m[strArr[0]] = 1
}
}
receiver.findOpt.SetSort(m)
return receiver
}
func (receiver *Orm{tableName}) OrderDesc(column string) *Orm{tableName} {
receiver.findOpt.SetSort(bson.M{column: -1})
return receiver
}
func (receiver *Orm{tableName}) Total() int64 {
total, err := receiver.collection.CountDocuments(receiver.ctx, receiver.query)
if err != nil {
log.Error("MongoOrm Total错误" + err.Error())
return 0
}
return total
}
func (receiver *Orm{tableName}) Get(columns ...string) []*{tableName} {
if len(columns) > 0 {
receiver.Select(columns...)
}
if receiver.findOpt.Limit == nil {
receiver.Limit(1000)
}
cursor, err := receiver.Collection().Find(receiver.ctx, receiver.query, receiver.findOpt)
if err != nil {
log.Error("MongoOrm Get错误" + err.Error())
}
var data []*{tableName}
err = cursor.All(receiver.ctx, &data)
if err != nil {
log.Error("MongoOrm Get错误" + err.Error())
}
defer cursor.Close(receiver.ctx)
return data
}
func (receiver *Orm{tableName}) First(columns ...string) *{tableName} {
if len(columns) > 0 {
receiver.Select(columns...)
}
opt := &options.FindOneOptions{
Projection: receiver.findOpt.Projection,
Sort: receiver.findOpt.Sort,
}
if opt.Sort != nil {
opt.Sort = bson.M{"_id": 1}
}
var data *{tableName}
err := receiver.Collection().FindOne(receiver.ctx, receiver.query, opt).Decode(&data)
if err != nil {
log.Error("MongoOrm First错误" + err.Error())
}
return data
}
func (receiver *Orm{tableName}) Paginate(page int64, pageSize int64) ([]*{tableName}, int64) {
total := receiver.Total()
if total > 0 {
return receiver.SimplePaginate(page, pageSize), total
}
return nil, 0
}
func (receiver *Orm{tableName}) SimplePaginate(page int64, pageSize int64) []*{tableName} {
receiver.Limit(pageSize)
if page == 0 {
page = 1
}
if page > 1 {
receiver.Skin((page - 1) * pageSize)
}
return receiver.Get()
}
func (receiver *Orm{tableName}) Increment(column string, amount ...int) int64 {
num := 1
if len(amount) > 0 {
num = amount[0]
}
return receiver.Update("$inc", bson.M{column: num})
}
func (receiver *Orm{tableName}) Decrement(column string, amount ...int) int64 {
num := -1
if len(amount) > 0 {
num = -amount[0]
}
return receiver.Update("$inc", bson.M{column: num})
}
{where}

View File

@@ -9,6 +9,7 @@ var _BeanCommandSingle *BeanCommand
var _CurdCommandSingle *CurdCommand
var _DevCommandSingle *DevCommand
var _JsSingle *Js
var _MongoCommandSingle *MongoCommand
var _OrmCommandSingle *OrmCommand
var _ProtocCommandSingle *ProtocCommand
var _RouteCommandSingle *RouteCommand
@@ -20,6 +21,7 @@ func GetAllProvider() []interface{} {
NewCurdCommand(),
NewDevCommand(),
NewJs(),
NewMongoCommand(),
NewOrmCommand(),
NewProtocCommand(),
NewRouteCommand(),
@@ -55,6 +57,13 @@ func NewJs() *Js {
}
return _JsSingle
}
func NewMongoCommand() *MongoCommand {
if _MongoCommandSingle == nil {
_MongoCommandSingle = &MongoCommand{}
providers.AfterProvider(_MongoCommandSingle, "")
}
return _MongoCommandSingle
}
func NewOrmCommand() *OrmCommand {
if _OrmCommandSingle == nil {
_OrmCommandSingle = &OrmCommand{}

8
go.mod
View File

@@ -4,7 +4,7 @@ go 1.16
require (
github.com/ctfang/command v1.0.1
github.com/go-home-admin/home v0.0.3
github.com/go-home-admin/home v0.3.6
github.com/go-sql-driver/mysql v1.6.0
github.com/joho/godotenv v1.4.0
github.com/lib/pq v1.10.6
@@ -15,7 +15,11 @@ require (
require (
github.com/gin-gonic/gin v1.8.0 // indirect
github.com/go-playground/validator/v10 v10.11.0 // indirect
golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect
github.com/go-redis/redis/v8 v8.11.5 // indirect
github.com/sirupsen/logrus v1.8.1
go.mongodb.org/mongo-driver v1.10.1
golang.org/x/net v0.0.0-20220531201128-c960675eff93 // indirect
google.golang.org/protobuf v1.28.0
gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22
gorm.io/driver/mysql v1.3.4 // indirect
)

50
go.sum
View File

@@ -1,3 +1,4 @@
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
@@ -19,8 +20,8 @@ github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm
github.com/gin-gonic/gin v1.7.7/go.mod h1:axIBovoeJpVj8S3BwE0uPMTeReE4+AfFtqpqaZ1qq1U=
github.com/gin-gonic/gin v1.8.0 h1:4WFH5yycBMA3za5Hnl425yd9ymdw1XPm4666oab+hv4=
github.com/gin-gonic/gin v1.8.0/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk=
github.com/go-home-admin/home v0.0.3 h1:ioBzk1jDna7mIbDtBafYrqQubSEStvELIN2b7YUNS2g=
github.com/go-home-admin/home v0.0.3/go.mod h1:jT6EDGpkTBWfLOt14W2Gg462sqn1sleQknFYQAVb4Ro=
github.com/go-home-admin/home v0.3.6 h1:tk56T1DgdqTWcuOdT07N/SLojrAW5BhqSC02kdlNiVI=
github.com/go-home-admin/home v0.3.6/go.mod h1:51swp6MVnaZVT1ZfZlSWMGGTT7zuqI7NMd0mX6EEenw=
github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
@@ -34,6 +35,7 @@ github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXS
github.com/go-playground/validator/v10 v10.10.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU=
github.com/go-playground/validator/v10 v10.11.0 h1:0W+xRM511GY47Yy3bZUbJVitCNg2BOGlCyvTqsp/xIw=
github.com/go-playground/validator/v10 v10.11.0/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU=
github.com/go-redis/redis/v8 v8.11.0/go.mod h1:DLomh7y2e3ggQXQLd1YgmvIfecPJoFl7WU5SOQ/r06M=
github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI=
github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo=
github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
@@ -51,9 +53,12 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
@@ -68,9 +73,13 @@ github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg=
github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
github.com/jonboulle/clockwork v0.3.0 h1:9BSCMi8C+0qdApAp4auwX0RkLGUjs956h0EkuQymUhg=
github.com/jonboulle/clockwork v0.3.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc=
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
@@ -82,6 +91,12 @@ github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w=
github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc h1:RKf14vYWi2ttpEmkA4aQ3j4u9dStX2t4M8UM6qqNsG8=
github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is=
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible h1:Y6sqxHMyB1D2YSzWkLibYKgg+SwmyFU9dF2hn6MdTj4=
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible/go.mod h1:ZQnN8lSECaebrkQytbHj4xNgtg8CR7RYXnPok8e0EHA=
github.com/lestrrat-go/strftime v1.0.6 h1:CFGsDEt1pOpFNU+TJB0nhz9jl+K0hZSLE205AhTIGQQ=
github.com/lestrrat-go/strftime v1.0.6/go.mod h1:f7jQKgV5nnJpYgdEasS+/y7EsTb8ykN2z68n3TtcTaw=
github.com/lib/pq v1.10.6 h1:jbk+ZieJ0D7EVGJYpL9QTz7/YW6UHbmdnZWYyK5cdBs=
github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
@@ -93,23 +108,29 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0=
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
github.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg=
github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48=
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE=
github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs=
github.com/pelletier/go-toml/v2 v2.0.1 h1:8e3L2cCQzLFi2CR4g7vGFuFxX7Jl1kKX8gW+iV0GUKU=
github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/robfig/cron/v3 v3.0.0/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
@@ -129,27 +150,39 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo=
github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M=
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0=
github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY=
github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
github.com/xdg-go/scram v1.1.1 h1:VOMT+81stJgXW3CpHyqHN3AXDYIMsx56mEFrB37Mb/E=
github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g=
github.com/xdg-go/stringprep v1.0.3 h1:kdwGpVNwPFtjs98xCGkHjQtGKh86rDcRZN17QEMCOIs=
github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8=
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA=
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
go.mongodb.org/mongo-driver v1.10.1 h1:NujsPveKwHaWuKUer/ceo9DzEe7HIj1SlJ6uvXZG0S4=
go.mongodb.org/mongo-driver v1.10.1/go.mod h1:z4XpeoU6w+9Vht+jAFyLgVrD+jGSQQe0+CBWFHNiHt8=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM=
golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d h1:sK3txAijHtOK88l68nt020reeT1ZdKLIYetKl95FzVY=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
@@ -158,6 +191,8 @@ golang.org/x/net v0.0.0-20220531201128-c960675eff93/go.mod h1:XRhObCWvk6IyKnWLug
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -212,6 +247,8 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 h1:VpOs+IwYnYBaFnrNAeB8UUWtL3vEUnzSCL1nVjPhqrw=
gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
@@ -221,8 +258,9 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gorm.io/driver/mysql v1.3.2/go.mod h1:ChK6AHbHgDCFZyJp0F+BmVGb06PSIoh9uVYKAlRbb2U=
gorm.io/driver/mysql v1.3.4 h1:/KoBMgsUHC3bExsekDcmNYaBnfH2WNeFuXqqrqMc98Q=
gorm.io/driver/mysql v1.3.4/go.mod h1:s4Tq0KmD0yhPGHbZEwg1VPlH0vT/GBHJZorPzhcxBUE=