Skip to main content

systemprompt_generator/jobs/
page_prerender.rs

1use anyhow::Result;
2use async_trait::async_trait;
3use systemprompt_database::DbPool;
4use systemprompt_provider_contracts::{Job, JobContext, JobResult};
5
6use crate::prerender::prerender_pages;
7
8#[derive(Debug, Clone, Copy)]
9pub struct PagePrerenderJob;
10
11#[async_trait]
12impl Job for PagePrerenderJob {
13    fn name(&self) -> &'static str {
14        "page_prerender"
15    }
16
17    fn description(&self) -> &'static str {
18        "Prerenders all registered page prerenderers to static HTML"
19    }
20
21    fn schedule(&self) -> &'static str {
22        "0 30 4 * * *"
23    }
24
25    async fn execute(&self, ctx: &JobContext) -> Result<JobResult> {
26        let start_time = std::time::Instant::now();
27        let db_pool = std::sync::Arc::clone(
28            ctx.db_pool::<DbPool>()
29                .ok_or_else(|| anyhow::anyhow!("DbPool not available in job context"))?,
30        );
31
32        tracing::info!("Job started");
33        let results = prerender_pages(db_pool).await?;
34        let pages_rendered = results.len() as u64;
35        let duration_ms = start_time.elapsed().as_millis() as u64;
36
37        tracing::info!(
38            pages_rendered = pages_rendered,
39            duration_ms = duration_ms,
40            "Job completed"
41        );
42
43        Ok(JobResult::success()
44            .with_stats(pages_rendered, 0)
45            .with_duration(duration_ms))
46    }
47}
48
49systemprompt_provider_contracts::submit_job!(&PagePrerenderJob);