Skip to content

Commit

Permalink
add search feature in release plan
Browse files Browse the repository at this point in the history
Signed-off-by: Patrick Zhao <[email protected]>
  • Loading branch information
PetrusZ committed Jun 21, 2024
1 parent 6cb8a81 commit 36f1fb9
Show file tree
Hide file tree
Showing 7 changed files with 349 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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"] = fmt.Sprintf("/.*%s.*/i", opt.Name)
}
if opt.Manager != "" {
query["manager"] = opt.Manager
}
if opt.SuccessTimeStart > 0 && opt.SuccessTimeEnd > 0 {
query["start_time"] = bson.M{"$gte": opt.SuccessTimeStart, "$lte": opt.SuccessTimeEnd}
}
if opt.Status != "" {
query["status"] = opt.Status
}
Expand Down Expand Up @@ -152,3 +165,46 @@ func (c *ReleasePlanColl) ListByOptions(opt *ListReleasePlanOption) ([]*models.R

return resp, count, nil
}

// func (c *ReleasePlanColl) SearchByName(name string, pageNum, pageSize int) ([]*models.ReleasePlan, int64, error) {
// if name == "" {
// return nil, 0, errors.New("name is empty")
// }

// query := bson.M{}

// var resp []*models.ReleasePlan
// ctx := context.Background()
// opts := options.Find()
// opts.SetSort(bson.D{{"index", -1}})
// if opt.PageNum > 0 && opt.PageSize > 0 {
// opts.SetSkip((opt.PageNum - 1) * opt.PageSize)
// opts.SetLimit(opt.PageSize)
// }
// if opt.Status != "" {
// query["status"] = opt.Status
// }
// if len(opt.ExcludedFields) > 0 {
// projection := bson.M{}
// for _, field := range opt.ExcludedFields {
// projection[field] = 0
// }
// opts.SetProjection(projection)
// }

// count, err := c.Collection.CountDocuments(ctx, query)
// if err != nil {
// return nil, 0, err
// }
// cursor, err := c.Collection.Find(ctx, query, opts)
// if err != nil {
// return nil, 0, err
// }

// err = cursor.All(ctx, &resp)
// if err != nil {
// return nil, 0, err
// }

// return resp, count, nil
// }
43 changes: 42 additions & 1 deletion pkg/microservice/aslan/core/release_plan/handler/release_plan.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ func ListReleasePlans(c *gin.Context) {
defer func() { internalhandler.JSONResponse(c, ctx) }()

if err != nil {

ctx.Err = fmt.Errorf("authorization Info Generation failed: err %s", err)
ctx.UnAuthorized = true
return
Expand Down Expand Up @@ -313,3 +312,45 @@ func ApproveReleasePlan(c *gin.Context) {

ctx.Err = service.ApproveReleasePlan(ctx, c.Param("id"), req)
}

// @Summary Search Release Plans
// @Description Search Release Plans
// @Tags releasePlan
// @Accept json
// @Produce json
// @Param projectKey query string true "project key"
// @Param pageNum query int true "page num"
// @Param pageSize query int true "page size"
// @Param type query service.SearchReleasePlanType true "search type"
// @Param keyword query string true "search keyword"
// @Success 200
// @Router /api/aslan/release_plan/v1/search [get]
func SearchReleasePlans(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.SearchReleasePlanOption)
if err := c.ShouldBindQuery(&opt); err != nil {
ctx.Err = e.ErrInvalidParam.AddDesc(err.Error())
return
}

ctx.Resp, ctx.Err = service.SearchReleasePlans(opt)
}
1 change: 1 addition & 0 deletions pkg/microservice/aslan/core/release_plan/handler/router.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ func (*Router) Inject(router *gin.RouterGroup) {
v1.GET("/:id/logs", GetReleasePlanLogs)
v1.PUT("/:id", UpdateReleasePlan)
v1.DELETE("/:id", DeleteReleasePlan)
v1.GET("/search", SearchReleasePlans)

v1.POST("/:id/execute", ExecuteReleaseJob)
v1.POST("/:id/schedule_execute", ScheduleExecuteReleasePlan)
Expand Down
75 changes: 75 additions & 0 deletions pkg/microservice/aslan/core/release_plan/service/release_plan.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ import (
"context"
"encoding/json"
"fmt"
"strconv"
"strings"
"time"

"github.com/gin-gonic/gin"
Expand Down Expand Up @@ -900,3 +902,76 @@ func cronJobToSchedule(input *commonmodels.Cronjob) *commonmodels.Schedule {
Enabled: input.Enabled,
}
}

type SearchReleasePlanType string

const (
SearchReleasePlanTypeName SearchReleasePlanType = "name"
SearchReleasePlanTypeManager SearchReleasePlanType = "manager"
SearchReleasePlanTypeSuccessTime SearchReleasePlanType = "success_time"
SearchReleasePlanTypeStatus SearchReleasePlanType = "status"
)

type SearchReleasePlanOption struct {
Type SearchReleasePlanType `form:"type" binding:"required"`
Keyword string `form:"keyword" binding:"required"`
}

func SearchReleasePlans(opt *SearchReleasePlanOption) (*ListReleasePlanResp, error) {
var (
list []*commonmodels.ReleasePlan
total int64
err error
)
switch opt.Type {
case SearchReleasePlanTypeName:
list, total, err = mongodb.NewReleasePlanColl().ListByOptions(&mongodb.ListReleasePlanOption{
Name: opt.Keyword,
IsSort: true,
ExcludedFields: []string{"jobs", "logs"},
})
case SearchReleasePlanTypeManager:
list, total, err = mongodb.NewReleasePlanColl().ListByOptions(&mongodb.ListReleasePlanOption{
Manager: opt.Keyword,
IsSort: true,
ExcludedFields: []string{"jobs", "logs"},
})
case SearchReleasePlanTypeSuccessTime:
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,
ExcludedFields: []string{"jobs", "logs"},
})
case SearchReleasePlanTypeStatus:
list, total, err = mongodb.NewReleasePlanColl().ListByOptions(&mongodb.ListReleasePlanOption{
Status: config.ReleasePlanStatus(opt.Keyword),
IsSort: true,
ExcludedFields: []string{"jobs", "logs"},
})
}
if err != nil {
return nil, errors.Wrap(err, "SearchReleasePlans")
}

return &ListReleasePlanResp{
List: list,
Total: total,
}, nil
}
63 changes: 63 additions & 0 deletions pkg/microservice/aslan/server/rest/doc/docs.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

63 changes: 63 additions & 0 deletions pkg/microservice/aslan/server/rest/doc/swagger.json
Original file line number Diff line number Diff line change
Expand Up @@ -3215,6 +3215,69 @@
}
}
},
"/api/aslan/release_plan/v1/search": {
"get": {
"description": "Search Release Plans",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"releasePlan"
],
"summary": "Search Release Plans",
"parameters": [
{
"type": "string",
"description": "project key",
"name": "projectKey",
"in": "query",
"required": true
},
{
"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",
"name": "keyword",
"in": "query",
"required": true
}
],
"responses": {
"200": {
"description": "OK"
}
}
}
},
"/api/aslan/service/services": {
"post": {
"description": "Create service template",
Expand Down
Loading

0 comments on commit 36f1fb9

Please sign in to comment.