diff --git a/pkg/microservice/aslan/core/common/repository/mongodb/release_plan.go b/pkg/microservice/aslan/core/common/repository/mongodb/release_plan.go index 26946bae80c..88cce49264a 100644 --- a/pkg/microservice/aslan/core/common/repository/mongodb/release_plan.go +++ b/pkg/microservice/aslan/core/common/repository/mongodb/release_plan.go @@ -101,11 +101,15 @@ func (c *ReleasePlanColl) DeleteByID(ctx context.Context, idString string) error } type ListReleasePlanOption struct { - PageNum int64 - PageSize int64 - IsSort bool - ExcludedFields []string - Status config.ReleasePlanStatus + PageNum int64 + PageSize int64 + Name string + Manager string + SuccessTimeStart int64 + SuccessTimeEnd int64 + IsSort bool + ExcludedFields []string + Status config.ReleasePlanStatus } func (c *ReleasePlanColl) ListByOptions(opt *ListReleasePlanOption) ([]*models.ReleasePlan, int64, error) { @@ -125,6 +129,15 @@ func (c *ReleasePlanColl) ListByOptions(opt *ListReleasePlanOption) ([]*models.R opts.SetSkip((opt.PageNum - 1) * opt.PageSize) opts.SetLimit(opt.PageSize) } + if opt.Name != "" { + query["name"] = bson.M{"$regex": fmt.Sprintf(".*%s.*", opt.Name), "$options": "i"} + } + if opt.Manager != "" { + query["manager"] = opt.Manager + } + if opt.SuccessTimeStart > 0 && opt.SuccessTimeEnd > 0 { + query["success_time"] = bson.M{"$gte": opt.SuccessTimeStart, "$lte": opt.SuccessTimeEnd} + } if opt.Status != "" { query["status"] = opt.Status } diff --git a/pkg/microservice/aslan/core/release_plan/handler/release_plan.go b/pkg/microservice/aslan/core/release_plan/handler/release_plan.go index 2317cf97d4e..ce1a1f46917 100644 --- a/pkg/microservice/aslan/core/release_plan/handler/release_plan.go +++ b/pkg/microservice/aslan/core/release_plan/handler/release_plan.go @@ -28,42 +28,6 @@ import ( e "github.com/koderover/zadig/v2/pkg/tool/errors" ) -type ListReleasePlanOption struct { - PageNum int64 `form:"pageNum" binding:"required"` - PageSize int64 `form:"pageSize" binding:"required"` -} - -func ListReleasePlans(c *gin.Context) { - ctx, err := internalhandler.NewContextWithAuthorization(c) - defer func() { internalhandler.JSONResponse(c, ctx) }() - - if err != nil { - - ctx.Err = fmt.Errorf("authorization Info Generation failed: err %s", err) - ctx.UnAuthorized = true - return - } - - if !ctx.Resources.IsSystemAdmin && !ctx.Resources.SystemActions.ReleasePlan.View { - ctx.UnAuthorized = true - return - } - - opt := new(ListReleasePlanOption) - if err := c.ShouldBindQuery(&opt); err != nil { - ctx.Err = e.ErrInvalidParam.AddDesc(err.Error()) - return - } - - err = commonutil.CheckZadigEnterpriseLicense() - if err != nil { - ctx.Err = err - return - } - - ctx.Resp, ctx.Err = service.ListReleasePlans(opt.PageNum, opt.PageSize) -} - func GetReleasePlan(c *gin.Context) { ctx, err := internalhandler.NewContextWithAuthorization(c) defer func() { internalhandler.JSONResponse(c, ctx) }() @@ -313,3 +277,44 @@ func ApproveReleasePlan(c *gin.Context) { ctx.Err = service.ApproveReleasePlan(ctx, c.Param("id"), req) } + +// @Summary List Release Plans +// @Description List Release Plans +// @Tags releasePlan +// @Accept json +// @Produce json +// @Param pageNum query int true "page num" +// @Param pageSize query int true "page size" +// @Param type query service.ListReleasePlanType true "search type" +// @Param keyword query string true "search keyword, 当类型为success_time时,值应为'开始时间戳-结束时间戳'的形式" +// @Success 200 {object} service.ListReleasePlanResp +// @Router /api/aslan/release_plan/v1 [get] +func ListReleasePlans(c *gin.Context) { + ctx, err := internalhandler.NewContextWithAuthorization(c) + defer func() { internalhandler.JSONResponse(c, ctx) }() + + if err != nil { + ctx.Err = fmt.Errorf("authorization Info Generation failed: err %s", err) + ctx.UnAuthorized = true + return + } + + if !ctx.Resources.IsSystemAdmin && !ctx.Resources.SystemActions.ReleasePlan.View { + ctx.UnAuthorized = true + return + } + + err = commonutil.CheckZadigEnterpriseLicense() + if err != nil { + ctx.Err = err + return + } + + opt := new(service.ListReleasePlanOption) + if err := c.ShouldBindQuery(&opt); err != nil { + ctx.Err = e.ErrInvalidParam.AddDesc(err.Error()) + return + } + + ctx.Resp, ctx.Err = service.ListReleasePlans(opt) +} diff --git a/pkg/microservice/aslan/core/release_plan/service/release_plan.go b/pkg/microservice/aslan/core/release_plan/service/release_plan.go index 719b526093f..c605926eac8 100644 --- a/pkg/microservice/aslan/core/release_plan/service/release_plan.go +++ b/pkg/microservice/aslan/core/release_plan/service/release_plan.go @@ -20,6 +20,8 @@ import ( "context" "encoding/json" "fmt" + "strconv" + "strings" "time" "github.com/gin-gonic/gin" @@ -219,27 +221,6 @@ func upsertReleasePlanCron(id, name string, index int64, ScheduleExecuteTime int return nil } -type ListReleasePlanResp struct { - List []*models.ReleasePlan `json:"list"` - Total int64 `json:"total"` -} - -func ListReleasePlans(pageNum, pageSize int64) (*ListReleasePlanResp, error) { - list, total, err := mongodb.NewReleasePlanColl().ListByOptions(&mongodb.ListReleasePlanOption{ - PageNum: pageNum, - PageSize: pageSize, - IsSort: true, - ExcludedFields: []string{"jobs", "logs"}, - }) - if err != nil { - return nil, errors.Wrap(err, "ListReleasePlans") - } - return &ListReleasePlanResp{ - List: list, - Total: total, - }, nil -} - func GetReleasePlan(id string) (*models.ReleasePlan, error) { releasePlan, err := mongodb.NewReleasePlanColl().GetByID(context.Background(), id) if err != nil { @@ -900,3 +881,91 @@ func cronJobToSchedule(input *commonmodels.Cronjob) *commonmodels.Schedule { Enabled: input.Enabled, } } + +type ListReleasePlanType string + +const ( + ListReleasePlanTypeName ListReleasePlanType = "name" + ListReleasePlanTypeManager ListReleasePlanType = "manager" + ListReleasePlanTypeSuccessTime ListReleasePlanType = "success_time" + ListReleasePlanTypeStatus ListReleasePlanType = "status" +) + +type ListReleasePlanOption struct { + PageNum int64 `form:"pageNum" binding:"required"` + PageSize int64 `form:"pageSize" binding:"required"` + Type ListReleasePlanType `form:"type" binding:"required"` + Keyword string `form:"keyword"` +} + +type ListReleasePlanResp struct { + List []*models.ReleasePlan `json:"list"` + Total int64 `json:"total"` +} + +func ListReleasePlans(opt *ListReleasePlanOption) (*ListReleasePlanResp, error) { + var ( + list []*commonmodels.ReleasePlan + total int64 + err error + ) + switch opt.Type { + case ListReleasePlanTypeName: + list, total, err = mongodb.NewReleasePlanColl().ListByOptions(&mongodb.ListReleasePlanOption{ + Name: opt.Keyword, + IsSort: true, + PageNum: opt.PageNum, + PageSize: opt.PageSize, + ExcludedFields: []string{"jobs", "logs"}, + }) + case ListReleasePlanTypeManager: + list, total, err = mongodb.NewReleasePlanColl().ListByOptions(&mongodb.ListReleasePlanOption{ + Manager: opt.Keyword, + IsSort: true, + PageNum: opt.PageNum, + PageSize: opt.PageSize, + ExcludedFields: []string{"jobs", "logs"}, + }) + case ListReleasePlanTypeSuccessTime: + timeArr := strings.Split(opt.Keyword, "-") + if len(timeArr) != 2 { + return nil, errors.New("invalid success time range") + } + + timeStart := int64(0) + timeEnd := int64(0) + timeStart, err = strconv.ParseInt(timeArr[0], 10, 64) + if err != nil { + return nil, errors.Wrap(err, "invalid success time start") + } + timeEnd, err = strconv.ParseInt(timeArr[1], 10, 64) + if err != nil { + return nil, errors.Wrap(err, "invalid success time end") + } + + list, total, err = mongodb.NewReleasePlanColl().ListByOptions(&mongodb.ListReleasePlanOption{ + SuccessTimeStart: timeStart, + SuccessTimeEnd: timeEnd, + IsSort: true, + PageNum: opt.PageNum, + PageSize: opt.PageSize, + ExcludedFields: []string{"jobs", "logs"}, + }) + case ListReleasePlanTypeStatus: + list, total, err = mongodb.NewReleasePlanColl().ListByOptions(&mongodb.ListReleasePlanOption{ + Status: config.ReleasePlanStatus(opt.Keyword), + IsSort: true, + PageNum: opt.PageNum, + PageSize: opt.PageSize, + ExcludedFields: []string{"jobs", "logs"}, + }) + } + if err != nil { + return nil, errors.Wrap(err, "SearchReleasePlans") + } + + return &ListReleasePlanResp{ + List: list, + Total: total, + }, nil +} diff --git a/pkg/microservice/aslan/server/rest/doc/docs.go b/pkg/microservice/aslan/server/rest/doc/docs.go index a8e0df00084..b3f4a9d8b0f 100644 --- a/pkg/microservice/aslan/server/rest/doc/docs.go +++ b/pkg/microservice/aslan/server/rest/doc/docs.go @@ -3224,6 +3224,65 @@ const docTemplate = `{ } } }, + "/api/aslan/release_plan/v1": { + "get": { + "description": "List Release Plans", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "releasePlan" + ], + "summary": "List Release Plans", + "parameters": [ + { + "type": "integer", + "description": "page num", + "name": "pageNum", + "in": "query", + "required": true + }, + { + "type": "integer", + "description": "page size", + "name": "pageSize", + "in": "query", + "required": true + }, + { + "enum": [ + "name", + "manager", + "success_time", + "status" + ], + "type": "string", + "description": "search type", + "name": "type", + "in": "query", + "required": true + }, + { + "type": "string", + "description": "search keyword, 当类型为success_time时,值应为'开始时间戳-结束时间戳'的形式", + "name": "keyword", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/service.ListReleasePlanResp" + } + } + } + } + }, "/api/aslan/service/services": { "post": { "description": "Create service template", @@ -5039,6 +5098,23 @@ const docTemplate = `{ "JobWorkflow" ] }, + "config.ReleasePlanStatus": { + "type": "string", + "enum": [ + "planning", + "waitforapprove", + "executing", + "success", + "cancel" + ], + "x-enum-varnames": [ + "StatusPlanning", + "StatusWaitForApprove", + "StatusExecuting", + "StatusSuccess", + "StatusCancel" + ] + }, "config.ScanningModuleType": { "type": "string", "enum": [ @@ -7259,6 +7335,75 @@ const docTemplate = `{ } } }, + "models.ReleasePlan": { + "type": "object", + "properties": { + "approval": { + "$ref": "#/definitions/models.Approval" + }, + "approval_time": { + "type": "integer" + }, + "create_time": { + "type": "integer" + }, + "created_by": { + "type": "string" + }, + "description": { + "type": "string" + }, + "end_time": { + "type": "integer" + }, + "executing_time": { + "type": "integer" + }, + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "jobs": { + "type": "array", + "items": { + "$ref": "#/definitions/models.ReleaseJob" + } + }, + "manager": { + "type": "string" + }, + "manager_id": { + "description": "ManagerID is the user id of the manager", + "type": "string" + }, + "name": { + "type": "string" + }, + "planning_time": { + "type": "integer" + }, + "schedule_execute_time": { + "type": "integer" + }, + "start_time": { + "type": "integer" + }, + "status": { + "$ref": "#/definitions/config.ReleasePlanStatus" + }, + "success_time": { + "type": "integer" + }, + "update_time": { + "type": "integer" + }, + "updated_by": { + "type": "string" + } + } + }, "models.ReleasePlanTemplate": { "type": "object", "properties": { @@ -9089,6 +9234,20 @@ const docTemplate = `{ } } }, + "service.ListReleasePlanResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/models.ReleasePlan" + } + }, + "total": { + "type": "integer" + } + } + }, "service.ListServiceVersionsResponse": { "type": "object", "properties": { diff --git a/pkg/microservice/aslan/server/rest/doc/swagger.json b/pkg/microservice/aslan/server/rest/doc/swagger.json index 23da5d2506e..a9bb899f81e 100644 --- a/pkg/microservice/aslan/server/rest/doc/swagger.json +++ b/pkg/microservice/aslan/server/rest/doc/swagger.json @@ -3215,6 +3215,65 @@ } } }, + "/api/aslan/release_plan/v1": { + "get": { + "description": "List Release Plans", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "releasePlan" + ], + "summary": "List Release Plans", + "parameters": [ + { + "type": "integer", + "description": "page num", + "name": "pageNum", + "in": "query", + "required": true + }, + { + "type": "integer", + "description": "page size", + "name": "pageSize", + "in": "query", + "required": true + }, + { + "enum": [ + "name", + "manager", + "success_time", + "status" + ], + "type": "string", + "description": "search type", + "name": "type", + "in": "query", + "required": true + }, + { + "type": "string", + "description": "search keyword, 当类型为success_time时,值应为'开始时间戳-结束时间戳'的形式", + "name": "keyword", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/service.ListReleasePlanResp" + } + } + } + } + }, "/api/aslan/service/services": { "post": { "description": "Create service template", @@ -5030,6 +5089,23 @@ "JobWorkflow" ] }, + "config.ReleasePlanStatus": { + "type": "string", + "enum": [ + "planning", + "waitforapprove", + "executing", + "success", + "cancel" + ], + "x-enum-varnames": [ + "StatusPlanning", + "StatusWaitForApprove", + "StatusExecuting", + "StatusSuccess", + "StatusCancel" + ] + }, "config.ScanningModuleType": { "type": "string", "enum": [ @@ -7250,6 +7326,75 @@ } } }, + "models.ReleasePlan": { + "type": "object", + "properties": { + "approval": { + "$ref": "#/definitions/models.Approval" + }, + "approval_time": { + "type": "integer" + }, + "create_time": { + "type": "integer" + }, + "created_by": { + "type": "string" + }, + "description": { + "type": "string" + }, + "end_time": { + "type": "integer" + }, + "executing_time": { + "type": "integer" + }, + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "jobs": { + "type": "array", + "items": { + "$ref": "#/definitions/models.ReleaseJob" + } + }, + "manager": { + "type": "string" + }, + "manager_id": { + "description": "ManagerID is the user id of the manager", + "type": "string" + }, + "name": { + "type": "string" + }, + "planning_time": { + "type": "integer" + }, + "schedule_execute_time": { + "type": "integer" + }, + "start_time": { + "type": "integer" + }, + "status": { + "$ref": "#/definitions/config.ReleasePlanStatus" + }, + "success_time": { + "type": "integer" + }, + "update_time": { + "type": "integer" + }, + "updated_by": { + "type": "string" + } + } + }, "models.ReleasePlanTemplate": { "type": "object", "properties": { @@ -9080,6 +9225,20 @@ } } }, + "service.ListReleasePlanResp": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/models.ReleasePlan" + } + }, + "total": { + "type": "integer" + } + } + }, "service.ListServiceVersionsResponse": { "type": "object", "properties": { diff --git a/pkg/microservice/aslan/server/rest/doc/swagger.yaml b/pkg/microservice/aslan/server/rest/doc/swagger.yaml index 1527783ebf1..0395d897e5b 100644 --- a/pkg/microservice/aslan/server/rest/doc/swagger.yaml +++ b/pkg/microservice/aslan/server/rest/doc/swagger.yaml @@ -95,6 +95,20 @@ definitions: x-enum-varnames: - JobText - JobWorkflow + config.ReleasePlanStatus: + enum: + - planning + - waitforapprove + - executing + - success + - cancel + type: string + x-enum-varnames: + - StatusPlanning + - StatusWaitForApprove + - StatusExecuting + - StatusSuccess + - StatusCancel config.ScanningModuleType: enum: - "" @@ -1592,6 +1606,52 @@ definitions: updated type: boolean type: object + models.ReleasePlan: + properties: + approval: + $ref: '#/definitions/models.Approval' + approval_time: + type: integer + create_time: + type: integer + created_by: + type: string + description: + type: string + end_time: + type: integer + executing_time: + type: integer + id: + type: string + index: + type: integer + jobs: + items: + $ref: '#/definitions/models.ReleaseJob' + type: array + manager: + type: string + manager_id: + description: ManagerID is the user id of the manager + type: string + name: + type: string + planning_time: + type: integer + schedule_execute_time: + type: integer + start_time: + type: integer + status: + $ref: '#/definitions/config.ReleasePlanStatus' + success_time: + type: integer + update_time: + type: integer + updated_by: + type: string + type: object models.ReleasePlanTemplate: properties: approval: @@ -2826,6 +2886,15 @@ definitions: status: type: string type: object + service.ListReleasePlanResp: + properties: + list: + items: + $ref: '#/definitions/models.ReleasePlan' + type: array + total: + type: integer + type: object service.ListServiceVersionsResponse: properties: create_by: @@ -6048,6 +6117,47 @@ paths: summary: Update production_global variables tags: - project + /api/aslan/release_plan/v1: + get: + consumes: + - application/json + description: List Release Plans + parameters: + - description: page num + in: query + name: pageNum + required: true + type: integer + - description: page size + in: query + name: pageSize + required: true + type: integer + - description: search type + enum: + - name + - manager + - success_time + - status + in: query + name: type + required: true + type: string + - description: search keyword, 当类型为success_time时,值应为'开始时间戳-结束时间戳'的形式 + in: query + name: keyword + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/service.ListReleasePlanResp' + summary: List Release Plans + tags: + - releasePlan /api/aslan/service/services: post: consumes: