diff --git a/console/commands/mongo.go b/console/commands/mongo.go new file mode 100644 index 0000000..f882222 --- /dev/null +++ b/console/commands/mongo.go @@ -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 +} diff --git a/console/commands/mongo/orm.go.text b/console/commands/mongo/orm.go.text new file mode 100644 index 0000000..3805134 --- /dev/null +++ b/console/commands/mongo/orm.go.text @@ -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} \ No newline at end of file diff --git a/console/commands/z_inject_gen.go b/console/commands/z_inject_gen.go index 8b2493b..d1ea2ea 100644 --- a/console/commands/z_inject_gen.go +++ b/console/commands/z_inject_gen.go @@ -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{} diff --git a/go.mod b/go.mod index 11ed586..6deb1b2 100644 --- a/go.mod +++ b/go.mod @@ -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 ) diff --git a/go.sum b/go.sum index 9a45499..ad0964e 100644 --- a/go.sum +++ b/go.sum @@ -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=