56 lines
1.7 KiB
Rust
56 lines
1.7 KiB
Rust
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<dyn Error>> {
|
|
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<dyn Error>> {
|
|
auth::create_new_access_token().await?;
|
|
Ok(())
|
|
}
|