diff --git a/apis/process/classify.go b/apis/process/classify.go new file mode 100644 index 00000000..397d7e55 --- /dev/null +++ b/apis/process/classify.go @@ -0,0 +1,120 @@ +package process + +import ( + "errors" + "ferry/global/orm" + process2 "ferry/models/process" + "ferry/pkg/pagination" + "ferry/tools" + "ferry/tools/app" + + "github.com/gin-gonic/gin" +) + +/* + @Author : lanyulei +*/ + +// 创建流程分类 +func CreateClassify(c *gin.Context) { + var ( + err error + classifyValue process2.Classify + classifyCount int + ) + + err = c.ShouldBind(&classifyValue) + if err != nil { + tools.HasError(err, "", -1) + } + + // 判断创建的分类是否存在 + err = orm.Eloquent.Table("process_classify"). + Where("name = ?", classifyValue.Name). + Count(&classifyCount).Error + if err != nil { + tools.HasError(err, "创建的分类名称已经存在,请修改", -1) + } + if classifyCount > 0 { + tools.HasError(err, "", -1) + } + + classifyValue.Creator = tools.GetUserId(c) + + err = orm.Eloquent.Table("process_classify").Create(&classifyValue).Error + if err != nil { + tools.HasError(err, "", -1) + } + + app.OK(c, "", "创建流程分类成功") +} + +// 流程分类列表 +func ClassifyList(c *gin.Context) { + type classifyValue struct { + process2.Classify + CreateUser string `json:"create_user"` + CreateName string `json:"create_name"` + } + + var ( + err error + classifyList []*classifyValue + ) + + SearchParams := map[string]map[string]interface{}{ + "like": pagination.RequestParams(c), + } + + db := orm.Eloquent.Model(&process2.Classify{}).Joins("left join sys_user on sys_user.user_id = process_classify.creator"). + Select("process_classify.*, sys_user.username as create_user, sys_user.nick_name as create_name"). + Where("process_classify.`delete_time` IS NULL") + + result, err := pagination.Paging(&pagination.Param{ + C: c, + DB: db, + }, &classifyList, SearchParams, "process_classify") + + if err != nil { + tools.HasError(err, "", -1) + } + app.OK(c, result, "获取分类列表成功") +} + +// 更新流程分类 +func UpdateClassify(c *gin.Context) { + var ( + err error + classifyValue process2.Classify + ) + + err = c.ShouldBind(&classifyValue) + if err != nil { + tools.HasError(err, "", -1) + } + + // 更新 + err = orm.Eloquent.Model(&classifyValue). + Where("id = ?", classifyValue.Id). + Update("name", classifyValue.Name).Error + if err != nil { + tools.HasError(err, "", -1) + } + + app.OK(c, classifyValue, "流程分类更新成功") +} + +// 删除流程分类 +func DeleteClassify(c *gin.Context) { + classifyId := c.DefaultQuery("classifyId", "") + if classifyId == "" { + tools.HasError(errors.New("参数传递失败,请确认classifyId是否传递"), "", -1) + } + + err := orm.Eloquent.Delete(process2.Classify{}, "id = ?", classifyId).Error + if err != nil { + tools.HasError(err, "", -1) + } + + app.OK(c, "", "流程分类删除成功") +} diff --git a/apis/process/process.go b/apis/process/process.go new file mode 100644 index 00000000..1a032872 --- /dev/null +++ b/apis/process/process.go @@ -0,0 +1,208 @@ +package process + +//import ( +// process2 "ferry/models/process" +// "ferry/pkg/connection" +// "ferry/pkg/pagination" +// "ferry/pkg/response/code" +// "fmt" +// +// "github.com/gin-gonic/gin" +//) +// +///* +// @Author : lanyulei +//*/ +// +//// 流程列表 +//func ProcessList(c *gin.Context) { +// type processValue struct { +// process2.Info +// CreateUser string `json:"create_user"` +// CreateName string `json:"create_name"` +// ClassifyName string `json:"classify_name"` +// } +// +// var ( +// err error +// processList []*processValue +// ) +// +// SearchParams := map[string]map[string]interface{}{ +// "like": pagination.RequestParams(c), +// } +// +// db := connection.DB.Self. +// Model(&process2.Info{}). +// Joins("left join user_info on user_info.id = process_info.creator"). +// Joins("left join process_classify on process_classify.id = process_info.classify"). +// Select("process_info.id, process_info.create_time, process_info.update_time, process_info.name, process_info.creator, process_classify.name as classify_name, user_info.username as create_user, user_info.nickname as create_name"). +// Where("process_info.`delete_time` IS NULL") +// +// result, err := pagination.Paging(&pagination.Param{ +// C: c, +// DB: db, +// }, &processList, SearchParams, "process_info") +// +// if err != nil { +// Response(c, code.SelectError, nil, fmt.Sprintf("查询流程列表失败,%v", err.Error())) +// return +// } +// Response(c, nil, result, "") +//} +// +//// 创建流程 +//func CreateProcess(c *gin.Context) { +// var ( +// err error +// processValue process2.Info +// processCount int +// ) +// +// err = c.ShouldBind(&processValue) +// if err != nil { +// Response(c, code.BindError, nil, err.Error()) +// return +// } +// +// // 确定修改的分类是否存在 +// err = connection.DB.Self.Model(&processValue). +// Where("name = ?", processValue.Name). +// Count(&processCount).Error +// if err != nil { +// Response(c, code.SelectError, nil, fmt.Sprintf("查询流程数量失败,%v", err.Error())) +// return +// } +// if processCount > 0 { +// Response(c, code.InternalServerError, nil, "流程名称出现重复,请换一个名称") +// return +// } +// +// processValue.Creator = c.GetInt("userId") +// +// err = connection.DB.Self.Create(&processValue).Error +// if err != nil { +// Response(c, code.CreateError, nil, fmt.Sprintf("创建流程失败,%v", err.Error())) +// return +// } +// +// Response(c, nil, nil, "") +//} +// +//// 更新流程 +//func UpdateProcess(c *gin.Context) { +// var ( +// err error +// processValue process2.Info +// ) +// +// err = c.ShouldBind(&processValue) +// if err != nil { +// Response(c, code.BindError, nil, err.Error()) +// return +// } +// +// err = connection.DB.Self.Model(&process2.Info{}). +// Where("id = ?", processValue.Id). +// Updates(map[string]interface{}{ +// "name": processValue.Name, +// "structure": processValue.Structure, +// "tpls": processValue.Tpls, +// "classify": processValue.Classify, +// "task": processValue.Task, +// }).Error +// if err != nil { +// Response(c, code.UpdateError, nil, fmt.Sprintf("更新流程信息失败,%v", err.Error())) +// return +// } +// +// Response(c, nil, nil, "") +//} +// +//// 删除流程 +//func DeleteProcess(c *gin.Context) { +// processId := c.DefaultQuery("processId", "") +// if processId == "" { +// Response(c, code.InternalServerError, nil, "参数不正确,请确定参数processId是否传递") +// return +// } +// +// err := connection.DB.Self.Delete(process2.Info{}, "id = ?", processId).Error +// if err != nil { +// Response(c, code.DeleteError, nil, fmt.Sprintf("删除流程失败, %v", err.Error())) +// return +// } +// Response(c, nil, nil, "") +//} +// +//// 流程详情 +//func ProcessDetails(c *gin.Context) { +// processId := c.DefaultQuery("processId", "") +// if processId == "" { +// Response(c, code.InternalServerError, nil, "参数不正确,请确定参数processId是否传递") +// return +// } +// +// var processValue process2.Info +// err := connection.DB.Self.Model(&processValue). +// Where("id = ?", processId). +// Find(&processValue).Error +// if err != nil { +// Response(c, code.SelectError, nil, fmt.Sprintf("查询流程详情失败, %v", err.Error())) +// return +// } +// +// Response(c, nil, processValue, "") +//} +// +//// 分类流程列表 +//func ClassifyProcessList(c *gin.Context) { +// type classifyProcess struct { +// process2.Classify +// ProcessList []*process2.Info `json:"process_list"` +// } +// +// var ( +// err error +// classifyList []*classifyProcess +// ) +// +// processName := c.DefaultQuery("name", "") +// if processName == "" { +// err = connection.DB.Self.Model(&process2.Classify{}).Find(&classifyList).Error +// if err != nil { +// Response(c, code.SelectError, nil, fmt.Sprintf("获取分类列表失败,%v", err.Error())) +// return +// } +// } else { +// var classifyIdList []int +// err = connection.DB.Self.Model(&process2.Info{}). +// Where("name LIKE ?", fmt.Sprintf("%%%v%%", processName)). +// Pluck("distinct classify", &classifyIdList).Error +// if err != nil { +// Response(c, code.SelectError, nil, fmt.Sprintf("获取分类失败,%v", err.Error())) +// return +// } +// +// err = connection.DB.Self.Model(&process2.Classify{}). +// Where("id in (?)", classifyIdList). +// Find(&classifyList).Error +// if err != nil { +// Response(c, code.SelectError, nil, fmt.Sprintf("获取分类失败,%v", err.Error())) +// return +// } +// } +// +// for _, item := range classifyList { +// err = connection.DB.Self.Model(&process2.Info{}). +// Where("classify = ?", item.Id). +// Select("id, create_time, update_time, name"). +// Find(&item.ProcessList).Error +// if err != nil { +// Response(c, code.SelectError, nil, fmt.Sprintf("获取流程失败,%v", err.Error())) +// return +// } +// } +// +// Response(c, nil, classifyList, "") +//} diff --git a/apis/process/task.go b/apis/process/task.go new file mode 100644 index 00000000..6c80c4e5 --- /dev/null +++ b/apis/process/task.go @@ -0,0 +1,230 @@ +package process + +//import ( +// "ferry/pkg/pagination" +// "ferry/pkg/response/code" +// . "ferry/pkg/response/response" +// "fmt" +// "io/ioutil" +// "os" +// "strings" +// +// "github.com/gin-gonic/gin" +// uuid "github.com/satori/go.uuid" +// "github.com/spf13/viper" +//) +// +///* +// @Author : lanyulei +//*/ +// +//// 任务列表 +//func TaskList(c *gin.Context) { +// var ( +// err error +// pageValue pagination.ListRequest +// taskName string +// taskData []map[string]interface{} +// total_count int +// ) +// taskName = c.DefaultQuery("name", "") +// +// err = c.ShouldBind(&pageValue) +// if err != nil { +// Response(c, code.BindError, nil, err.Error()) +// return +// } +// +// getFileDetails := func(fn string) map[string]interface{} { +// file := make(map[string]interface{}) +// fileClassify := strings.Split(fn, ".") +// fileDetails := strings.Split(fileClassify[0], "-") +// switch fileClassify[1] { +// case "py": +// file["classify"] = "Python" +// case "sh": +// file["classify"] = "Shell" +// default: +// file["classify"] = "Other" +// } +// if len(fileDetails) == 3 { +// file["name"] = fileDetails[0] +// file["uuid"] = fileDetails[1] +// file["creator"] = fileDetails[2] +// } +// file["full_name"] = fn +// return file +// } +// files, _ := ioutil.ReadDir(viper.GetString("script.path")) +// var endIndex int +// if taskName != "" { +// for _, f := range files { +// if strings.Contains(strings.Split(f.Name(), "-")[0], taskName) { +// taskData = append(taskData, getFileDetails(f.Name())) +// } +// } +// total_count = len(taskData) +// if pageValue.Page*pageValue.PerPage > len(taskData) { +// endIndex = len(taskData) +// } else { +// endIndex = pageValue.Page * pageValue.PerPage +// } +// taskData = taskData[(pageValue.Page-1)*pageValue.PerPage : endIndex] +// } else { +// if pageValue.Page*pageValue.PerPage > len(files) { +// endIndex = len(files) +// } else { +// endIndex = pageValue.Page * pageValue.PerPage +// } +// for _, f := range files[(pageValue.Page-1)*pageValue.PerPage : endIndex] { +// taskData = append(taskData, getFileDetails(f.Name())) +// } +// total_count = len(files) +// } +// +// Response(c, nil, map[string]interface{}{ +// "data": taskData, +// "page": pageValue.Page, +// "per_page": pageValue.PerPage, +// "total_count": total_count, +// }, "") +//} +// +//// 创建任务 +//func CreateTask(c *gin.Context) { +// type Task struct { +// Name string `json:"name"` +// Classify string `json:"classify"` +// Content string `json:"content"` +// } +// +// var ( +// err error +// taskValue Task +// ) +// +// err = c.ShouldBind(&taskValue) +// if err != nil { +// Response(c, code.BindError, nil, err.Error()) +// return +// } +// +// uuidValue := uuid.Must(uuid.NewV4(), err) +// fileName := fmt.Sprintf("%v/%v-%v-%v", +// viper.GetString("script.path"), +// taskValue.Name, +// strings.Split(uuidValue.String(), "-")[4], +// c.GetString("username"), +// ) +// if taskValue.Classify == "python" { +// fileName = fileName + ".py" +// } else if taskValue.Classify == "shell" { +// fileName = fileName + ".sh" +// } +// +// err = ioutil.WriteFile(fileName, []byte(taskValue.Content), 0666) +// if err != nil { +// Response(c, code.BindError, nil, fmt.Sprintf("创建任务脚本失败: %v", err.Error())) +// return +// } +// +// Response(c, nil, nil, "") +//} +// +//// 更新任务 +//func UpdateTask(c *gin.Context) { +// type fileDetails struct { +// Name string `json:"name"` +// FullName string `json:"full_name"` +// Classify string `json:"classify"` +// Content string `json:"content"` +// } +// +// var ( +// err error +// file fileDetails +// ) +// +// err = c.ShouldBind(&file) +// if err != nil { +// Response(c, code.BindError, nil, "") +// return +// } +// +// fullNameList := strings.Split(file.FullName, "-") +// if fullNameList[0] != file.Name { +// fullNameList[0] = file.Name +// } +// var suffixName string +// if strings.ToLower(file.Classify) == "python" { +// suffixName = ".py" +// } else if strings.ToLower(file.Classify) == "shell" { +// suffixName = ".sh" +// } +// +// if fullNameList[len(fullNameList)-1][len(fullNameList[len(fullNameList)-1])-3:len(fullNameList[len(fullNameList)-1])] != suffixName { +// tList := strings.Split(fullNameList[len(fullNameList)-1], ".") +// tList[len(tList)-1] = suffixName[1:len(suffixName)] +// fullNameList[len(fullNameList)-1] = strings.Join(tList, ".") +// } +// +// fileFullName := strings.Join(fullNameList, "-") +// +// // 修改文件内容 +// err = ioutil.WriteFile(fmt.Sprintf("%v/%v", viper.GetString("script.path"), fileFullName), []byte(file.Content), 0666) +// if err != nil { +// Response(c, code.BindError, nil, fmt.Sprintf("更新脚本文件失败,%v", err.Error())) +// return +// } +// +// // 修改文件名称 +// err = os.Rename( +// fmt.Sprintf("%v/%v", viper.GetString("script.path"), file.FullName), +// fmt.Sprintf("%v/%v", viper.GetString("script.path"), fileFullName), +// ) +// if err != nil { +// Response(c, code.BindError, nil, fmt.Sprintf("更改脚本文件名称失败,%v", err.Error())) +// return +// } +// +// Response(c, nil, nil, "") +//} +// +//// 删除任务 +//func DeleteTask(c *gin.Context) { +// fullName := c.DefaultQuery("full_name", "") +// if fullName == "" { +// Response(c, code.InternalServerError, nil, "参数不正确,请确定参数full_name是否传递") +// return +// } +// +// err := os.Remove(fmt.Sprintf("%v/%v", viper.GetString("script.path"), fullName)) +// if err != nil { +// Response(c, code.DeleteError, nil, fmt.Sprintf("删除文件失败,%v", err.Error())) +// return +// } +// +// Response(c, nil, nil, "") +//} +// +//// 任务详情 +//func TaskDetails(c *gin.Context) { +// var ( +// err error +// fileName string +// content []byte +// ) +// +// fileName = c.DefaultQuery("file_name", "") +// if fileName == "" { +// Response(c, code.ParamError, nil, "参数不正确,请确认file_name参数是否存在") +// return +// } +// +// content, err = ioutil.ReadFile(fmt.Sprintf("%v/%v", viper.GetString("script.path"), fileName)) +// if err != nil { +// return +// } +// +// Response(c, nil, string(content), "") +//} diff --git a/apis/process/tpl.go b/apis/process/tpl.go new file mode 100644 index 00000000..4053c6c3 --- /dev/null +++ b/apis/process/tpl.go @@ -0,0 +1,154 @@ +package process + +//import ( +// "ferry/models/tpl" +// "ferry/pkg/connection" +// "ferry/pkg/pagination" +// "ferry/pkg/response/code" +// . "ferry/pkg/response/response" +// "fmt" +// +// "github.com/gin-gonic/gin" +//) +// +///* +// @Author : lanyulei +//*/ +// +//// 模板列表 +//func TemplateList(c *gin.Context) { +// type templateUserValue struct { +// tpl.Info +// CreateUser string `json:"create_user"` +// CreateName string `json:"create_name"` +// } +// +// var ( +// err error +// templateList []*templateUserValue +// ) +// +// SearchParams := map[string]map[string]interface{}{ +// "like": pagination.RequestParams(c), +// } +// +// db := connection.DB.Self.Model(&tpl.Info{}).Joins("left join user_info on user_info.id = tpl_info.creator"). +// Select("tpl_info.id, tpl_info.create_time, tpl_info.update_time, tpl_info.`name`, tpl_info.`creator`, user_info.username as create_user, user_info.nickname as create_name").Where("tpl_info.`delete_time` IS NULL") +// +// result, err := pagination.Paging(&pagination.Param{ +// C: c, +// DB: db, +// }, &templateList, SearchParams, "tpl_info") +// +// if err != nil { +// Response(c, code.SelectError, nil, fmt.Sprintf("查询模版失败,%v", err.Error())) +// return +// } +// +// Response(c, nil, result, "") +//} +// +//// 创建模版 +//func CreateTemplate(c *gin.Context) { +// var ( +// err error +// templateValue tpl.Info +// templateCount int +// ) +// +// err = c.ShouldBind(&templateValue) +// if err != nil { +// Response(c, code.BindError, nil, err.Error()) +// return +// } +// +// // 确定修改的分类是否存在 +// err = connection.DB.Self.Model(&templateValue). +// Where("name = ?", templateValue.Name). +// Count(&templateCount).Error +// if err != nil { +// Response(c, code.SelectError, nil, fmt.Sprintf("查询模版数量失败,%v", err.Error())) +// return +// } +// if templateCount > 0 { +// Response(c, code.InternalServerError, nil, "模版名称出现重复,请换一个名称") +// return +// } +// +// templateValue.Creator = c.GetInt("userId") // 当前登陆用户ID +// err = connection.DB.Self.Create(&templateValue).Error +// if err != nil { +// Response(c, code.CreateError, nil, fmt.Sprintf("创建模板失败,%v", err.Error())) +// return +// } +// +// Response(c, nil, nil, "") +//} +// +//// 模版详情 +//func TemplateDetails(c *gin.Context) { +// var ( +// err error +// templateDetailsValue tpl.Info +// ) +// +// templateId := c.DefaultQuery("template_id", "") +// if templateId == "" { +// Response(c, code.ParamError, nil, fmt.Sprintf("参数不正确,请确认template_id是否传递")) +// return +// } +// +// err = connection.DB.Self.Model(&templateDetailsValue).Where("id = ?", templateId).Find(&templateDetailsValue).Error +// if err != nil { +// Response(c, code.SelectError, nil, fmt.Sprintf("查询模版数据失败,%v", err.Error())) +// return +// } +// +// Response(c, nil, templateDetailsValue, "") +//} +// +//// 更新模版 +//func UpdateTemplate(c *gin.Context) { +// var ( +// err error +// templateValue tpl.Info +// ) +// err = c.ShouldBind(&templateValue) +// if err != nil { +// Response(c, code.BindError, nil, fmt.Sprintf("参数绑定失败,%v", err.Error())) +// return +// } +// +// err = connection.DB.Self.Model(&templateValue).Where("id = ?", templateValue.Id).Updates(map[string]interface{}{ +// "name": templateValue.Name, +// "remarks": templateValue.Remarks, +// "form_structure": templateValue.FormStructure, +// }).Error +// if err != nil { +// Response(c, code.UpdateError, nil, fmt.Sprintf("更新模版失败,%v", err.Error())) +// return +// } +// +// Response(c, nil, templateValue, "") +//} +// +//// 删除模版 +//func DeleteTemplate(c *gin.Context) { +// var ( +// err error +// ) +// +// templateId := c.DefaultQuery("template_id", "") +// if templateId == "" { +// Response(c, code.ParamError, nil, fmt.Sprintf("参数不正确,请确认template_id是否传递")) +// return +// } +// +// err = connection.DB.Self.Delete(tpl.Info{}, "id = ?", templateId).Error +// if err != nil { +// Response(c, code.DeleteError, nil, fmt.Sprintf("模版删除失败,%v", err.Error())) +// return +// } +// +// Response(c, nil, nil, "") +//} diff --git a/apis/process/workOrder.go b/apis/process/workOrder.go new file mode 100644 index 00000000..b2cec85f --- /dev/null +++ b/apis/process/workOrder.go @@ -0,0 +1,400 @@ +package process + +//import ( +// "encoding/json" +// "errors" +// "ferry/models/user" +// "ferry/models/workOrder" +// "ferry/pkg/connection" +// "ferry/pkg/response/code" +// . "ferry/pkg/response/response" +// "ferry/pkg/service" +// "fmt" +// "strconv" +// +// "github.com/gin-gonic/gin" +//) +// +///* +// @Author : lanyulei +//*/ +// +//// 流程结构包括节点,流转和模版 +//func ProcessStructure(c *gin.Context) { +// processId := c.DefaultQuery("processId", "") +// if processId == "" { +// Response(c, code.InternalServerError, nil, "参数不正确,请确定参数processId是否传递") +// return +// } +// workOrderId := c.DefaultQuery("workOrderId", "0") +// if processId == "" { +// Response(c, code.InternalServerError, nil, "参数不正确,请确定参数processId是否传递") +// return +// } +// workOrderIdInt, _ := strconv.Atoi(workOrderId) +// processIdInt, _ := strconv.Atoi(processId) +// result, err := service.ProcessStructure(c, processIdInt, workOrderIdInt) +// if err != nil { +// Response(c, code.SelectError, nil, err.Error()) +// return +// } +// +// if workOrderIdInt != 0 { +// currentState := result["workOrder"].(service.WorkOrderData).CurrentState +// userAuthority, err := service.JudgeUserAuthority(c, workOrderIdInt, currentState) +// if err != nil { +// Response(c, code.InternalServerError, nil, fmt.Sprintf("判断用户是否有权限失败,%v", err.Error())) +// return +// } +// result["userAuthority"] = userAuthority +// } +// +// Response(c, nil, result, "") +//} +// +//// 新建工单 +//func CreateWorkOrder(c *gin.Context) { +// var workOrderValue struct { +// workOrder.Info +// Tpls map[string][]interface{} `json:"tpls"` +// SourceState string `json:"source_state"` +// Tasks json.RawMessage `json:"tasks"` +// Source string `json:"source"` +// } +// +// err := c.ShouldBind(&workOrderValue) +// if err != nil { +// Response(c, code.BindError, nil, err.Error()) +// return +// } +// +// relatedPerson, err := json.Marshal([]int{c.GetInt("userId")}) +// if err != nil { +// Response(c, code.BindError, nil, err.Error()) +// return +// } +// +// // 创建工单数据 +// tx := connection.DB.Self.Begin() +// var workOrderInfo = workOrder.Info{ +// Title: workOrderValue.Title, +// Process: workOrderValue.Process, +// Classify: workOrderValue.Classify, +// State: workOrderValue.State, +// RelatedPerson: relatedPerson, +// Creator: c.GetInt("userId"), +// } +// err = tx.Create(&workOrderInfo).Error +// if err != nil { +// tx.Rollback() +// Response(c, code.CreateError, nil, fmt.Sprintf("创建工单失败,%v", err.Error())) +// return +// } +// +// // 创建工单模版关联数据 +// for i := 0; i < len(workOrderValue.Tpls["form_structure"]); i++ { +// formDataJson, err := json.Marshal(workOrderValue.Tpls["form_data"][i]) +// if err != nil { +// tx.Rollback() +// Response(c, code.InternalServerError, nil, fmt.Sprintf("生成json字符串错误,%v", err.Error())) +// return +// } +// formStructureJson, err := json.Marshal(workOrderValue.Tpls["form_structure"][i]) +// if err != nil { +// tx.Rollback() +// Response(c, code.InternalServerError, nil, fmt.Sprintf("生成json字符串错误,%v", err.Error())) +// return +// } +// +// formData := workOrder.TplData{ +// WorkOrder: workOrderInfo.Id, +// FormStructure: formStructureJson, +// FormData: formDataJson, +// } +// +// err = tx.Create(&formData).Error +// if err != nil { +// tx.Rollback() +// Response(c, code.CreateError, nil, fmt.Sprintf("创建工单模版关联数据失败,%v", err.Error())) +// return +// } +// } +// +// // 获取当前用户信息 +// var userInfo user.Info +// err = tx.Model(&user.Info{}).Where("id = ?", c.GetInt("userId")).Find(&userInfo).Error +// if err != nil { +// tx.Rollback() +// Response(c, code.SelectError, nil, fmt.Sprintf("查询用户信息失败,%v", err.Error())) +// return +// } +// +// nameValue := userInfo.Nickname +// if nameValue == "" { +// nameValue = userInfo.Username +// } +// +// // 创建历史记录 +// var stateList []map[string]interface{} +// err = json.Unmarshal(workOrderInfo.State, &stateList) +// if err != nil { +// tx.Rollback() +// Response(c, code.InternalServerError, nil, fmt.Sprintf("Json序列化失败,%v", err.Error())) +// return +// } +// err = tx.Create(&workOrder.CirculationHistory{ +// Title: workOrderValue.Title, +// WorkOrder: workOrderInfo.Id, +// State: workOrderValue.SourceState, +// Source: workOrderValue.Source, +// Target: stateList[0]["id"].(string), +// Circulation: "新建", +// Processor: nameValue, +// ProcessorId: userInfo.Id, +// }).Error +// if err != nil { +// tx.Rollback() +// err = fmt.Errorf("新建历史记录失败,%v", err.Error()) +// return +// } +// +// tx.Commit() +// +// // 执行任务 +// var taskList []string +// err = json.Unmarshal(workOrderValue.Tasks, &taskList) +// if err != nil { +// Response(c, code.InternalServerError, nil, err.Error()) +// return +// } +// go service.ExecTask(taskList) +// +// Response(c, nil, nil, "") +//} +// +//// 工单列表 +//func WorkOrderList(c *gin.Context) { +// /* +// 1. 待办工单 +// 2. 我创建的 +// 3. 我相关的 +// 4. 所有工单 +// */ +// +// var ( +// result interface{} +// err error +// classifyInt int +// ) +// +// classify := c.DefaultQuery("classify", "0") +// if classify == "" { +// Response(c, code.ParamError, nil, "参数错误,请确认classify是否传递") +// return +// } +// +// classifyInt, _ = strconv.Atoi(classify) +// result, err = service.WorkOrderList(c, classifyInt) +// if err != nil { +// Response(c, code.SelectError, nil, fmt.Sprintf("查询工单数据失败,%v", err.Error())) +// return +// } +// +// Response(c, nil, result, "") +//} +// +//// 处理工单 +//func ProcessWorkOrder(c *gin.Context) { +// var ( +// err error +// userAuthority bool +// handle service.Handle +// params struct { +// Tasks []string +// TargetState string `json:"target_state"` // 目标状态 +// SourceState string `json:"source_state"` // 源状态 +// WorkOrderId int `json:"work_order_id"` // 工单ID +// Circulation string `json:"circulation"` // 流转ID +// FlowProperties int `json:"flow_properties"` // 流转类型 0 拒绝,1 同意,2 其他 +// } +// ) +// +// err = c.ShouldBind(¶ms) +// if err != nil { +// Response(c, code.BindError, nil, err.Error()) +// return +// } +// +// // 处理工单 +// userAuthority, err = service.JudgeUserAuthority(c, params.WorkOrderId, params.SourceState) +// if err != nil { +// Response(c, code.InternalServerError, nil, fmt.Sprintf("判断用户是否有权限失败,%v", err.Error())) +// return +// } +// if !userAuthority { +// err = errors.New("当前用户没有权限进行此操作") +// return +// } +// +// err = handle.HandleWorkOrder( +// c, +// params.WorkOrderId, // 工单ID +// params.Tasks, // 任务列表 +// params.TargetState, // 目标节点 +// params.SourceState, // 源节点 +// params.Circulation, // 流转标题 +// params.FlowProperties, // 流转属性 +// ) +// if err != nil { +// Response(c, code.InternalServerError, nil, fmt.Sprintf("处理工单失败,%v", err.Error())) +// return +// } +// +// Response(c, nil, nil, "") +//} +// +//// 结束工单 +//func UnityWorkOrder(c *gin.Context) { +// var ( +// err error +// workOrderId string +// workOrderInfo workOrder.Info +// ) +// +// workOrderId = c.DefaultQuery("work_oroder_id", "") +// if workOrderId == "" { +// Response(c, code.InternalServerError, nil, "参数不正确,work_oroder_id") +// return +// } +// +// tx := connection.DB.Self.Begin() +// +// // 查询工单信息 +// err = connection.DB.Self.Model(&workOrderInfo). +// Where("id = ?", workOrderId). +// Find(&workOrderInfo).Error +// if err != nil { +// Response(c, code.SelectError, nil, fmt.Sprintf("查询工单失败,%v", err.Error())) +// return +// } +// if workOrderInfo.IsEnd == 1 { +// Response(c, code.UpdateError, nil, "工单已结束") +// return +// } +// +// // 更新工单状态 +// err = tx.Model(&workOrder.Info{}). +// Where("id = ?", workOrderId). +// Update("is_end", 1). +// Error +// if err != nil { +// tx.Rollback() +// Response(c, code.UpdateError, nil, fmt.Sprintf("结束工单失败,%v", err.Error())) +// return +// } +// +// // 写入历史 +// tx.Create(&workOrder.CirculationHistory{ +// Title: workOrderInfo.Title, +// WorkOrder: workOrderInfo.Id, +// State: "结束工单", +// Circulation: "结束", +// Processor: c.GetString("nickname"), +// ProcessorId: c.GetInt("userId"), +// Remarks: "手动结束工单。", +// }) +// +// tx.Commit() +// +// Response(c, nil, nil, "") +//} +// +//// 转交工单 +//func InversionWorkOrder(c *gin.Context) { +// var ( +// err error +// workOrderInfo workOrder.Info +// stateList []map[string]interface{} +// stateValue []byte +// currentState map[string]interface{} +// userInfo user.Info +// params struct { +// WorkOrderId int `json:"work_order_id"` +// NodeId string `json:"node_id"` +// UserId int `json:"user_id"` +// Remarks string `json:"remarks"` +// } +// ) +// +// err = c.ShouldBind(¶ms) +// if err != nil { +// Response(c, code.BindError, nil, err.Error()) +// return +// } +// +// // 查询工单信息 +// err = connection.DB.Self.Model(&workOrderInfo). +// Where("id = ?", params.WorkOrderId). +// Find(&workOrderInfo).Error +// if err != nil { +// Response(c, code.SelectError, nil, fmt.Sprintf("查询工单信息失败,%v", err.Error())) +// return +// } +// +// // 序列化节点数据 +// err = json.Unmarshal(workOrderInfo.State, &stateList) +// if err != nil { +// Response(c, code.InternalServerError, nil, fmt.Sprintf("节点数据反序列化失败,%v", err.Error())) +// return +// } +// +// for _, s := range stateList { +// if s["id"].(string) == params.NodeId { +// s["processor"] = []interface{}{params.UserId} +// s["process_method"] = "person" +// currentState = s +// break +// } +// } +// +// stateValue, err = json.Marshal(stateList) +// if err != nil { +// Response(c, code.InternalServerError, nil, fmt.Sprintf("节点数据序列化失败,%v", err.Error())) +// return +// } +// +// tx := connection.DB.Self.Begin() +// +// // 更新数据 +// err = tx.Model(&workOrder.Info{}). +// Where("id = ?", params.WorkOrderId). +// Update("state", stateValue).Error +// if err != nil { +// Response(c, code.UpdateError, nil, fmt.Sprintf("更新节点信息失败,%v", err.Error())) +// return +// } +// +// // 查询用户信息 +// err = connection.DB.Self.Model(&user.Info{}). +// Where("id = ?", params.UserId). +// Find(&userInfo).Error +// if err != nil { +// Response(c, code.SelectError, nil, fmt.Sprintf("查询用户信息失败,%v", err.Error())) +// return +// } +// +// // 添加转交历史 +// tx.Create(&workOrder.CirculationHistory{ +// Title: workOrderInfo.Title, +// WorkOrder: workOrderInfo.Id, +// State: currentState["label"].(string), +// Circulation: "转交", +// Processor: c.GetString("nickname"), +// ProcessorId: c.GetInt("userId"), +// Remarks: fmt.Sprintf("此阶段负责人已转交给《%v》", userInfo.Nickname), +// }) +// +// tx.Commit() +// +// Response(c, nil, nil, "") +//} diff --git a/apis/system/role.go b/apis/system/role.go index ae0131c6..a71e299d 100644 --- a/apis/system/role.go +++ b/apis/system/role.go @@ -4,7 +4,6 @@ import ( "ferry/models/system" "ferry/tools" "ferry/tools/app" - "fmt" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" @@ -100,9 +99,6 @@ func UpdateRole(c *gin.Context) { var data system.SysRole data.UpdateBy = tools.GetUserIdStr(c) err := c.Bind(&data) - fmt.Println("--------------------------") - fmt.Println(err) - fmt.Println("--------------------------") tools.HasError(err, "数据解析失败", -1) result, err := data.Update(data.RoleId) tools.HasError(err, "", -1) diff --git a/cmd/migrate/server.go b/cmd/migrate/server.go index 31417364..109b9da9 100644 --- a/cmd/migrate/server.go +++ b/cmd/migrate/server.go @@ -4,7 +4,6 @@ import ( "ferry/database" "ferry/global/orm" "ferry/models/gorm" - "ferry/models/system" "ferry/tools" config2 "ferry/tools/config" "fmt" @@ -44,9 +43,9 @@ func run() { _ = migrateModel() log.Println("数据库结构初始化成功!") //5. 数据初始化完成 - if err := system.InitDb(); err != nil { - log.Fatal("数据库基础数据初始化失败!") - } + //if err := system.InitDb(); err != nil { + // log.Fatal("数据库基础数据初始化失败!") + //} usage = `数据库基础数据初始化成功` fmt.Println(usage) diff --git a/go.mod b/go.mod index cb2b3c74..440bcaa2 100644 --- a/go.mod +++ b/go.mod @@ -3,18 +3,19 @@ module ferry go 1.14 require ( + github.com/RichardKnop/machinery v1.8.8 github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d // indirect github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 github.com/casbin/casbin/v2 v2.2.1 github.com/casbin/gorm-adapter/v2 v2.0.3 github.com/dgrijalva/jwt-go v3.2.0+incompatible - github.com/gin-gonic/gin v1.4.0 + github.com/gin-contrib/cors v1.3.1 + github.com/gin-gonic/gin v1.5.0 github.com/go-kit/kit v0.8.0 github.com/go-ole/go-ole v1.2.4 // indirect github.com/go-openapi/spec v0.19.7 // indirect github.com/go-openapi/swag v0.19.8 // indirect - github.com/go-sql-driver/mysql v1.4.1 - github.com/golang/protobuf v1.3.2 // indirect + github.com/go-sql-driver/mysql v1.5.0 github.com/google/uuid v1.1.1 github.com/jinzhu/gorm v1.9.10 github.com/json-iterator/go v1.1.8 // indirect @@ -22,20 +23,17 @@ require ( github.com/mattn/go-isatty v0.0.10 // indirect github.com/mojocn/base64Captcha v1.3.1 github.com/mssola/user_agent v0.5.1 - github.com/pkg/errors v0.8.1 + github.com/pkg/errors v0.9.1 github.com/robfig/cron/v3 v3.0.0 github.com/satori/go.uuid v1.2.0 github.com/shirou/gopsutil v2.20.3+incompatible - github.com/sirupsen/logrus v1.2.0 + github.com/sirupsen/logrus v1.4.2 github.com/spf13/cobra v1.0.0 github.com/spf13/viper v1.6.2 github.com/swaggo/gin-swagger v1.2.0 github.com/swaggo/swag v1.6.5 github.com/ugorji/go v1.1.7 // indirect github.com/unrolled/secure v1.0.8 - golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59 - golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e // indirect - golang.org/x/tools v0.0.0-20200402223321-bcf690261a44 // indirect + golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect - gopkg.in/yaml.v2 v2.2.8 // indirect ) diff --git a/go.sum b/go.sum index c76e6a2a..a94a7c86 100644 --- a/go.sum +++ b/go.sum @@ -2,8 +2,41 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.37.4 h1:glPeL3BQJsbF6aIIYfZizMwc5LTYz250bDMjttbBGAU= cloud.google.com/go v0.37.4/go.mod h1:NHPJ89PdicEuT9hdPXMROBD91xc5uRDxsMtSB16k7hw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.60.0 h1:R+tDlceO7Ss+zyvtsdhTxacDyZ1k99xwskQ4FT7ruoM= +cloud.google.com/go v0.60.0/go.mod h1:yw2G51M9IfRboUH61Us8GqCeF1PzPblB823Mn2q2eAU= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/pubsub v1.4.0 h1:76oR7VBOkL7ivoIrFKyW0k7YDCRelrlxktIzQiIUGgg= +cloud.google.com/go/pubsub v1.4.0/go.mod h1:LFrqilwgdw4X2cJS9ALgzYmMu+ULyrUN6IHV3CPK4TM= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible h1:1G1pk05UrOh0NlF1oeaaix1x8XzrfjIDK47TY0Zehcw= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= @@ -15,6 +48,12 @@ github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tN github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/RichardKnop/logging v0.0.0-20190827224416-1a693bdd4fae h1:DcFpTQBYQ9Ct2d6sC7ol0/ynxc2pO1cpGUM+f4t5adg= +github.com/RichardKnop/logging v0.0.0-20190827224416-1a693bdd4fae/go.mod h1:rJJ84PyA/Wlmw1hO+xTzV2wsSUon6J5ktg0g8BF2PuU= +github.com/RichardKnop/machinery v1.8.8 h1:9T6ACnBT083vlfhhtZ2oGEe7E+vKuJ72qPVkfGw/c7k= +github.com/RichardKnop/machinery v1.8.8/go.mod h1:oZSPaqhblRMsR6WEhk8TSnW6Z6SuKjM+JxyS1FDXGoc= +github.com/RichardKnop/redsync v1.2.0 h1:gK35hR3zZkQigHKm8wOGb9MpJ9BsrW6MzxezwjTcHP0= +github.com/RichardKnop/redsync v1.2.0/go.mod h1:9b8nBGAX3bE2uCfJGSnsDvF23mKyHTZzmvmj5FH3Tp0= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUWq3EgK3CesDbo8upS2Vm9/P3FtgI+Jk= @@ -26,15 +65,24 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/aws/aws-sdk-go v1.32.12 h1:l/djCeLI4ggBFWLlYUGTqkHraoLnVMubNlLXPdEtoYc= +github.com/aws/aws-sdk-go v1.32.12/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b h1:L/QXpzIa3pOvUGt1D1lA5KjYhPBAN/3iWdP7xeFS9F0= +github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= github.com/casbin/casbin/v2 v2.0.0/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/casbin/casbin/v2 v2.2.1 h1:ijrSMfBfbQlDc4LnMTGtGYWmhKuuR6RLSQRj8vHrMzc= github.com/casbin/casbin/v2 v2.2.1/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/casbin/gorm-adapter/v2 v2.0.3 h1:m8o/APMGkm5Gb8RLHU51F/+9ODUyGgPmC+EEzRJsPr0= github.com/casbin/gorm-adapter/v2 v2.0.3/go.mod h1:pnulk7RNHbFsldTBruui8jqUhq91sLHtub8LJCJSZg8= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -53,12 +101,18 @@ github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8 github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DPaBjB8zlTR87/ElzFsnQfuHnVUVqpZZIcV5Y= github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/cors v1.3.1 h1:doAsuITavI4IOcd0Y19U4B+O0dNWihRyX//nn4sEmgA= +github.com/gin-contrib/cors v1.3.1/go.mod h1:jjEJ4268OPZUcU7k9Pm653S7lXUGcqMADzFA61xsmDk= github.com/gin-contrib/gzip v0.0.1 h1:ezvKOL6jH+jlzdHNE4h9h8q8uMpDQjyl0NN0Jd7jozc= github.com/gin-contrib/gzip v0.0.1/go.mod h1:fGBJBCdt6qCZuCAOwWuFhBB4OOq9EFqlo5dEaFhhu5w= github.com/gin-contrib/sse v0.0.0-20170109093832-22d885f9ecc7/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= @@ -69,6 +123,11 @@ github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm github.com/gin-gonic/gin v1.3.0/go.mod h1:7cKuhb5qV2ggCFctp2fJQ+ErvciLZrIeoOSOm6mUr7Y= github.com/gin-gonic/gin v1.4.0 h1:3tMoCCfM7ppqsR0ptz/wi1impNpT7/9wQtMZ8lr1mCQ= github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= +github.com/gin-gonic/gin v1.5.0 h1:fi+bqFAx/oLK54somfCtEZs9HeH1LHVoEPUgARpTqyc= +github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0 h1:Wz+5lgoB0kkuqLEc6NVmwRknTKP6dTGbSqvhZtBI/j0= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= @@ -102,9 +161,42 @@ github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tF github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.8 h1:vfK6jLhs7OI4tAXkvkooviaE1JEPcw3mutyegLHHjmk= github.com/go-openapi/swag v0.19.8/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= +github.com/go-playground/locales v0.12.1 h1:2FITxuFt/xuCNP1Acdhv62OzaCiviiE4kotfhkmOqEc= +github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM= +github.com/go-playground/universal-translator v0.16.0 h1:X++omBR/4cE2MNg91AoC3rmGrCjJ8eAeUP/K/EKx4DM= +github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY= +github.com/go-redis/redis v6.15.8+incompatible h1:BKZuG6mCnRj5AOaWJXoCgf6rqTYnYJLe4en2hxT7r9o= +github.com/go-redis/redis v6.15.8+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= +github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= +github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= +github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= +github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= +github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= +github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= +github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= +github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= +github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= +github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= +github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= +github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= +github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= +github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= +github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= @@ -112,25 +204,63 @@ github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF0 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0 h1:28o5sBqPkBsMGnC6b4MvE2TzSr5/AT4c/1fLqVGIwlk= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomodule/redigo v2.0.0+incompatible h1:K/R+8tc58AaqLkqG2Ol3Qk+DR/TlNuhuh457pBFPtt0= +github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +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.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200507031123-427632fa3b1c/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= @@ -140,10 +270,12 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmg github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jinzhu/gorm v1.9.10 h1:HvrsqdhCW78xpJF67g1hMxS6eCToo9PZH4LDB8WKPac= @@ -152,21 +284,35 @@ github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.0.1 h1:HjfetcXq097iXP0uoPCdnM4Efp5/9MsM0/M+XOTeR3M= github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jmespath/go-jmespath v0.3.0 h1:OS12ieG61fsCg5+qLJ+SsW9NicxNkg3b25OyT2yCeUc= +github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8 h1:QiWkFLKq0T7mpzwOTu6BzNDbfTE8OLrYhVKYMLF46Ok= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= +github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= +github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= +github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.10.10 h1:a/y8CglcM7gLGYmlbP/stPE5sR3hbhFRUjCBfd/0B3I= +github.com/klauspost/compress v1.10.10/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -174,6 +320,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/leodido/go-urn v1.1.0 h1:Sm1gr51B1kKyfD2BlRcLSiEkffoG96g6TPv6eRoEiB8= +github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw= github.com/lib/pq v1.1.1 h1:sJZmqHoEaY7f+NPP8pgLB/WxulyR3fewgCM2qaSlBb4= github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -186,11 +334,14 @@ github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.1 h1:mdxE1MF9o53iCb2Ghj1VfWvh7ZOwHpnVG/xwXrV90U8= github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= +github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.7 h1:UvyT9uN+3r7yLEYSlJsbQGdsaB/a0DlgWP3pql6iwOc= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.10 h1:qxFzApOv4WsAL965uUPIsXzAKCZxN2p9UqdhFS4ZW10= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-sqlite3 v1.10.0 h1:jbhqpg7tQe4SupckyijYiy0mJJ/pRyHvXf7JdWK860o= @@ -208,6 +359,7 @@ github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9 github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/mojocn/base64Captcha v1.3.1 h1:2Wbkt8Oc8qjmNJ5GyOfSo4tgVQPsbKMftqASnq8GlT0= github.com/mojocn/base64Captcha v1.3.1/go.mod h1:wAQCKEc5bDujxKRmbT6/vTnTt5CjStQ8bRfPWUuz/iY= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/mssola/user_agent v0.5.1 h1:sJUCUozh+j7c0dR2zMIUX5aJjoY/TNo/gXiNujoH5oY= github.com/mssola/user_agent v0.5.1/go.mod h1:TTPno8LPY3wAIEKRpAtkdMT0f8SE24pLRGPahjCH4uw= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -215,15 +367,23 @@ github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.4.0 h1:u3Z1r+oOXJIkxqw34zVhyPgjBsm6X2wn21NWs/HfSeg= +github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +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/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -232,6 +392,7 @@ github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDf github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= @@ -243,6 +404,9 @@ github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqn github.com/robfig/cron/v3 v3.0.0 h1:kQ6Cb7aHOHTSzNVNEhmp8EcWKLb4CbiMW9h9VyIhO4E= github.com/robfig/cron/v3 v3.0.0/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= @@ -251,6 +415,10 @@ github.com/shirou/gopsutil v2.20.3+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= @@ -261,6 +429,7 @@ github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= @@ -270,6 +439,8 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.6.2 h1:7aKfF+e8/k68gda3LOjo5RxiUqddoFxVq4BKBPrxk5E= github.com/spf13/viper v1.6.2/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= +github.com/streadway/amqp v1.0.0 h1:kuuDrUJFZL1QYL9hUNuCxNObNzB0bV/ZG5jV3RWAQgo= +github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= @@ -279,6 +450,8 @@ github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stvp/tempredis v0.0.0-20181119212430-b82af8480203/go.mod h1:oqN97ltKNihBbwlX8dLpwxCl3+HnXKV/R0e+sRLd9C8= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/swaggo/files v0.0.0-20190704085106-630677cd5c14/go.mod h1:gxQT6pBGRuIGunNf/+tSOB5OHvguWi8Tbt82WOkf35E= @@ -288,6 +461,7 @@ github.com/swaggo/swag v1.5.1 h1:2Agm8I4K5qb00620mHq0VJ05/KT4FtmALPIcQR9lEZM= github.com/swaggo/swag v1.5.1/go.mod h1:1Bl9F/ZBpVWh22nY0zmYyASPO1lI/zIwRDrpZU+tv8Y= github.com/swaggo/swag v1.6.5 h1:2C+t+xyK6p1sujqncYO/VnMvPZcBJjNdKKyxbOdAW8o= github.com/swaggo/swag v1.6.5/go.mod h1:Y7ZLSS0d0DdxhWGVhQdu+Bu1QhaF5k0RD7FKdiAykeY= +github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/ugorji/go v1.1.4 h1:j4s+tAvLfL3bZyefP2SEWmhBzmuIlH/eqNuPdFPgngw= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= @@ -304,13 +478,28 @@ github.com/unrolled/secure v1.0.8 h1:JaMvKbe4CRt8oyxVXn+xY+6jlqd7pyJNSVkmsBxxQsM github.com/unrolled/secure v1.0.8/go.mod h1:fO+mEan+FLB0CdEnHf6Q4ZZVNqG+5fuLFnP8p0BXDPI= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/negroni v1.0.0 h1:kIimOitoypq34K7TG7DUaJ9kq/N4Ofuwi1sjz0KipXc= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c h1:u40Z8hqBAAQyv+vATcGgV0YCnDjqSL7/q/JyPhhJSPk= +github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= +github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= +github.com/xdg/stringprep v1.0.0 h1:d9X0esnoa3dFsV0FG35rAT0RIhYFlPq7MiP+DW89La0= +github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.mongodb.org/mongo-driver v1.3.4 h1:zs/dKNwX0gYUtzwrN9lLiR15hCO0nDwQj5xXx+vjCdE= +go.mongodb.org/mongo-driver v1.3.4/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4 h1:LYy1Hy3MJdrCdMwwzxA/dRok4ejH+RwNGbuoD9fCjto= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= @@ -318,19 +507,50 @@ golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c h1:Vj5n4GlwjmQteupaxJ9+0FNOmBrHfq7vN4btdGoDZgI= golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59 h1:3zb4D3T4G8jdExgVU/95+vQXfpEPiMdCaZgmGVxjNHM= golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190501045829-6d32002ffd75 h1:TbGuee8sSq15Iguxu4deQ7+Bqq/d2rsQejGcEtADAMQ= golang.org/x/image v0.0.0-20190501045829-6d32002ffd75/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -342,26 +562,48 @@ golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190522155817-f3200d17e092 h1:4QSRKanuywn15aTZvI/mIDEgPQpswuFndXpOj3rKEco= golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190611141213-3f473d35a33a h1:+KkCgOMgnKSgenxTBoiwkMqTiouMIy/3o8RLdmSbGoY= golang.org/x/net v0.0.0-20190611141213-3f473d35a33a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344 h1:vGXIOMxbNfDTk/aXCmfdLgkrSV+Z2tcbze+pEc3v5W4= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 h1:qwRHBd0NqMbJxfbotnDhm2ByMI1Shq4Y6oRJo21SGJA= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -373,61 +615,203 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae h1:xiXzMMEQdQcric9hXtr1QU98MHunKK7OTtsoU6bYWs4= golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae h1:Ih9Yo4hSPImZOpfGuA4bR/ORKTAbhZo2AbWNRCnevdo= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2 h1:z99zHgr7hKfrUcX/KsoJk5FJfjTceCKIp96+biqP4To= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190606050223-4d9ae51c2468/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190611222205-d73e1c7e250b h1:/mJ+GKieZA6hFDQGdWZrjj4AXPl5ylY+5HusG80roy0= golang.org/x/tools v0.0.0-20190611222205-d73e1c7e250b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200402223321-bcf690261a44 h1:bMm0eoDiGkM5VfIyKjxDvoflW5GLp7+VCo+60n8F+TE= golang.org/x/tools v0.0.0-20200402223321-bcf690261a44/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200527183253-8e7acdbce89d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200626171337-aa94e735be7f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200630154851-b2d8b0336632 h1:fxWeLV4ol1icb47+btwfzuf8gOkJE/PPo9bLjSvZzA8= +golang.org/x/tools v0.0.0-20200630154851-b2d8b0336632/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.25.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0 h1:jMF5hhVfMkTZwHW1SDpKq5CkgWLXOb31Foaca9Zr3oM= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200528110217-3d3490e7e671/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200626011028-ee7919e894b5 h1:a/Sqq5B3dGnmxhuJZIHFsIxhEkqElErr5TaU6IqBAj0= +google.golang.org/genproto v0.0.0-20200626011028-ee7919e894b5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0 h1:M5a8xTlYTxwMn5ZFkwhRabsygDY5G8TYLyQDBxJNAxE= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2 h1:lFB4DoMU6B626w8ny76MV7VX6W2VHct2GVOI3xgiMrQ= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= +gopkg.in/go-playground/validator.v9 v9.29.1 h1:SvGtYmN60a5CVKTOzMSyfzWDeZRxRuGvRQyEAKbw1xc= +gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= @@ -440,6 +824,16 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/middleware/permission.go b/middleware/permission.go index 5997e220..82b57903 100644 --- a/middleware/permission.go +++ b/middleware/permission.go @@ -20,7 +20,7 @@ func AuthCheckRole() gin.HandlerFunc { tools.HasError(err, "", 500) //检查权限 res, err := e.Enforce(v["rolekey"], c.Request.URL.Path, c.Request.Method) - log.Println("----------------", v["rolekey"], c.Request.URL.Path, c.Request.Method) + log.Println(v["rolekey"], c.Request.URL.Path, c.Request.Method) tools.HasError(err, "", 500) diff --git a/models/gorm/gorm.go b/models/gorm/gorm.go index fbd2c2e2..4c6b9a8d 100644 --- a/models/gorm/gorm.go +++ b/models/gorm/gorm.go @@ -1,6 +1,7 @@ package gorm import ( + "ferry/models/process" "ferry/models/system" "github.com/jinzhu/gorm" @@ -21,5 +22,6 @@ func AutoMigrate(db *gorm.DB) error { new(system.Post), // 流程中心 + new(process.Classify), ).Error } diff --git a/models/process/workOrder/circulationHistory.go b/models/process/circulationHistory.go similarity index 98% rename from models/process/workOrder/circulationHistory.go rename to models/process/circulationHistory.go index 4e1fc4c8..b29a2d9b 100644 --- a/models/process/workOrder/circulationHistory.go +++ b/models/process/circulationHistory.go @@ -1,4 +1,4 @@ -package workOrder +package process import ( "ferry/models/base" diff --git a/models/process/process/classify.go b/models/process/classify.go similarity index 100% rename from models/process/process/classify.go rename to models/process/classify.go diff --git a/models/process/task/history.go b/models/process/history.go similarity index 98% rename from models/process/task/history.go rename to models/process/history.go index 68c434be..b039d7df 100644 --- a/models/process/task/history.go +++ b/models/process/history.go @@ -1,4 +1,4 @@ -package task +package process import ( "ferry/models/base" diff --git a/models/process/process/process.go b/models/process/process.go similarity index 100% rename from models/process/process/process.go rename to models/process/process.go diff --git a/models/process/task/task.go b/models/process/task.go similarity index 89% rename from models/process/task/task.go rename to models/process/task.go index 32d687d7..2678db7b 100644 --- a/models/process/task/task.go +++ b/models/process/task.go @@ -1,4 +1,4 @@ -package task +package process import ( "ferry/models/base" @@ -9,7 +9,7 @@ import ( */ // 任务 -type Info struct { +type TaskInfo struct { base.Model Name string `gorm:"column:name; type: varchar(256)" json:"name" form:"name"` // 任务名称 TaskType string `gorm:"column:task_type; type: varchar(45)" json:"task_type" form:"task_type"` // 任务类型 @@ -18,6 +18,6 @@ type Info struct { Remarks string `gorm:"column:remarks; type: longtext" json:"remarks" form:"remarks"` // 备注 } -func (Info) TableName() string { +func (TaskInfo) TableName() string { return "task_info" } diff --git a/models/process/tpl/tpl.go b/models/process/tpl.go similarity index 90% rename from models/process/tpl/tpl.go rename to models/process/tpl.go index 024a3ec3..c182f24b 100644 --- a/models/process/tpl/tpl.go +++ b/models/process/tpl.go @@ -1,4 +1,4 @@ -package tpl +package process import ( "encoding/json" @@ -10,7 +10,7 @@ import ( */ // 模板 -type Info struct { +type TplInfo struct { base.Model Name string `gorm:"column:name; type: varchar(128)" json:"name" form:"name" binding:"required"` // 模板名称 FormStructure json.RawMessage `gorm:"column:form_structure; type: json" json:"form_structure" form:"form_structure" binding:"required"` // 表单结构 @@ -18,6 +18,6 @@ type Info struct { Remarks string `gorm:"column:remarks; type: longtext" json:"remarks" form:"remarks"` // 备注 } -func (Info) TableName() string { +func (TplInfo) TableName() string { return "tpl_info" } diff --git a/models/process/workOrder/tplData.go b/models/process/tplData.go similarity index 97% rename from models/process/workOrder/tplData.go rename to models/process/tplData.go index 6b6d513c..6c1cffb5 100644 --- a/models/process/workOrder/tplData.go +++ b/models/process/tplData.go @@ -1,4 +1,4 @@ -package workOrder +package process import ( "encoding/json" diff --git a/models/process/workOrder/workOrder.go b/models/process/workOrder.go similarity index 92% rename from models/process/workOrder/workOrder.go rename to models/process/workOrder.go index 643efafb..3f7426ab 100644 --- a/models/process/workOrder/workOrder.go +++ b/models/process/workOrder.go @@ -1,4 +1,4 @@ -package workOrder +package process import ( "encoding/json" @@ -10,7 +10,7 @@ import ( */ // 工单 -type Info struct { +type WorkOrderInfo struct { base.Model Title string `gorm:"column:title; type:varchar(128)" json:"title" form:"title"` // 工单标题 Process int `gorm:"column:process; type:int(11)" json:"process" form:"process"` // 流程ID @@ -21,6 +21,6 @@ type Info struct { Creator int `gorm:"column:creator; type:int(11)" json:"creator" form:"creator"` // 创建人 } -func (Info) TableName() string { +func (WorkOrderInfo) TableName() string { return "work_order_info" } diff --git a/pkg/pagination/pagination.go b/pkg/pagination/pagination.go new file mode 100644 index 00000000..da78d281 --- /dev/null +++ b/pkg/pagination/pagination.go @@ -0,0 +1,117 @@ +package pagination + +/* + @Author : lanyulei +*/ + +import ( + "fmt" + "math" + + "github.com/RichardKnop/machinery/v1/log" + + "github.com/gin-gonic/gin" + "github.com/jinzhu/gorm" +) + +type Param struct { + C *gin.Context + DB *gorm.DB + ShowSQL bool +} + +type Paginator struct { + TotalCount int `json:"total_count"` + TotalPage int `json:"total_page"` + Data interface{} `json:"data"` + PerPage int `json:"per_page"` + Page int `json:"page"` +} + +type ListRequest struct { + Page int `json:"page" form:"page"` + PerPage int `json:"per_page" form:"per_page"` + Sort int `json:"sort" form:"sort"` +} + +// Paging 分页 +func Paging(p *Param, result interface{}, args ...interface{}) (*Paginator, error) { + var ( + param ListRequest + paginator Paginator + count int + offset int + tableName string + ) + + if err := p.C.Bind(¶m); err != nil { + log.ERROR.Printf("参数绑定失败,错误:%v", err) + return nil, err + } + + db := p.DB + + if p.ShowSQL { + db = db.Debug() + } + + if param.Page < 1 { + param.Page = 1 + } + + if param.PerPage == 0 { + param.PerPage = 10 + } + + if param.Sort == 0 || param.Sort == -1 { + db = db.Order("id desc") + } + + if len(args) > 1 { + tableName = fmt.Sprintf("`%s`.", args[1].(string)) + } + + if len(args) > 0 { + for paramType, paramsValue := range args[0].(map[string]map[string]interface{}) { + if paramType == "like" { + for key, value := range paramsValue { + db = db.Where(fmt.Sprintf("%v%v like ?", tableName, key), fmt.Sprintf("%%%v%%", value)) + } + } else if paramType == "equal" { + for key, value := range paramsValue { + db = db.Where(fmt.Sprintf("%v%v = ?", tableName, key), value) + } + } + } + } + + done := make(chan bool, 1) + + go countRecords(db, result, done, &count) + + if param.Page == 1 { + offset = 0 + } else { + offset = (param.Page - 1) * param.PerPage + } + + err := db.Limit(param.PerPage).Offset(offset).Scan(result).Error + if err != nil { + log.ERROR.Printf("数据查询失败,错误:%v", err) + return nil, err + } + <-done + + paginator.TotalCount = count + paginator.Data = result + paginator.Page = param.Page + paginator.PerPage = param.PerPage + paginator.TotalPage = int(math.Ceil(float64(count) / float64(param.PerPage))) + + return &paginator, nil +} + +func countRecords(db *gorm.DB, anyType interface{}, done chan bool, count *int) { + db.Model(anyType).Count(count) + done <- true +} diff --git a/pkg/pagination/params.go b/pkg/pagination/params.go new file mode 100644 index 00000000..449730aa --- /dev/null +++ b/pkg/pagination/params.go @@ -0,0 +1,32 @@ +package pagination + +import ( + "github.com/RichardKnop/machinery/v1/log" + + "github.com/gin-gonic/gin" +) + +/* + @Author : lanyulei +*/ + +func RequestParams(c *gin.Context) map[string]interface{} { + params := make(map[string]interface{}, 10) + + if c.Request.Form == nil { + if err := c.Request.ParseMultipartForm(32 << 20); err != nil { + log.ERROR.Println(err) + } + } + + if len(c.Request.Form) > 0 { + for key, value := range c.Request.Form { + if key == "page" || key == "per_page" || key == "sort" { + continue + } + params[key] = value[0] + } + } + + return params +} diff --git a/pkg/service/getPrincipal.go b/pkg/service/getPrincipal.go new file mode 100644 index 00000000..56215d2c --- /dev/null +++ b/pkg/service/getPrincipal.go @@ -0,0 +1,50 @@ +package service + +import ( + "ferry/models/user" + "ferry/pkg/connection" + "strings" +) + +/* + @Author : lanyulei +*/ + +func GetPrincipal(processor []int, processMethod string) (principals string, err error) { + /* + person 人员 + persongroup 人员组 + department 部门 + variable 变量 + */ + var principalList []string + switch processMethod { + case "person": + err = connection.DB.Self.Model(&user.Info{}). + Where("id in (?)", processor). + Pluck("nickname", &principalList).Error + if err != nil { + return + } + case "persongroup": + err = connection.DB.Self.Model(&user.Group{}).Where("id in (?)", processor).Pluck("nickname", &principalList).Error + if err != nil { + return + } + case "department": + err = connection.DB.Self.Model(&user.Dept{}).Where("id in (?)", processor).Pluck("nickname", &principalList).Error + if err != nil { + return + } + case "variable": + for _, p := range processor { + switch p { + case 1: + principalList = append(principalList, "创建人") + case 2: + principalList = append(principalList, "创建人领导") + } + } + } + return strings.Join(principalList, ","), nil +} diff --git a/pkg/service/getState.go b/pkg/service/getState.go new file mode 100644 index 00000000..92601d5e --- /dev/null +++ b/pkg/service/getState.go @@ -0,0 +1,58 @@ +package service + +import ( + "strconv" +) + +/* + @Author : lanyulei + @Desc : 获取节点数据 +*/ + +type ProcessState struct { + Structure map[string][]map[string]interface{} +} + +// 获取节点信息 +func (p *ProcessState) GetNode(stateId string) (nodeValue map[string]interface{}, err error) { + for _, node := range p.Structure["nodes"] { + if node["id"] == stateId { + nodeValue = node + } + } + + return +} + +// 获取流转信息 +func (p *ProcessState) GetEdge(stateId string, classify string) (edgeValue []map[string]interface{}, err error) { + var ( + leftSort int + rightSort int + ) + + for _, edge := range p.Structure["edges"] { + if edge[classify] == stateId { + edgeValue = append(edgeValue, edge) + } + } + + // 排序 + if len(edgeValue) > 1 { + for i := 0; i < len(edgeValue)-1; i++ { + for j := i + 1; j < len(edgeValue); j++ { + if t, ok := edgeValue[i]["sort"]; ok { + leftSort, _ = strconv.Atoi(t.(string)) + } + if t, ok := edgeValue[j]["sort"]; ok { + rightSort, _ = strconv.Atoi(t.(string)) + } + if leftSort > rightSort { + edgeValue[j], edgeValue[i] = edgeValue[i], edgeValue[j] + } + } + } + } + + return +} diff --git a/pkg/service/handle.go b/pkg/service/handle.go new file mode 100644 index 00000000..9bc45936 --- /dev/null +++ b/pkg/service/handle.go @@ -0,0 +1,676 @@ +package service + +import ( + "encoding/json" + "errors" + "ferry/models/base" + "ferry/models/process" + "ferry/models/workOrder" + "ferry/pkg/connection" + "fmt" + "reflect" + "time" + + "github.com/jinzhu/gorm" + + "github.com/gin-gonic/gin" +) + +/* + @Author : lanyulei + @Desc : 处理工单 +*/ + +/* + -- 节点 -- + start: 开始节点 + userTask: 审批节点 + receiveTask: 处理节点 + scriptTask: 任务节点 + end: 结束节点 + + -- 网关 -- + exclusiveGateway: 排他网关 + parallelGateway: 并行网关 + inclusiveGateway: 包容网关 + +*/ + +type Handle struct { + cirHistoryList []workOrder.CirculationHistory + workOrderId int + updateValue map[string]interface{} + stateValue map[string]interface{} + targetStateValue map[string]interface{} + workOrderData [][]byte + workOrderDetails workOrder.Info + endHistory bool + flowProperties int + circulationValue string + processState ProcessState + tx *gorm.DB +} + +// 时间格式化 +func fmtDuration(d time.Duration) string { + d = d.Round(time.Minute) + h := d / time.Hour + d -= h * time.Hour + m := d / time.Minute + return fmt.Sprintf("%02d小时 %02d分钟", h, m) +} + +// 会签 +func (h *Handle) Countersign(c *gin.Context) (err error) { + var ( + stateList []map[string]interface{} + stateIdMap map[string]interface{} + currentState map[string]interface{} + cirHistoryCount int + ) + + err = json.Unmarshal(h.workOrderDetails.State, &stateList) + if err != nil { + return + } + + stateIdMap = make(map[string]interface{}) + for _, v := range stateList { + stateIdMap[v["id"].(string)] = v["label"] + if v["id"].(string) == h.stateValue["id"].(string) { + currentState = v + } + } + for _, cirHistoryValue := range h.cirHistoryList { + if _, ok := stateIdMap[cirHistoryValue.Source]; !ok { + break + } + for _, processor := range currentState["processor"].([]interface{}) { + if cirHistoryValue.ProcessorId != c.GetInt("userId") && + cirHistoryValue.Source == currentState["id"].(string) && + cirHistoryValue.ProcessorId == int(processor.(float64)) { + cirHistoryCount += 1 + } + } + } + if cirHistoryCount == len(currentState["processor"].([]interface{}))-1 { + h.endHistory = true + err = h.circulation() + if err != nil { + return + } + } + return +} + +// 工单跳转 +func (h *Handle) circulation() (err error) { + var ( + stateValue []byte + ) + + stateValue, err = json.Marshal(h.updateValue["state"]) + if err != nil { + return + } + + err = h.tx.Model(&workOrder.Info{}). + Where("id = ?", h.workOrderId). + Updates(map[string]interface{}{ + "state": stateValue, + "related_person": h.updateValue["related_person"], + }).Error + if err != nil { + h.tx.Rollback() + return + } + return +} + +// 条件判断 +func (h *Handle) ConditionalJudgment(condExpr map[string]interface{}) (result bool, err error) { + var ( + condExprOk bool + condExprValue interface{} + ) + + defer func() { + if r := recover(); r != nil { + switch e := r.(type) { + case string: + err = errors.New(e) + case error: + err = e + default: + err = errors.New("未知错误") + } + return + } + }() + + for _, data := range h.workOrderData { + var formData map[string]interface{} + err = json.Unmarshal(data, &formData) + if err != nil { + return + } + if condExprValue, condExprOk = formData[condExpr["key"].(string)]; condExprOk { + break + } + } + + if condExprValue == nil { + err = errors.New("未查询到对应的表单数据。") + return + } + + // todo 待优化 + switch reflect.TypeOf(condExprValue).String() { + case "string": + switch condExpr["sign"] { + case "==": + if condExprValue.(string) == condExpr["value"].(string) { + result = true + } + case "!=": + if condExprValue.(string) != condExpr["value"].(string) { + result = true + } + case ">": + if condExprValue.(string) > condExpr["value"].(string) { + result = true + } + case ">=": + if condExprValue.(string) >= condExpr["value"].(string) { + result = true + } + case "<": + if condExprValue.(string) < condExpr["value"].(string) { + result = true + } + case "<=": + if condExprValue.(string) <= condExpr["value"].(string) { + result = true + } + default: + err = errors.New("目前仅支持6种常规判断类型,包括(等于、不等于、大于、大于等于、小于、小于等于)") + } + case "float64": + switch condExpr["sign"] { + case "==": + if condExprValue.(float64) == condExpr["value"].(float64) { + result = true + } + case "!=": + if condExprValue.(float64) != condExpr["value"].(float64) { + result = true + } + case ">": + if condExprValue.(float64) > condExpr["value"].(float64) { + result = true + } + case ">=": + if condExprValue.(float64) >= condExpr["value"].(float64) { + result = true + } + case "<": + if condExprValue.(float64) < condExpr["value"].(float64) { + result = true + } + case "<=": + if condExprValue.(float64) <= condExpr["value"].(float64) { + result = true + } + default: + err = errors.New("目前仅支持6种常规判断类型,包括(等于、不等于、大于、大于等于、小于、小于等于)") + } + default: + err = errors.New("条件判断目前仅支持字符串、整型。") + } + + return +} + +// 并行网关,确认其他节点是否完成 +func (h *Handle) completeAllParallel(c *gin.Context, target string) (statusOk bool, err error) { + var ( + stateList []map[string]interface{} + ) + + err = json.Unmarshal(h.workOrderDetails.State, &stateList) + if err != nil { + err = fmt.Errorf("反序列化失败,%v", err.Error()) + return + } + +continueHistoryTag: + for _, v := range h.cirHistoryList { + status := false + for i, s := range stateList { + if v.Source == s["id"].(string) && v.Target == target { + status = true + stateList = append(stateList[:i], stateList[i+1:]...) + continue continueHistoryTag + } + } + if !status { + break + } + } + + if len(stateList) == 1 && stateList[0]["id"].(string) == h.stateValue["id"] { + statusOk = true + } + + return +} + +func (h *Handle) commonProcessing(c *gin.Context) (err error) { + // 如果是拒绝的流转则直接跳转 + if h.flowProperties == 0 { + err = h.circulation() + if err != nil { + err = fmt.Errorf("工单跳转失败,%v", err.Error()) + } + return + } + + // 会签 + if h.stateValue["assignValue"] != nil && len(h.stateValue["assignValue"].([]interface{})) > 1 { + if isCounterSign, ok := h.stateValue["isCounterSign"]; ok { + if isCounterSign.(bool) { + h.endHistory = false + err = h.Countersign(c) + if err != nil { + return + } + } else { + err = h.circulation() + if err != nil { + return + } + } + } else { + err = h.circulation() + if err != nil { + return + } + } + } else { + err = h.circulation() + if err != nil { + return + } + } + return +} + +func (h *Handle) HandleWorkOrder( + c *gin.Context, + workOrderId int, + tasks []string, + targetState string, + sourceState string, + circulationValue string, + flowProperties int, +) (err error) { + h.workOrderId = workOrderId + h.flowProperties = flowProperties + h.endHistory = true + + var ( + execTasks []string + relatedPersonList []int + cirHistoryValue []workOrder.CirculationHistory + cirHistoryData workOrder.CirculationHistory + costDurationValue string + sourceEdges []map[string]interface{} + targetEdges []map[string]interface{} + condExprStatus bool + relatedPersonValue []byte + parallelStatusOk bool + processInfo process.Info + ) + + defer func() { + if r := recover(); r != nil { + switch e := r.(type) { + case string: + err = errors.New(e) + case error: + err = e + default: + err = errors.New("未知错误") + } + return + } + }() + + // 获取工单信息 + err = connection.DB.Self.Model(&workOrder.Info{}).Where("id = ?", workOrderId).Find(&h.workOrderDetails).Error + if err != nil { + return + } + + // 获取流程信息 + err = connection.DB.Self.Model(&process.Info{}).Where("id = ?", h.workOrderDetails.Process).Find(&processInfo).Error + if err != nil { + return + } + err = json.Unmarshal(processInfo.Structure, &h.processState.Structure) + if err != nil { + return + } + + // 获取当前节点 + h.stateValue, err = h.processState.GetNode(sourceState) + if err != nil { + return + } + + // 目标状态 + h.targetStateValue, err = h.processState.GetNode(targetState) + if err != nil { + return + } + + // 获取工单数据 + err = connection.DB.Self.Model(&workOrder.TplData{}). + Where("work_order = ?", workOrderId). + Pluck("form_data", &h.workOrderData).Error + if err != nil { + return + } + + // 根据处理人查询出需要会签的条数 + err = connection.DB.Self.Model(&workOrder.CirculationHistory{}). + Where("work_order = ?", workOrderId). + Order("id desc"). + Find(&h.cirHistoryList).Error + if err != nil { + return + } + + err = json.Unmarshal(h.workOrderDetails.RelatedPerson, &relatedPersonList) + if err != nil { + return + } + relatedPersonStatus := false + for _, r := range relatedPersonList { + if r == c.GetInt("userId") { + relatedPersonStatus = true + break + } + } + if !relatedPersonStatus { + relatedPersonList = append(relatedPersonList, c.GetInt("userId")) + } + + relatedPersonValue, err = json.Marshal(relatedPersonList) + if err != nil { + return + } + + h.updateValue = map[string]interface{}{ + "related_person": relatedPersonValue, + } + + // 开启事务 + h.tx = connection.DB.Self.Begin() + + stateValue := map[string]interface{}{ + "label": h.targetStateValue["label"].(string), + "id": h.targetStateValue["id"].(string), + } + + switch h.targetStateValue["clazz"] { + // 排他网关 + case "exclusiveGateway": + sourceEdges, err = h.processState.GetEdge(h.targetStateValue["id"].(string), "source") + if err != nil { + return + } + breakTag: + for _, edge := range sourceEdges { + edgeCondExpr := make([]map[string]interface{}, 0) + err = json.Unmarshal([]byte(edge["conditionExpression"].(string)), &edgeCondExpr) + if err != nil { + return + } + for _, condExpr := range edgeCondExpr { + // 条件判断 + condExprStatus, err = h.ConditionalJudgment(condExpr) + if err != nil { + return + } + if condExprStatus { + // 进行节点跳转 + h.targetStateValue, err = h.processState.GetNode(edge["target"].(string)) + if err != nil { + return + } + + if h.targetStateValue["clazz"] == "userTask" || h.targetStateValue["clazz"] == "receiveTask" { + if h.targetStateValue["assignValue"] == nil || h.targetStateValue["assignType"] == "" { + err = errors.New("处理人不能为空") + return + } + } + + h.updateValue["state"] = []map[string]interface{}{{ + "id": h.targetStateValue["id"].(string), + "label": h.targetStateValue["label"], + "processor": h.targetStateValue["assignValue"], + "process_method": h.targetStateValue["assignType"], + }} + err = h.commonProcessing(c) + if err != nil { + err = fmt.Errorf("流程流程跳转失败,%v", err.Error()) + return + } + + break breakTag + } + } + } + if !condExprStatus { + err = errors.New("所有流转均不符合条件,请确认。") + return + } + // 并行/聚合网关 + case "parallelGateway": + // 入口,判断 + sourceEdges, err = h.processState.GetEdge(h.targetStateValue["id"].(string), "source") + if err != nil { + err = fmt.Errorf("查询流转信息失败,%v", err.Error()) + return + } + + targetEdges, err = h.processState.GetEdge(h.targetStateValue["id"].(string), "target") + if err != nil { + err = fmt.Errorf("查询流转信息失败,%v", err.Error()) + return + } + + if len(sourceEdges) > 0 { + h.targetStateValue, err = h.processState.GetNode(sourceEdges[0]["target"].(string)) + if err != nil { + return + } + } else { + err = errors.New("并行网关流程不正确") + return + } + + if len(sourceEdges) > 1 && len(targetEdges) == 1 { + // 入口 + h.updateValue["state"] = make([]map[string]interface{}, 0) + for _, edge := range sourceEdges { + targetStateValue, err := h.processState.GetNode(edge["target"].(string)) + if err != nil { + return err + } + h.updateValue["state"] = append(h.updateValue["state"].([]map[string]interface{}), map[string]interface{}{ + "id": edge["target"].(string), + "label": targetStateValue["label"], + "processor": targetStateValue["assignValue"], + "process_method": targetStateValue["assignType"], + }) + } + err = h.circulation() + if err != nil { + err = fmt.Errorf("工单跳转失败,%v", err.Error()) + return + } + } else if len(sourceEdges) == 1 && len(targetEdges) > 1 { + // 出口 + parallelStatusOk, err = h.completeAllParallel(c, sourceEdges[0]["target"].(string)) + if err != nil { + err = fmt.Errorf("并行检测失败,%v", err.Error()) + return + } + if parallelStatusOk { + h.endHistory = true + h.updateValue["state"] = []map[string]interface{}{{ + "id": h.targetStateValue["id"].(string), + "label": h.targetStateValue["label"], + "processor": h.targetStateValue["assignValue"], + "process_method": h.targetStateValue["assignType"], + }} + err = h.circulation() + if err != nil { + err = fmt.Errorf("工单跳转失败,%v", err.Error()) + return + } + } else { + h.endHistory = false + } + + } else { + err = errors.New("并行网关流程不正确") + return + } + // 包容网关 + case "inclusiveGateway": + fmt.Println("inclusiveGateway") + return + case "start": + stateValue["processor"] = []int{h.workOrderDetails.Creator} + stateValue["process_method"] = "person" + h.updateValue["state"] = []interface{}{stateValue} + err = h.circulation() + if err != nil { + return + } + case "userTask": + stateValue["processor"] = h.targetStateValue["assignValue"].([]interface{}) + stateValue["process_method"] = h.targetStateValue["assignType"].(string) + h.updateValue["state"] = []interface{}{stateValue} + err = h.commonProcessing(c) + if err != nil { + return + } + case "receiveTask": + stateValue["processor"] = h.targetStateValue["assignValue"].([]interface{}) + stateValue["process_method"] = h.targetStateValue["assignType"].(string) + h.updateValue["state"] = []interface{}{stateValue} + err = h.commonProcessing(c) + if err != nil { + return + } + case "scriptTask": + stateValue["processor"] = []int{} + stateValue["process_method"] = "" + h.updateValue["state"] = []interface{}{stateValue} + case "end": + stateValue["processor"] = []int{} + stateValue["process_method"] = "" + h.updateValue["state"] = []interface{}{stateValue} + err = h.circulation() + if err != nil { + h.tx.Rollback() + return + } + err = h.tx.Model(&workOrder.Info{}). + Where("id = ?", h.workOrderId). + Update("is_end", 1).Error + if err != nil { + h.tx.Rollback() + return + } + } + + // 流转历史写入 + err = connection.DB.Self.Model(&cirHistoryValue). + Where("work_order = ?", workOrderId). + Find(&cirHistoryValue). + Order("create_time desc").Error + if err != nil { + h.tx.Rollback() + return + } + for _, t := range cirHistoryValue { + if t.Source != h.stateValue["id"] { + costDuration := time.Since(t.CreatedAt.Time) + costDurationValue = fmtDuration(costDuration) + } + } + + cirHistoryData = workOrder.CirculationHistory{ + Model: base.Model{}, + Title: h.workOrderDetails.Title, + WorkOrder: h.workOrderDetails.Id, + State: h.stateValue["label"].(string), + Source: h.stateValue["id"].(string), + Target: h.targetStateValue["id"].(string), + Circulation: circulationValue, + Processor: c.GetString("nickname"), + ProcessorId: c.GetInt("userId"), + CostDuration: costDurationValue, + } + + err = h.tx.Create(&cirHistoryData).Error + if err != nil { + h.tx.Rollback() + return + } + + // 判断目标是否是结束节点 + if h.targetStateValue["clazz"] == "end" && h.endHistory == true { + err = h.tx.Create(&workOrder.CirculationHistory{ + Model: base.Model{}, + Title: h.workOrderDetails.Title, + WorkOrder: h.workOrderDetails.Id, + State: h.targetStateValue["label"].(string), + Source: h.targetStateValue["id"].(string), + Processor: c.GetString("nickname"), + ProcessorId: c.GetInt("userId"), + Circulation: "结束", + }).Error + if err != nil { + h.tx.Rollback() + return + } + } + + h.tx.Commit() // 提交事务 + + // 执行流程公共任务及节点任务 + if h.stateValue["task"] != nil { + for _, task := range h.stateValue["task"].([]interface{}) { + tasks = append(tasks, task.(string)) + } + } +continueTag: + for _, task := range tasks { + for _, t := range execTasks { + if t == task { + continue continueTag + } + } + execTasks = append(execTasks, task) + } + go ExecTask(execTasks) + + return +} diff --git a/pkg/service/process.go b/pkg/service/process.go new file mode 100644 index 00000000..124c58b5 --- /dev/null +++ b/pkg/service/process.go @@ -0,0 +1,174 @@ +package service + +import ( + "encoding/json" + "errors" + "ferry/models/process" + "ferry/models/tpl" + "ferry/models/workOrder" + "ferry/pkg/connection" + "fmt" + "strconv" + + "github.com/gin-gonic/gin" +) + +/* + @Author : lanyulei +*/ + +type WorkOrderData struct { + workOrder.Info + CurrentState string `json:"current_state"` +} + +func ProcessStructure(c *gin.Context, processId int, workOrderId int) (result map[string]interface{}, err error) { + var ( + processValue process.Info + processStructureDetails map[string]interface{} + processNode []map[string]interface{} + tplDetails []*tpl.Info + workOrderInfo WorkOrderData + workOrderTpls []*workOrder.TplData + workOrderHistory []*workOrder.CirculationHistory + stateList []map[string]interface{} + ) + + err = connection.DB.Self.Model(&processValue).Where("id = ?", processId).Find(&processValue).Error + if err != nil { + err = fmt.Errorf("查询流程失败,%v", err.Error()) + return + } + + err = json.Unmarshal([]byte(processValue.Structure), &processStructureDetails) + if err != nil { + err = fmt.Errorf("json转map失败,%v", err.Error()) + return + } + + // 排序,使用冒泡 + p := processStructureDetails["nodes"].([]interface{}) + if len(p) > 1 { + for i := 0; i < len(p); i++ { + for j := 1; j < len(p)-i; j++ { + if p[j].(map[string]interface{})["sort"] == nil || p[j-1].(map[string]interface{})["sort"] == nil { + return nil, errors.New("流程未定义顺序属性,请确认") + } + leftInt, _ := strconv.Atoi(p[j].(map[string]interface{})["sort"].(string)) + rightInt, _ := strconv.Atoi(p[j-1].(map[string]interface{})["sort"].(string)) + if leftInt < rightInt { + //交换 + p[j], p[j-1] = p[j-1], p[j] + } + } + } + for _, node := range processStructureDetails["nodes"].([]interface{}) { + processNode = append(processNode, node.(map[string]interface{})) + } + } else { + processNode = processStructureDetails["nodes"].([]map[string]interface{}) + } + + processValue.Structure = nil + result = map[string]interface{}{ + "process": processValue, + "nodes": processNode, + "edges": processStructureDetails["edges"], + } + + // 获取历史记录 + err = connection.DB.Self.Model(&workOrder.CirculationHistory{}). + Where("work_order = ?", workOrderId). + Order("id desc"). + Find(&workOrderHistory).Error + if err != nil { + return + } + result["circulationHistory"] = workOrderHistory + + if workOrderId == 0 { + // 查询流程模版 + var tplIdList []int + err = json.Unmarshal(processValue.Tpls, &tplIdList) + if err != nil { + err = fmt.Errorf("json转map失败,%v", err.Error()) + return + } + err = connection.DB.Self.Model(&tplDetails). + Where("id in (?)", tplIdList). + Find(&tplDetails).Error + if err != nil { + err = fmt.Errorf("查询模版失败,%v", err.Error()) + return + } + result["tpls"] = tplDetails + } else { + // 查询工单信息 + err = connection.DB.Self.Model(&workOrder.Info{}). + Where("id = ?", workOrderId). + Scan(&workOrderInfo).Error + if err != nil { + return + } + // 获取当前节点 + err = json.Unmarshal(workOrderInfo.State, &stateList) + if err != nil { + err = fmt.Errorf("序列化节点列表失败,%v", err.Error()) + return + } + if len(stateList) == 0 { + err = errors.New("当前工单没有下一节点数据") + return + } + + // 整理需要并行处理的数据 + if len(stateList) > 1 { + continueHistoryTag: + for _, v := range workOrderHistory { + status := false + for i, s := range stateList { + if v.Source == s["id"].(string) && v.Target != "" { + status = true + stateList = append(stateList[:i], stateList[i+1:]...) + continue continueHistoryTag + } + } + if !status { + break + } + } + } + + if len(stateList) > 0 { + breakStateTag: + for _, stateValue := range stateList { + for _, processNodeValue := range processStructureDetails["nodes"].([]interface{}) { + if stateValue["id"].(string) == processNodeValue.(map[string]interface{})["id"] { + for _, userId := range stateValue["processor"].([]interface{}) { + if int(userId.(float64)) == c.GetInt("userId") { + workOrderInfo.CurrentState = stateValue["id"].(string) + break breakStateTag + } + } + } + } + } + + if workOrderInfo.CurrentState == "" { + workOrderInfo.CurrentState = stateList[0]["id"].(string) + } + } + + result["workOrder"] = workOrderInfo + + // 查询工单表单数据 + err = connection.DB.Self.Model(&workOrderTpls). + Where("work_order = ?", workOrderId). + Find(&workOrderTpls).Error + if err != nil { + return nil, err + } + result["tpls"] = workOrderTpls + } + return result, nil +} diff --git a/pkg/service/task.go b/pkg/service/task.go new file mode 100644 index 00000000..e0c2cce2 --- /dev/null +++ b/pkg/service/task.go @@ -0,0 +1,24 @@ +package service + +import ( + "ferry/pkg/task" + "fmt" + "strings" + + "github.com/spf13/viper" +) + +/* + @Author : lanyulei +*/ + +func ExecTask(taskList []string) { + for _, taskName := range taskList { + filePath := fmt.Sprintf("%v/%v", viper.GetString("script.path"), taskName) + if strings.HasSuffix(filePath, ".py") { + task.Send("python", filePath) + } else if strings.HasSuffix(filePath, ".sh") { + task.Send("shell", filePath) + } + } +} diff --git a/pkg/service/userAuthority.go b/pkg/service/userAuthority.go new file mode 100644 index 00000000..bb9a8164 --- /dev/null +++ b/pkg/service/userAuthority.go @@ -0,0 +1,148 @@ +package service + +import ( + "encoding/json" + "ferry/models/process" + "ferry/models/user" + "ferry/models/workOrder" + "ferry/pkg/connection" + + "github.com/gin-gonic/gin" +) + +/* + @Author : lanyulei +*/ + +func JudgeUserAuthority(c *gin.Context, workOrderId int, currentState string) (status bool, err error) { + /* + person 人员 + persongroup 人员组 + department 部门 + variable 变量 + */ + var ( + workOrderInfo workOrder.Info + userInfo user.Info + userDept user.Dept + cirHistoryList []workOrder.CirculationHistory + stateValue map[string]interface{} + processInfo process.Info + processState ProcessState + currentStateList []map[string]interface{} + currentStateValue map[string]interface{} + ) + // 获取工单信息 + err = connection.DB.Self.Model(&workOrderInfo). + Where("id = ?", workOrderId). + Find(&workOrderInfo).Error + if err != nil { + return + } + + // 获取流程信息 + err = connection.DB.Self.Model(&process.Info{}).Where("id = ?", workOrderInfo.Process).Find(&processInfo).Error + if err != nil { + return + } + err = json.Unmarshal(processInfo.Structure, &processState.Structure) + if err != nil { + return + } + + stateValue, err = processState.GetNode(currentState) + if err != nil { + return + } + + err = json.Unmarshal(workOrderInfo.State, ¤tStateList) + if err != nil { + return + } + + for _, v := range currentStateList { + if v["id"].(string) == currentState { + currentStateValue = v + break + } + } + + // 会签 + if currentStateValue["processor"] != nil && len(currentStateValue["processor"].([]interface{})) > 1 { + if isCounterSign, ok := stateValue["isCounterSign"]; ok { + if isCounterSign.(bool) { + err = connection.DB.Self.Model(&workOrder.CirculationHistory{}). + Where("work_order = ?", workOrderId). + Order("id desc"). + Find(&cirHistoryList).Error + if err != nil { + return + } + for _, cirHistoryValue := range cirHistoryList { + if cirHistoryValue.Source != stateValue["id"] { + break + } + if cirHistoryValue.Source == stateValue["id"] && cirHistoryValue.ProcessorId == c.GetInt("userId") { + return + } + } + } + } + } + + switch currentStateValue["process_method"].(string) { + case "person": + for _, processorValue := range currentStateValue["processor"].([]interface{}) { + if int(processorValue.(float64)) == c.GetInt("userId") { + status = true + } + } + case "persongroup": + var persongroupCount int + err = connection.DB.Self.Model(&user.UserGroup{}). + Where("group in (?) and user = ?", currentStateValue["processor"].([]interface{}), c.GetInt("userId")). + Count(&persongroupCount).Error + if err != nil { + return + } + if persongroupCount > 0 { + status = true + } + case "department": + var departmentCount int + err = connection.DB.Self.Model(&user.Info{}). + Where("dept in (?) and id = ?", currentStateValue["processor"].([]interface{}), c.GetInt("userId")). + Count(&departmentCount).Error + if err != nil { + return + } + if departmentCount > 0 { + status = true + } + case "variable": + for _, p := range currentStateValue["processor"].([]interface{}) { + switch int(p.(float64)) { + case 1: + if workOrderInfo.Creator == c.GetInt("userId") { + status = true + } + case 2: + err = connection.DB.Self.Model(&userInfo).Where("id = ?", workOrderInfo.Creator).Find(&userInfo).Error + if err != nil { + return + } + err = connection.DB.Self.Model(&userDept).Where("id = ?", userInfo.Dept).Find(&userDept).Error + if err != nil { + return + } + + if userDept.Approver == c.GetInt("userId") { + status = true + } else if userDept.Leader == c.GetInt("userId") { + status = true + } + } + } + } + return +} diff --git a/pkg/service/workOrderList.go b/pkg/service/workOrderList.go new file mode 100644 index 00000000..2ac31e34 --- /dev/null +++ b/pkg/service/workOrderList.go @@ -0,0 +1,124 @@ +package service + +import ( + "encoding/json" + "ferry/models/user" + "ferry/models/workOrder" + "ferry/pkg/connection" + "ferry/pkg/pagination" + "fmt" + "strings" + + "github.com/gin-gonic/gin" +) + +/* + @Author : lanyulei +*/ + +func WorkOrderList(c *gin.Context, classify int) (result interface{}, err error) { + type workOrderInfo struct { + workOrder.Info + Principals string `json:"principals"` + DataClassify int `json:"data_classify"` + } + var ( + workOrderInfoList []workOrderInfo + principals string + userInfo user.Info + StateList []map[string]interface{} + ) + + title := c.DefaultQuery("title", "") + db := connection.DB.Self.Model(&workOrder.Info{}).Where("title like ?", fmt.Sprintf("%%%v%%", title)) + + err = connection.DB.Self.Model(&user.Info{}).Where("id = ?", c.GetInt("userId")).Find(&userInfo).Error + if err != nil { + return + } + + // 获取当前用户信息 + switch classify { + case 1: + // 待办工单 + // 1. 个人 + personSelect := fmt.Sprintf("(JSON_CONTAINS(state, JSON_OBJECT('processor', %v)) and JSON_CONTAINS(state, JSON_OBJECT('process_method', 'person')))", c.GetInt("userId")) + + // 2. 小组 + groupList := make([]int, 0) + err = connection.DB.Self.Model(&user.UserGroup{}). + Where("user = ?", c.GetInt("userId")). + Pluck("`group`", &groupList).Error + if err != nil { + return + } + groupSqlList := make([]string, 0) + if len(groupList) > 0 { + for _, group := range groupList { + groupSqlList = append(groupSqlList, fmt.Sprintf("JSON_CONTAINS(state, JSON_OBJECT('processor', %v))", group)) + } + } else { + groupSqlList = append(groupSqlList, fmt.Sprintf("JSON_CONTAINS(state, JSON_OBJECT('processor', 0))")) + } + + personGroupSelect := fmt.Sprintf( + "((%v) and %v)", + strings.Join(groupSqlList, " or "), + "JSON_CONTAINS(state, JSON_OBJECT('process_method', 'persongroup'))", + ) + + // 3. 部门 + departmentSelect := fmt.Sprintf("(JSON_CONTAINS(state, JSON_OBJECT('processor', %v)) and JSON_CONTAINS(state, JSON_OBJECT('process_method', 'department')))", userInfo.Dept) + + // 4. 变量 + variableSelect := fmt.Sprintf("((%v) or (%v))", + fmt.Sprintf("JSON_CONTAINS(state, JSON_OBJECT('processor', 1)) and JSON_CONTAINS(state, JSON_OBJECT('process_method', 'variable')) and creator = %v", c.GetInt("userId")), + fmt.Sprintf("JSON_CONTAINS(state, JSON_OBJECT('processor', 2)) and JSON_CONTAINS(state, JSON_OBJECT('process_method', 'variable')) and creator = %v", userInfo.Dept), + ) + + db = db.Where(fmt.Sprintf("(%v or %v or %v or %v) and is_end = 0", personSelect, personGroupSelect, departmentSelect, variableSelect)) + case 2: + // 我创建的 + db = db.Where("creator = ?", c.GetInt("userId")) + case 3: + // 我相关的 + db = db.Where(fmt.Sprintf("JSON_CONTAINS(related_person, '%v')", c.GetInt("userId"))) + case 4: + // 所有工单 + default: + return nil, fmt.Errorf("请确认查询的数据类型是否正确") + } + + result, err = pagination.Paging(&pagination.Param{ + C: c, + DB: db, + }, &workOrderInfoList) + if err != nil { + err = fmt.Errorf("查询工单列表失败,%v", err.Error()) + return + } + + for i, w := range *result.(*pagination.Paginator).Data.(*[]workOrderInfo) { + err = json.Unmarshal(w.State, &StateList) + if err != nil { + err = fmt.Errorf("json反序列化失败,%v", err.Error()) + return + } + if len(StateList) != 0 { + processorList := make([]int, 0) + for _, v := range StateList[0]["processor"].([]interface{}) { + processorList = append(processorList, int(v.(float64))) + } + principals, err = GetPrincipal(processorList, StateList[0]["process_method"].(string)) + if err != nil { + err = fmt.Errorf("查询处理人名称失败,%v", err.Error()) + return + } + } + workOrderDetails := *result.(*pagination.Paginator).Data.(*[]workOrderInfo) + workOrderDetails[i].Principals = principals + workOrderDetails[i].DataClassify = classify + } + + return result, nil +} diff --git a/pkg/task/send.go b/pkg/task/send.go new file mode 100644 index 00000000..7902f789 --- /dev/null +++ b/pkg/task/send.go @@ -0,0 +1,14 @@ +package task + +/* + @Author : lanyulei +*/ + +import ( + "context" + "ferry/pkg/task/worker" +) + +func Send(classify string, scriptPath string) { + worker.SendTask(context.Background(), classify, scriptPath) +} diff --git a/pkg/task/server.go b/pkg/task/server.go new file mode 100644 index 00000000..0ff8812d --- /dev/null +++ b/pkg/task/server.go @@ -0,0 +1,19 @@ +package task + +/* + @Author : lanyulei +*/ + +import ( + "ferry/pkg/logger" + "ferry/pkg/task/worker" +) + +func Start() { + // 启动异步任务框架 + taskWorker := worker.NewAsyncTaskWorker(0) + err := taskWorker.Launch() + if err != nil { + logger.Errorf("启动machinery失败,%v", err.Error()) + } +} diff --git a/pkg/task/worker/tasks.go b/pkg/task/worker/tasks.go new file mode 100644 index 00000000..27c02a34 --- /dev/null +++ b/pkg/task/worker/tasks.go @@ -0,0 +1,71 @@ +package worker + +import ( + "context" + "os/exec" + "syscall" + + "github.com/RichardKnop/machinery/v1/log" + "github.com/RichardKnop/machinery/v1/tasks" +) + +var asyncTaskMap map[string]interface{} + +func executeTaskBase(scriptPath string) { + command := exec.Command("/bin/bash", "-c", scriptPath) //初始化Cmd + err := command.Start() //运行脚本 + if nil != err { + log.ERROR.Printf("task exec failed,%v", err.Error()) + return + } + + log.INFO.Println("Process PID:", command.Process.Pid) + + err = command.Wait() //等待执行完成 + if nil != err { + log.ERROR.Printf("task exec failed,%v", err.Error()) + return + } + + log.INFO.Println("ProcessState PID:", command.ProcessState.Pid()) + log.INFO.Println("Exit Code", command.ProcessState.Sys().(syscall.WaitStatus).ExitStatus()) +} + +// ExecCommand 异步任务 +func ExecCommand(classify string, scriptPath string) error { + if classify == "shell" { + log.INFO.Println("start exec shell...", scriptPath) + executeTaskBase(scriptPath) + return nil + } else if classify == "python" { + log.INFO.Println("start exec python...", scriptPath) + executeTaskBase(scriptPath) + return nil + } + return nil +} + +func SendTask(ctx context.Context, classify string, scriptPath string) { + args := make([]tasks.Arg, 0) + args = append(args, tasks.Arg{ + Name: "classify", + Type: "string", + Value: classify, + }) + args = append(args, tasks.Arg{ + Name: "scriptPath", + Type: "string", + Value: scriptPath, + }) + task, _ := tasks.NewSignature("ExecCommandTask", args) + task.RetryCount = 5 + _, err := AsyncTaskCenter.SendTaskWithContext(ctx, task) + if err != nil { + log.ERROR.Println(err.Error()) + } +} + +func initAsyncTaskMap() { + asyncTaskMap = make(map[string]interface{}) + asyncTaskMap["ExecCommandTask"] = ExecCommand +} diff --git a/pkg/task/worker/worker.go b/pkg/task/worker/worker.go new file mode 100644 index 00000000..f52cb49b --- /dev/null +++ b/pkg/task/worker/worker.go @@ -0,0 +1,50 @@ +package worker + +import ( + "github.com/RichardKnop/machinery/v1" + taskConfig "github.com/RichardKnop/machinery/v1/config" + "github.com/RichardKnop/machinery/v1/log" + "github.com/RichardKnop/machinery/v1/tasks" +) + +var AsyncTaskCenter *machinery.Server + +func init() { + tc, err := NewTaskCenter() + if err != nil { + panic(err) + } + AsyncTaskCenter = tc +} + +func NewTaskCenter() (*machinery.Server, error) { + cnf := &taskConfig.Config{ + Broker: "redis://127.0.0.1:6379", + DefaultQueue: "ServerTasksQueue", + ResultBackend: "eager", + } + server, err := machinery.NewServer(cnf) + if err != nil { + return nil, err + } + initAsyncTaskMap() + return server, server.RegisterTasks(asyncTaskMap) +} + +func NewAsyncTaskWorker(concurrency int) *machinery.Worker { + consumerTag := "TaskWorker" + worker := AsyncTaskCenter.NewWorker(consumerTag, concurrency) + errorHandler := func(err error) { + log.ERROR.Println("执行失败: ", err) + } + preTaskHandler := func(signature *tasks.Signature) { + log.INFO.Println("开始执行: ", signature.Name) + } + postTaskHandler := func(signature *tasks.Signature) { + log.INFO.Println("执行结束: ", signature.Name) + } + worker.SetPostTaskHandler(postTaskHandler) + worker.SetErrorHandler(errorHandler) + worker.SetPreTaskHandler(preTaskHandler) + return worker +} diff --git a/router/init_router.go b/router/init_router.go index ffb716f9..405c2618 100644 --- a/router/init_router.go +++ b/router/init_router.go @@ -24,9 +24,5 @@ func InitRouter() *gin.Engine { // 注册系统路由 InitSysRouter(r, authMiddleware) - // 注册业务路由 - // TODO: 这里可存放业务路由,里边并无实际路由是有演示代码 - InitExamplesRouter(r, authMiddleware) - return r } diff --git a/router/process/classify.go b/router/process/classify.go new file mode 100644 index 00000000..bac6691c --- /dev/null +++ b/router/process/classify.go @@ -0,0 +1,23 @@ +package process + +/* + @Author : lanyulei +*/ + +import ( + "ferry/apis/process" + "ferry/middleware" + jwt "ferry/pkg/jwtauth" + + "github.com/gin-gonic/gin" +) + +func RegisterClassifyRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { + classify := v1.Group("/classify").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) + { + classify.GET("", process.ClassifyList) + classify.POST("", process.CreateClassify) + classify.PUT("", process.UpdateClassify) + classify.DELETE("", process.DeleteClassify) + } +} diff --git a/router/process/process.go b/router/process/process.go new file mode 100644 index 00000000..8090623f --- /dev/null +++ b/router/process/process.go @@ -0,0 +1,23 @@ +package process + +/* + @Author : lanyulei +*/ + +import ( + jwt "ferry/pkg/jwtauth" + + "github.com/gin-gonic/gin" +) + +func RegisterProcessRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { + //processRouter := v1.Group("/process").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) + //{ + //processRouter.GET("/classify", process.ClassifyProcessList) + //processRouter.GET("", process.ProcessList) + //processRouter.POST("", process.CreateProcess) + //processRouter.PUT("", process.UpdateProcess) + //processRouter.DELETE("", process.DeleteProcess) + //processRouter.GET("/details", process.ProcessDetails) + //} +} diff --git a/router/process/task.go b/router/process/task.go new file mode 100644 index 00000000..7c191124 --- /dev/null +++ b/router/process/task.go @@ -0,0 +1,22 @@ +package process + +import ( + jwt "ferry/pkg/jwtauth" + + "github.com/gin-gonic/gin" +) + +/* + @Author : lanyulei +*/ + +func RegisterTaskRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { + //taskRouter := v1.Group("/task").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) + //{ + // taskRouter.GET("", process.TaskList) + // taskRouter.GET("/details", process.TaskDetails) + // taskRouter.POST("", process.CreateTask) + // taskRouter.PUT("", process.UpdateTask) + // taskRouter.DELETE("", process.DeleteTask) + //} +} diff --git a/router/process/tpl.go b/router/process/tpl.go new file mode 100644 index 00000000..5a8eae3a --- /dev/null +++ b/router/process/tpl.go @@ -0,0 +1,24 @@ +/* + @Author : lanyulei +*/ + +package process + +import ( + //"ferry/apis/process" + //"ferry/middleware" + jwt "ferry/pkg/jwtauth" + + "github.com/gin-gonic/gin" +) + +func RegisterTplRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { + //tplRouter := v1.Group("/tpl").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) + //{ + // tplRouter.GET("", process.TemplateList) + // tplRouter.POST("", process.CreateTemplate) + // tplRouter.PUT("", process.UpdateTemplate) + // tplRouter.DELETE("", process.DeleteTemplate) + // tplRouter.GET("/details", process.TemplateDetails) + //} +} diff --git a/router/process/workOrder.go b/router/process/workOrder.go new file mode 100644 index 00000000..c30c4d4f --- /dev/null +++ b/router/process/workOrder.go @@ -0,0 +1,23 @@ +/* + @Author : lanyulei +*/ + +package process + +import ( + jwt "ferry/pkg/jwtauth" + + "github.com/gin-gonic/gin" +) + +func RegisterWorkOrderRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { + //workOrderRouter := v1.Group("/work-order").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) + //{ + // workOrderRouter.GET("/process-structure", process.ProcessStructure) + // workOrderRouter.POST("/create", process.CreateWorkOrder) + // workOrderRouter.GET("/list", process.WorkOrderList) + // workOrderRouter.POST("/handle", process.ProcessWorkOrder) + // workOrderRouter.GET("/unity", process.UnityWorkOrder) + // workOrderRouter.POST("/inversion", process.InversionWorkOrder) + //} +} diff --git a/router/router.go b/router/router.go index 636cc64a..80be93ff 100644 --- a/router/router.go +++ b/router/router.go @@ -1,37 +1,82 @@ package router import ( + "ferry/apis/monitor" + "ferry/apis/system" + "ferry/handler" "ferry/pkg/jwtauth" jwt "ferry/pkg/jwtauth" + "ferry/router/process" + systemRouter "ferry/router/system" + + ginSwagger "github.com/swaggo/gin-swagger" + "github.com/swaggo/gin-swagger/swaggerFiles" "github.com/gin-gonic/gin" _ "github.com/gin-gonic/gin" ) -// 路由示例 -func InitExamplesRouter(r *gin.Engine, authMiddleware *jwt.GinJWTMiddleware) *gin.Engine { +func InitSysRouter(r *gin.Engine, authMiddleware *jwt.GinJWTMiddleware) *gin.RouterGroup { + g := r.Group("") + + sysBaseRouter(g) + // 静态文件 + sysStaticFileRouter(g) + + // swagger;注意:生产环境可以注释掉 + sysSwaggerRouter(g) - // 无需认证的路由 - examplesNoCheckRoleRouter(r) - // 需要认证的路由 - examplesCheckRoleRouter(r, authMiddleware) + // 无需认证 + sysNoCheckRoleRouter(g) + // 需要认证 + sysCheckRoleRouterInit(g, authMiddleware) - return r + return g } -// 无需认证的路由示例 -func examplesNoCheckRoleRouter(r *gin.Engine) { +func sysBaseRouter(r *gin.RouterGroup) { + r.GET("/", system.HelloWorld) + r.GET("/info", handler.Ping) +} - //v1 := r.Group("/api/v1") - //v1.GET("/examples/list", examples.apis) +func sysStaticFileRouter(r *gin.RouterGroup) { + r.Static("/static", "./static") +} +func sysSwaggerRouter(r *gin.RouterGroup) { + r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) } -// 需要认证的路由示例 -func examplesCheckRoleRouter(r *gin.Engine, authMiddleware *jwtauth.GinJWTMiddleware) { - //v1 := r.Group("/api/v1") - //v1auth := v1.Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) - //{ - // v1auth.GET("/examples/list", examples.apis) - //} +func sysNoCheckRoleRouter(r *gin.RouterGroup) { + v1 := r.Group("/api/v1") + + v1.GET("/monitor/server", monitor.ServerInfo) + v1.GET("/getCaptcha", system.GenerateCaptchaHandler) + v1.GET("/menuTreeselect", system.GetMenuTreeelect) +} + +func sysCheckRoleRouterInit(r *gin.RouterGroup, authMiddleware *jwtauth.GinJWTMiddleware) { + r.POST("/login", authMiddleware.LoginHandler) + // Refresh time can be longer than token timeout + r.GET("/refresh_token", authMiddleware.RefreshHandler) + + v1 := r.Group("/api/v1") + + // 系统管理 + systemRouter.RegisterPageRouter(v1, authMiddleware) + systemRouter.RegisterBaseRouter(v1, authMiddleware) + systemRouter.RegisterDeptRouter(v1, authMiddleware) + systemRouter.RegisterSysUserRouter(v1, authMiddleware) + systemRouter.RegisterRoleRouter(v1, authMiddleware) + systemRouter.RegisterUserCenterRouter(v1, authMiddleware) + systemRouter.RegisterPostRouter(v1, authMiddleware) + systemRouter.RegisterMenuRouter(v1, authMiddleware) + systemRouter.RegisterLoginLogRouter(v1, authMiddleware) + + // 流程中心 + process.RegisterClassifyRouter(v1, authMiddleware) + process.RegisterProcessRouter(v1, authMiddleware) + process.RegisterTaskRouter(v1, authMiddleware) + process.RegisterTplRouter(v1, authMiddleware) + process.RegisterWorkOrderRouter(v1, authMiddleware) } diff --git a/router/sys_router.go b/router/system/sys_router.go similarity index 58% rename from router/sys_router.go rename to router/system/sys_router.go index 71bc3f5d..346e98fd 100644 --- a/router/sys_router.go +++ b/router/system/sys_router.go @@ -1,77 +1,17 @@ -package router +package system import ( log2 "ferry/apis/log" - "ferry/apis/monitor" "ferry/apis/system" _ "ferry/docs" "ferry/handler" "ferry/middleware" - "ferry/pkg/jwtauth" jwt "ferry/pkg/jwtauth" "github.com/gin-gonic/gin" - ginSwagger "github.com/swaggo/gin-swagger" - "github.com/swaggo/gin-swagger/swaggerFiles" ) -func InitSysRouter(r *gin.Engine, authMiddleware *jwt.GinJWTMiddleware) *gin.RouterGroup { - g := r.Group("") - sysBaseRouter(g) - // 静态文件 - sysStaticFileRouter(g) - - // swagger;注意:生产环境可以注释掉 - sysSwaggerRouter(g) - - // 无需认证 - sysNoCheckRoleRouter(g) - // 需要认证 - sysCheckRoleRouterInit(g, authMiddleware) - - return g -} - -func sysBaseRouter(r *gin.RouterGroup) { - r.GET("/", system.HelloWorld) - r.GET("/info", handler.Ping) -} - -func sysStaticFileRouter(r *gin.RouterGroup) { - r.Static("/static", "./static") -} - -func sysSwaggerRouter(r *gin.RouterGroup) { - r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) -} - -func sysNoCheckRoleRouter(r *gin.RouterGroup) { - v1 := r.Group("/api/v1") - - v1.GET("/monitor/server", monitor.ServerInfo) - v1.GET("/getCaptcha", system.GenerateCaptchaHandler) - v1.GET("/menuTreeselect", system.GetMenuTreeelect) -} - -func sysCheckRoleRouterInit(r *gin.RouterGroup, authMiddleware *jwtauth.GinJWTMiddleware) { - r.POST("/login", authMiddleware.LoginHandler) - // Refresh time can be longer than token timeout - r.GET("/refresh_token", authMiddleware.RefreshHandler) - - v1 := r.Group("/api/v1") - - registerPageRouter(v1, authMiddleware) - registerBaseRouter(v1, authMiddleware) - registerDeptRouter(v1, authMiddleware) - registerSysUserRouter(v1, authMiddleware) - registerRoleRouter(v1, authMiddleware) - registerUserCenterRouter(v1, authMiddleware) - registerPostRouter(v1, authMiddleware) - registerMenuRouter(v1, authMiddleware) - registerLoginLogRouter(v1, authMiddleware) -} - -func registerBaseRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { +func RegisterBaseRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { v1auth := v1.Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) { v1auth.GET("/getinfo", system.GetInfo) @@ -85,7 +25,7 @@ func registerBaseRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddlewar } } -func registerPageRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { +func RegisterPageRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { v1auth := v1.Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) { v1auth.GET("/deptList", system.GetDeptList) @@ -98,7 +38,7 @@ func registerPageRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddlewar } } -func registerUserCenterRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { +func RegisterUserCenterRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { user := v1.Group("/user").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) { user.GET("/profile", system.GetSysUserProfile) @@ -107,7 +47,7 @@ func registerUserCenterRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMid } } -func registerLoginLogRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { +func RegisterLoginLogRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { loginlog := v1.Group("/loginlog").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) { loginlog.GET("/:infoId", log2.GetLoginLog) @@ -117,7 +57,7 @@ func registerLoginLogRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddl } } -func registerPostRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { +func RegisterPostRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { post := v1.Group("/post").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) { post.GET("/:postId", system.GetPost) @@ -127,7 +67,7 @@ func registerPostRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddlewar } } -func registerMenuRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { +func RegisterMenuRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { menu := v1.Group("/menu").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) { menu.GET("/:id", system.GetMenu) @@ -137,7 +77,7 @@ func registerMenuRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddlewar } } -func registerRoleRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { +func RegisterRoleRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { role := v1.Group("/role").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) { role.GET("/:roleId", system.GetRole) @@ -147,7 +87,7 @@ func registerRoleRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddlewar } } -func registerSysUserRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { +func RegisterSysUserRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { sysuser := v1.Group("/sysUser").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) { sysuser.GET("/:userId", system.GetSysUser) @@ -158,7 +98,7 @@ func registerSysUserRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddle } } -func registerDeptRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { +func RegisterDeptRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { dept := v1.Group("/dept").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) { dept.GET("/:deptId", system.GetDept)