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 eb4388c
Show file tree
Hide file tree
Showing 6 changed files with 577 additions and 62 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"] = 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
}
Expand Down
77 changes: 41 additions & 36 deletions pkg/microservice/aslan/core/release_plan/handler/release_plan.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) }()
Expand Down Expand Up @@ -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)
}
111 changes: 90 additions & 21 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 @@ -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 {
Expand Down Expand Up @@ -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
}
Loading

0 comments on commit eb4388c

Please sign in to comment.