use std::{error::Error, time::Duration}; use quartz::{Job, Scheduler, Trigger}; use sqlx::query; use tokio::runtime::Handle; use crate::{auth, db}; pub fn init_scheduler(rt: Handle) -> Scheduler { let scheduler = Scheduler::new(); let trigger_every_5min = Trigger::with_identity("5min_trigger", "default_group") .every(Duration::from_mins(5)) .repeat(u32::max_value()); let trigger_every_3min = Trigger::with_identity("3min_trigger", "default_group") .every(Duration::from_mins(3)) .repeat(u32::max_value()); let rt_cleanup = rt.clone(); let cleanup_tokens_job = Job::with_identity("cleanup_tokens_job", "default_group", move || { let rt = rt_cleanup.clone(); rt.spawn(async move { let _ = cleanup_old_tokens().await; }); }); let rt_refresh = rt.clone(); let refresh_access_token_job = Job::with_identity("refresh_access_token_job", "default_group", move || { let rt = rt_refresh.clone(); rt.spawn(async move { let _ = refresh_access_token().await; }); }); scheduler.schedule_job(cleanup_tokens_job, trigger_every_5min); scheduler.schedule_job(refresh_access_token_job, trigger_every_3min); scheduler } pub async fn cleanup_old_tokens() -> Result<(), Box> { let pool = db::get_pool().await?; let now = chrono::Utc::now(); let now = now.to_rfc3339(); query!("DELETE FROM tokens WHERE expires_at < ?", now) .execute(&pool) .await?; Ok(()) } pub async fn refresh_access_token() -> Result<(), Box> { auth::create_new_access_token().await?; Ok(()) }