apalis-redis 1.0.0

Background task processing for rust using apalis and redis
Documentation
use apalis_core::{backend::TaskResult, worker::context::WorkerContext};
use redis::{Script, aio::ConnectionLike};
use serde_json::Value;

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

pub(crate) async fn handle_results<C: ConnectionLike>(
    conn: &mut C,
    ack_payloads: &[&TaskResult<Value>],
    worker: &WorkerContext,
    config: &Config,
) -> Result<(), Error> {
    if ack_payloads.is_empty() {
        return Ok(());
    }

    let done_jobs_set = config.done_jobs_set();
    let dead_jobs_set = config.dead_jobs_set();
    let job_meta_hash = config.job_meta_hash();
    let scheduled_jobs_set = config.scheduled_jobs_set();
    let worker_inflight_set = config.inflight_set_for(worker);

    let script = Script::new(include_str!("../../lua/handle_results.lua"));
    let mut invocation = script.prepare_invoke();

    invocation
        .key(worker_inflight_set)
        .key(done_jobs_set)
        .key(dead_jobs_set)
        .key(scheduled_jobs_set)
        .key(job_meta_hash)
        .arg(config.emit_events);

    let timestamp = current_timestamp();

    for payload in ack_payloads {
        let status = payload.status().to_string();
        let result_data = serde_json::to_value(&payload.result).map_err(Error::Json)?;

        invocation
            .arg(payload.task_id.to_string())
            .arg(timestamp)
            .arg(result_data.to_string())
            .arg(status)
            .arg(payload.attempt);
    }

    invocation.invoke_async::<u32>(conn).await?;

    Ok(())
}