systemprompt_generator/jobs/
page_prerender.rs1use async_trait::async_trait;
8use std::sync::Arc;
9use systemprompt_database::DbPool;
10use systemprompt_models::AppPaths;
11use systemprompt_provider_contracts::{Job, JobContext, JobResult, ProviderError, ProviderResult};
12
13use crate::prerender::prerender_pages;
14
15#[derive(Debug, Clone, Copy)]
16pub struct PagePrerenderJob;
17
18#[async_trait]
19impl Job for PagePrerenderJob {
20 fn name(&self) -> &'static str {
21 "page_prerender"
22 }
23
24 fn description(&self) -> &'static str {
25 "Prerenders all registered page prerenderers to static HTML"
26 }
27
28 fn schedule(&self) -> &'static str {
29 "0 30 4 * * *"
30 }
31
32 async fn execute(&self, ctx: &JobContext) -> ProviderResult<JobResult> {
33 let start_time = std::time::Instant::now();
34 let db_pool = Arc::clone(ctx.db_pool::<DbPool>().ok_or_else(|| {
35 ProviderError::Configuration("DbPool not available in job context".into())
36 })?);
37 let paths = ctx
38 .app_paths::<Arc<AppPaths>>()
39 .ok_or_else(|| {
40 ProviderError::Configuration("AppPaths not available in job context".into())
41 })?
42 .as_ref();
43
44 tracing::info!("Job started");
45 let results = prerender_pages(db_pool, paths)
46 .await
47 .map_err(|e| ProviderError::RenderFailed(e.to_string()))?;
48 let pages_rendered = results.len() as u64;
49 let duration_ms = start_time.elapsed().as_millis() as u64;
50
51 tracing::info!(
52 pages_rendered = pages_rendered,
53 duration_ms = duration_ms,
54 "Job completed"
55 );
56
57 Ok(JobResult::success()
58 .with_stats(pages_rendered, 0)
59 .with_duration(duration_ms))
60 }
61}
62
63systemprompt_provider_contracts::submit_job!(&PagePrerenderJob);