diff --git a/app/store/database/job.go b/app/store/database/job.go index 4a38cbb59..47889706b 100644 --- a/app/store/database/job.go +++ b/app/store/database/job.go @@ -483,3 +483,22 @@ func (s *JobStore) DeleteOld(ctx context.Context, olderThan time.Time) (int64, e return n, nil } + +// DeleteByID deletes a job by its unique identifier. +func (s *JobStore) DeleteByUID(ctx context.Context, jobUID string) error { + stmt := database.Builder. + Delete("jobs"). + Where("job_uid = ?", jobUID) + + sql, args, err := stmt.ToSql() + if err != nil { + return fmt.Errorf("failed to convert delete job query to sql: %w", err) + } + db := dbtx.GetAccessor(ctx, s.db) + + _, err = db.ExecContext(ctx, sql, args...) + if err != nil { + return database.ProcessSQLErrorf(err, "failed to execute delete job query") + } + return nil +} diff --git a/job/scheduler.go b/job/scheduler.go index 2438c8d1c..554537cea 100644 --- a/job/scheduler.go +++ b/job/scheduler.go @@ -644,6 +644,14 @@ func (s *Scheduler) PurgeJobsByGroupID(ctx context.Context, jobGroupID string) ( return n, nil } +func (s *Scheduler) PurgeJobByUID(ctx context.Context, jobUID string) error { + err := s.store.DeleteByUID(ctx, jobUID) + if err != nil { + return fmt.Errorf("failed to delete job with id=%s: %w", jobUID, err) + } + return nil +} + func mapToProgressMany(jobs []*Job) []Progress { if jobs == nil { return nil diff --git a/job/store.go b/job/store.go index 4ba96f74b..b5438f97c 100644 --- a/job/store.go +++ b/job/store.go @@ -59,4 +59,7 @@ type Store interface { // DeleteOld removes non-recurring jobs that have finished execution or have failed. DeleteOld(ctx context.Context, olderThan time.Time) (int64, error) + + // DeleteByUID deletes a job by its unique identifier. + DeleteByUID(ctx context.Context, jobUID string) error }