use forge_jobs::Storage;
use crate::Error;
use crate::dto::{QueueOverviewDto, StorageInfoDto, overview_dto};
pub async fn queue_overview(storage: &Storage) -> Result<Vec<QueueOverviewDto>, Error> {
let queues = storage.config.list_queues().await?;
let now = chrono::Utc::now();
let mut out = Vec::with_capacity(queues.len());
for cfg in queues {
let counts = storage.jobs.count_by_status(&cfg.name).await?;
let processes = storage.procs.list(Some(&cfg.name)).await?;
let lag = storage
.jobs
.oldest_ready_at(&cfg.name)
.await?
.map_or(0, |t| u64::try_from((now - t).num_seconds()).unwrap_or(0));
out.push(overview_dto(cfg, counts, processes, lag));
}
Ok(out)
}
pub async fn storage_info(storage: &Storage) -> Result<StorageInfoDto, Error> {
let info = storage.jobs.describe().await?;
Ok(info.into())
}
pub async fn queue_set_backoff(
storage: &Storage,
name: &str,
enabled: bool,
base_seconds: i32,
max_seconds: i32,
) -> Result<(), Error> {
storage
.config
.set_backoff(name, enabled, base_seconds, max_seconds)
.await?;
Ok(())
}