apalis-redis 1.0.0

Background task processing for rust using apalis and redis
Documentation
use apalis_core::backend::WorkerFilter;
use redis::{Script, aio::ConnectionLike};

use crate::{Config, error::Error, queries::current_timestamp};

pub(crate) async fn reenqueue_orphaned<C>(
    conn: &mut C,
    config: &Config,
    worker_filter: &WorkerFilter,
) -> Result<u32, Error>
where
    C: ConnectionLike,
{
    let worker_set = config.workers_set();
    let active_jobs_list = config.active_jobs_list();
    let signal_list = config.signal_list();

    let script = Script::new(include_str!("../../lua/reenqueue_orphaned.lua"));

    let now = current_timestamp();
    let processed = match worker_filter {
        WorkerFilter::Only(worker_name) => {
            let dead_for = config.heartbeat_interval.as_secs();

            let expired_before = now - dead_for;
            script
                .key(worker_set)
                .key(active_jobs_list)
                .key(signal_list)
                .key(config.inflight_jobs_set())
                .arg(expired_before)
                .arg(worker_name)
                .invoke_async::<u32>(conn)
                .await?
        }
        _ => {
            let dead_for = config.orphaned_duration().as_secs();

            let expired_before = now - dead_for;
            script
                .key(worker_set)
                .key(active_jobs_list)
                .key(signal_list)
                .key(config.inflight_jobs_set())
                .arg(expired_before)
                .invoke_async::<u32>(conn)
                .await?
        }
    };

    Ok(processed)
}