@@ -405,28 +405,58 @@ func Cancel(ctx *context_module.Context) {
405
405
ctx .JSON (http .StatusOK , struct {}{})
406
406
}
407
407
408
+ // Delete deletes a run and all its jobs.
408
409
func Delete (ctx * context_module.Context ) {
409
-
410
410
runIndex := ctx .ParamsInt64 ("run" )
411
411
412
- _ , jobs := getRunJobs (ctx , runIndex , - 1 )
413
- if ctx .Written () {
414
- return
415
- }
416
-
417
412
run , err := actions_model .GetRunByID (ctx , runIndex )
418
413
if err != nil {
419
414
ctx .Error (http .StatusNotFound , err .Error ())
420
415
return
421
416
}
422
417
418
+ _ , jobs := getRunJobs (ctx , runIndex , - 1 )
419
+ if ctx .Written () {
420
+ return
421
+ }
422
+
423
+ // Initializes a transaction where it will:
424
+ // 1. Get all the tasks associate with each job as well as the task steps
425
+ // 2. Delete all the task steps, tasks, jobs and run itself.
423
426
if err := db .WithTx (ctx , func (ctx context.Context ) error {
427
+ for _ , job := range jobs {
424
428
425
- if err := actions_model .DeleteRunJobs (ctx , jobs ); err != nil {
426
- return err
429
+ if job .TaskID == 0 {
430
+ return fmt .Errorf ("job not associate with any task" )
431
+ }
432
+ if job .Status == actions_model .StatusRunning {
433
+ return fmt .Errorf ("job is running, can't delete" )
434
+ }
435
+
436
+ task , err := actions_model .GetTaskByID (ctx , job .TaskID )
437
+ if err != nil {
438
+ return fmt .Errorf ("error while getting task: %v" , err )
439
+ }
440
+
441
+ taskSteps , err := actions_model .GetTaskStepsByTaskID (ctx , task .ID )
442
+ if err != nil {
443
+ return fmt .Errorf ("error while getting task steps: %v" , err )
444
+ }
445
+
446
+ if err := actions_model .DeleteTaskSteps (ctx , taskSteps ); err != nil {
447
+ return fmt .Errorf ("error while deleting task steps: %v" , err )
448
+ }
449
+
450
+ if err := actions_model .DeleteTask (ctx , task ); err != nil {
451
+ return fmt .Errorf ("error while deleting task: %v" , err )
452
+ }
453
+
454
+ if err := actions_model .DeleteRunJob (ctx , job ); err != nil {
455
+ return fmt .Errorf ("error while deleting run job: %v" , err )
456
+ }
427
457
}
428
458
if err := actions_model .DeleteRun (ctx , run ); err != nil {
429
- return err
459
+ return fmt . Errorf ( "error while deleting run: %v" , err )
430
460
}
431
461
return nil
432
462
}); err != nil {
0 commit comments