@@ -297,7 +297,7 @@ func (m *StackManager) BuildStackFilter(ctx context.Context, query *url.Values)
297
297
return & filter , nil
298
298
}
299
299
300
- func (m * StackManager ) BuildRunFilter (ctx context.Context , query * url.Values ) (* entity.RunFilter , error ) {
300
+ func (m * StackManager ) BuildRunFilterAndSortOptions (ctx context.Context , query * url.Values ) (* entity.RunFilter , * entity. SortOptions , error ) {
301
301
logger := logutil .GetLogger (ctx )
302
302
logger .Info ("Building run filter..." )
303
303
@@ -314,15 +314,15 @@ func (m *StackManager) BuildRunFilter(ctx context.Context, query *url.Values) (*
314
314
// if project id is present, use project id
315
315
projectID , err := strconv .Atoi (projectIDParam )
316
316
if err != nil {
317
- return nil , constant .ErrInvalidProjectID
317
+ return nil , nil , constant .ErrInvalidProjectID
318
318
}
319
319
filter .ProjectID = uint (projectID )
320
320
}
321
321
if stackIDParam != "" {
322
322
// if project id is present, use project id
323
323
stackID , err := strconv .Atoi (stackIDParam )
324
324
if err != nil {
325
- return nil , constant .ErrInvalidStackID
325
+ return nil , nil , constant .ErrInvalidStackID
326
326
}
327
327
filter .StackID = uint (stackID )
328
328
}
@@ -343,19 +343,19 @@ func (m *StackManager) BuildRunFilter(ctx context.Context, query *url.Values) (*
343
343
// if start time is present, use start time
344
344
startTime , err := time .Parse (time .RFC3339 , startTimeParam )
345
345
if err != nil {
346
- return nil , err
346
+ return nil , nil , err
347
347
}
348
348
filter .StartTime = startTime
349
349
}
350
350
if endTimeParam != "" {
351
351
// if end time is present, use end time
352
352
endTime , err := time .Parse (time .RFC3339 , endTimeParam )
353
353
if err != nil {
354
- return nil , err
354
+ return nil , nil , err
355
355
}
356
356
// validate end time is after start time
357
357
if ! filter .StartTime .IsZero () && endTime .Before (filter .StartTime ) {
358
- return nil , fmt .Errorf ("end time must be after start time" )
358
+ return nil , nil , fmt .Errorf ("end time must be after start time" )
359
359
}
360
360
filter .EndTime = endTime
361
361
}
@@ -372,7 +372,19 @@ func (m *StackManager) BuildRunFilter(ctx context.Context, query *url.Values) (*
372
372
Page : page ,
373
373
PageSize : pageSize ,
374
374
}
375
- return & filter , nil
375
+
376
+ // Build sort options
377
+ sortBy := query .Get ("sortBy" )
378
+ sortBy , err := validateRunSortOptions (sortBy )
379
+ if err != nil {
380
+ return nil , nil , err
381
+ }
382
+ SortOrderAscending , _ := strconv .ParseBool (query .Get ("ascending" ))
383
+ runSortOptions := & entity.SortOptions {
384
+ Field : sortBy ,
385
+ Ascending : SortOrderAscending ,
386
+ }
387
+ return & filter , runSortOptions , nil
376
388
}
377
389
378
390
func (m * StackManager ) ImportTerraformResourceID (ctx context.Context , sp * v1.Spec , importedResources map [string ]string ) {
@@ -530,3 +542,19 @@ func validateExecuteRequestParams(params *StackRequestParams) error {
530
542
}
531
543
return nil
532
544
}
545
+
546
+ func validateRunSortOptions (sortBy string ) (string , error ) {
547
+ if sortBy == "" {
548
+ return constant .SortByID , nil
549
+ }
550
+ if sortBy != constant .SortByID && sortBy != constant .SortByCreateTimestamp {
551
+ return "" , fmt .Errorf ("invalid sort option: %s. Can only sort by id or create timestamp" , sortBy )
552
+ }
553
+ switch sortBy {
554
+ case constant .SortByCreateTimestamp :
555
+ return "created_at" , nil
556
+ case constant .SortByModifiedTimestamp :
557
+ return "updated_at" , nil
558
+ }
559
+ return sortBy , nil
560
+ }
0 commit comments