use chrono::{DateTime, Utc}; use sqlx::{FromRow, PgPool}; use crate::error::Result; #[derive(FromRow)] pub struct SchedulerJobRun { pub job_name: String, pub last_ran_at: DateTime, pub rows_affected: i64, } /// Upsert the last-run timestamp and rows affected for a scheduled job. pub async fn record_job_run(pool: &PgPool, job_name: &str, rows_affected: i64) -> Result<()> { sqlx::query( "INSERT INTO scheduler_job_runs (job_name, last_ran_at, rows_affected) VALUES ($1, NOW(), $2) ON CONFLICT (job_name) DO UPDATE SET last_ran_at = NOW(), rows_affected = $2", ) .bind(job_name) .bind(rows_affected) .execute(pool) .await?; Ok(()) } /// Fetch all job run records for health page display. pub async fn get_job_runs(pool: &PgPool) -> Result> { let rows = sqlx::query_as::<_, SchedulerJobRun>( "SELECT job_name, last_ran_at, rows_affected FROM scheduler_job_runs ORDER BY job_name", ) .fetch_all(pool) .await?; Ok(rows) }