diff --git a/api/api_test.go b/api/api_test.go index a7fd2c87d..6aaf5c0f7 100644 --- a/api/api_test.go +++ b/api/api_test.go @@ -107,7 +107,7 @@ func setupMockSchedule() schedule.Handler { m := new(schedule.MockSchedule) m.On("CreateHandler", mock.Anything, mock.Anything, mock.Anything, mock.Anything). Return(&model.Schedule{}, nil) - m.On("ListHandler", mock.Anything, mock.Anything). + m.On("ListHandler", mock.Anything, mock.Anything, mock.Anything). Return([]model.Schedule{{}}, nil) m.On("PauseHandler", mock.Anything, mock.Anything, uint32(1)). Return(&model.Schedule{}, nil) diff --git a/client/swagger/http/deal_schedule/list_schedules_parameters.go b/client/swagger/http/deal_schedule/list_schedules_parameters.go index e1a0ce2ed..4909f0953 100644 --- a/client/swagger/http/deal_schedule/list_schedules_parameters.go +++ b/client/swagger/http/deal_schedule/list_schedules_parameters.go @@ -60,6 +60,13 @@ ListSchedulesParams contains all the parameters to send to the API endpoint Typically these are written to a http.Request. */ type ListSchedulesParams struct { + + /* Group. + + Filter by group label + */ + Group *string + timeout time.Duration Context context.Context HTTPClient *http.Client @@ -113,6 +120,17 @@ func (o *ListSchedulesParams) SetHTTPClient(client *http.Client) { o.HTTPClient = client } +// WithGroup adds the group to the list schedules params +func (o *ListSchedulesParams) WithGroup(group *string) *ListSchedulesParams { + o.SetGroup(group) + return o +} + +// SetGroup adds the group to the list schedules params +func (o *ListSchedulesParams) SetGroup(group *string) { + o.Group = group +} + // WriteToRequest writes these params to a swagger request func (o *ListSchedulesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { @@ -121,6 +139,23 @@ func (o *ListSchedulesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt } var res []error + if o.Group != nil { + + // query param group + var qrGroup string + + if o.Group != nil { + qrGroup = *o.Group + } + qGroup := qrGroup + if qGroup != "" { + + if err := r.SetQueryParam("group", qGroup); err != nil { + return err + } + } + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } diff --git a/cmd/deal/schedule/list.go b/cmd/deal/schedule/list.go index da30b43ed..2d5b7b65c 100644 --- a/cmd/deal/schedule/list.go +++ b/cmd/deal/schedule/list.go @@ -11,13 +11,22 @@ import ( var ListCmd = &cli.Command{ Name: "list", Usage: "List all deal making schedules", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "group", + Category: "Filtering", + Usage: "Filter schedules by group label", + }, + }, Action: func(c *cli.Context) error { db, closer, err := database.OpenFromCLI(c) if err != nil { return errors.WithStack(err) } defer closer.Close() - schedules, err := schedule.Default.ListHandler(c.Context, db) + schedules, err := schedule.Default.ListHandler(c.Context, db, schedule.ListRequest{ + Group: c.String("group"), + }) if err != nil { return errors.WithStack(err) } diff --git a/cmd/schedule_test.go b/cmd/schedule_test.go index 8b489f7df..0106b06b6 100644 --- a/cmd/schedule_test.go +++ b/cmd/schedule_test.go @@ -88,7 +88,7 @@ func TestScheduleListHandler(t *testing.T) { defer runner.Save(t) mockHandler := new(schedule.MockSchedule) defer swapScheduleHandler(mockHandler)() - mockHandler.On("ListHandler", mock.Anything, mock.Anything).Return([]model.Schedule{testSchedule}, nil) + mockHandler.On("ListHandler", mock.Anything, mock.Anything, mock.Anything).Return([]model.Schedule{testSchedule}, nil) _, _, err := runner.Run(ctx, "singularity deal schedule list") require.NoError(t, err) diff --git a/docs/en/cli-reference/deal/schedule/list.md b/docs/en/cli-reference/deal/schedule/list.md index c626afd16..f4342973a 100644 --- a/docs/en/cli-reference/deal/schedule/list.md +++ b/docs/en/cli-reference/deal/schedule/list.md @@ -10,5 +10,10 @@ USAGE: OPTIONS: --help, -h show help + + Filtering + + --group value Filter schedules by group label + ``` {% endcode %} diff --git a/docs/swagger/docs.go b/docs/swagger/docs.go index 05959d10c..25bd94729 100644 --- a/docs/swagger/docs.go +++ b/docs/swagger/docs.go @@ -1636,6 +1636,14 @@ const docTemplate = `{ ], "summary": "List all deal making schedules", "operationId": "ListSchedules", + "parameters": [ + { + "type": "string", + "description": "Filter by group label", + "name": "group", + "in": "query" + } + ], "responses": { "200": { "description": "OK", diff --git a/docs/swagger/swagger.json b/docs/swagger/swagger.json index 35bc69581..8f8f07e6c 100644 --- a/docs/swagger/swagger.json +++ b/docs/swagger/swagger.json @@ -1629,6 +1629,14 @@ ], "summary": "List all deal making schedules", "operationId": "ListSchedules", + "parameters": [ + { + "type": "string", + "description": "Filter by group label", + "name": "group", + "in": "query" + } + ], "responses": { "200": { "description": "OK", diff --git a/docs/swagger/swagger.yaml b/docs/swagger/swagger.yaml index 3cb93ab59..c0e6259c9 100644 --- a/docs/swagger/swagger.yaml +++ b/docs/swagger/swagger.yaml @@ -16607,6 +16607,11 @@ paths: /schedule: get: operationId: ListSchedules + parameters: + - description: Filter by group label + in: query + name: group + type: string produces: - application/json responses: diff --git a/handler/deal/schedule/interface.go b/handler/deal/schedule/interface.go index a6ab86ec8..c5359535b 100644 --- a/handler/deal/schedule/interface.go +++ b/handler/deal/schedule/interface.go @@ -26,6 +26,7 @@ type Handler interface { ListHandler( ctx context.Context, db *gorm.DB, + request ListRequest, ) ([]model.Schedule, error) PauseHandler( ctx context.Context, @@ -69,8 +70,8 @@ func (m *MockSchedule) CreateHandler(ctx context.Context, db *gorm.DB, lotusClie return args.Get(0).(*model.Schedule), args.Error(1) } -func (m *MockSchedule) ListHandler(ctx context.Context, db *gorm.DB) ([]model.Schedule, error) { - args := m.Called(ctx, db) +func (m *MockSchedule) ListHandler(ctx context.Context, db *gorm.DB, request ListRequest) ([]model.Schedule, error) { + args := m.Called(ctx, db, request) return args.Get(0).([]model.Schedule), args.Error(1) } diff --git a/handler/deal/schedule/list.go b/handler/deal/schedule/list.go index b4e844607..902df7615 100644 --- a/handler/deal/schedule/list.go +++ b/handler/deal/schedule/list.go @@ -8,30 +8,32 @@ import ( "gorm.io/gorm" ) +// ListRequest holds optional filters for listing schedules. +type ListRequest struct { + Group string `json:"group"` // Filter by group label (empty = all) +} + // @ID ListSchedules // @Summary List all deal making schedules // @Tags Deal Schedule // @Produce json +// @Param group query string false "Filter by group label" // @Success 200 {array} model.Schedule // @Failure 400 {object} api.HTTPError // @Failure 500 {object} api.HTTPError // @Router /schedule [get] func _() {} -// ListHandler retrieves all the schedules from the database. -// -// Parameters: -// - ctx: The context for the operation, which can include cancellation signals, timeout details, etc. -// - db: The database connection used for CRUD operations. -// -// Returns: -// - A slice of Schedule models if successful. -// - An error if there are issues during the operation. +// ListHandler retrieves schedules from the database, optionally filtered by group. func (DefaultHandler) ListHandler( ctx context.Context, db *gorm.DB, + request ListRequest, ) ([]model.Schedule, error) { db = db.WithContext(ctx) + if request.Group != "" { + db = db.Where(&model.Schedule{Group: request.Group}) + } var schedules []model.Schedule err := db.Find(&schedules).Error if err != nil { diff --git a/handler/deal/schedule/list_test.go b/handler/deal/schedule/list_test.go index 5358c8e19..a6d0cea88 100644 --- a/handler/deal/schedule/list_test.go +++ b/handler/deal/schedule/list_test.go @@ -22,8 +22,19 @@ func TestListHandler(t *testing.T) { PreparationID: 1, }).Error require.NoError(t, err) - schedules, err := Default.ListHandler(ctx, db) + schedules, err := Default.ListHandler(ctx, db, ListRequest{}) require.NoError(t, err) require.Len(t, schedules, 1) + + // Test filtering by group + err = db.Model(&model.Schedule{}).Where("id = ?", 1).UpdateColumn("group", "test-group").Error + require.NoError(t, err) + filtered, err := Default.ListHandler(ctx, db, ListRequest{Group: "test-group"}) + require.NoError(t, err) + require.Len(t, filtered, 1) + + empty, err := Default.ListHandler(ctx, db, ListRequest{Group: "nonexistent"}) + require.NoError(t, err) + require.Len(t, empty, 0) }) }