From 7e641049e9b04f5940b1bd526f2c5090d7d30195 Mon Sep 17 00:00:00 2001 From: "construct.d" Date: Tue, 17 Mar 2026 20:38:20 +0000 Subject: [PATCH] Add automated scheduled jobs cleanup --- lib/phoenix_kit/scheduled_jobs.ex | 37 +++++++++++++++++++ .../workers/process_scheduled_jobs_worker.ex | 3 ++ 2 files changed, 40 insertions(+) diff --git a/lib/phoenix_kit/scheduled_jobs.ex b/lib/phoenix_kit/scheduled_jobs.ex index e5092dd3c..79ea7b9ba 100644 --- a/lib/phoenix_kit/scheduled_jobs.ex +++ b/lib/phoenix_kit/scheduled_jobs.ex @@ -250,6 +250,43 @@ defmodule PhoenixKit.ScheduledJobs do |> repo().one() end + @doc """ + Deletes old completed jobs to prevent table bloat. + + ## Parameters + + - `days` - Retention period in days (default: 7) + - `statuses` - List of statuses to delete (default: ["executed", "failed", "cancelled"]) + + ## Returns + + - `{count, nil}` - Number of deleted records + + ## Examples + + iex> delete_old_jobs(7) + {1234, nil} + + iex> delete_old_jobs(30, ["executed"]) + {500, nil} + """ + def delete_old_jobs(days \\ 7, statuses \\ ["executed", "failed", "cancelled"]) do + cutoff_date = DateTime.add(UtilsDate.utc_now(), -days * 24 * 3600, :second) + + {count, _} = + from(j in ScheduledJob, + where: j.status in ^statuses, + where: j.updated_at < ^cutoff_date + ) + |> repo().delete_all(log: false) + + if count > 0 do + Logger.info("ScheduledJobs: Deleted #{count} old job(s) older than #{days} days") + end + + {count, nil} + end + ## Private Functions defp execute_job(%ScheduledJob{} = job) do diff --git a/lib/phoenix_kit/scheduled_jobs/workers/process_scheduled_jobs_worker.ex b/lib/phoenix_kit/scheduled_jobs/workers/process_scheduled_jobs_worker.ex index 966b3d5c1..cf16c8189 100644 --- a/lib/phoenix_kit/scheduled_jobs/workers/process_scheduled_jobs_worker.ex +++ b/lib/phoenix_kit/scheduled_jobs/workers/process_scheduled_jobs_worker.ex @@ -89,6 +89,9 @@ defmodule PhoenixKit.ScheduledJobs.Workers.ProcessScheduledJobsWorker do end end + # Cleanup: Delete old completed jobs to prevent table bloat + ScheduledJobs.delete_old_jobs() + :ok end end