apalis-postgres 1.0.0-rc.7

Background task processing for rust using apalis and postgres
Documentation
use apalis_core::backend::{BackendExt, Metrics, Statistic};
use ulid::Ulid;

use crate::{CompactType, PgContext, PostgresStorage};

struct StatisticRow {
    priority: Option<i32>,
    r#type: Option<String>,
    statistic: Option<String>,
    value: Option<f32>,
}

impl<Args, D, F> Metrics for PostgresStorage<Args, CompactType, D, F>
where
    PostgresStorage<Args, CompactType, D, F>:
        BackendExt<Context = PgContext, Compact = CompactType, IdType = Ulid, Error = sqlx::Error>,
{
    fn global(&self) -> impl Future<Output = Result<Vec<Statistic>, Self::Error>> + Send {
        let pool = self.pool.clone();

        async move {
            let rec = sqlx::query_file_as!(StatisticRow, "queries/backend/overview.sql")
                .fetch_all(&pool)
                .await?
                .into_iter()
                .map(|r| Statistic {
                    priority: Some(r.priority.unwrap_or_default() as u64),
                    stat_type: apalis_sql::stat_type_from_string(&r.r#type.unwrap_or_default()),
                    title: r.statistic.unwrap_or_default(),
                    value: r.value.unwrap_or_default().to_string(),
                })
                .collect();
            Ok(rec)
        }
    }
    fn fetch_by_queue(
        &self,
        queue_id: &str,
    ) -> impl Future<Output = Result<Vec<Statistic>, Self::Error>> + Send {
        let pool = self.pool.clone();
        let queue_id = queue_id.to_string();
        async move {
            let rec = sqlx::query_file_as!(
                StatisticRow,
                "queries/backend/overview_by_queue.sql",
                queue_id
            )
            .fetch_all(&pool)
            .await?
            .into_iter()
            .map(|r| Statistic {
                priority: Some(r.priority.unwrap_or_default() as u64),
                stat_type: apalis_sql::stat_type_from_string(&r.r#type.unwrap_or_default()),
                title: r.statistic.unwrap_or_default(),
                value: r.value.unwrap_or_default().to_string(),
            })
            .collect();
            Ok(rec)
        }
    }
}