openzeppelin_relayer/jobs/handlers/
transaction_request_handler.rsuse actix_web::web::ThinData;
use apalis::prelude::{Attempt, Context, Data, TaskId, Worker, *};
use apalis_redis::RedisContext;
use eyre::Result;
use log::info;
use crate::{
constants::WORKER_DEFAULT_MAXIMUM_RETRIES,
domain::{get_relayer_transaction, get_transaction_by_id, Transaction},
jobs::{handle_result, Job, JobProducer, TransactionRequest},
models::AppState,
};
pub async fn transaction_request_handler(
job: Job<TransactionRequest>,
state: Data<ThinData<AppState<JobProducer>>>,
attempt: Attempt,
worker: Worker<Context>,
task_id: TaskId,
ctx: RedisContext,
) -> Result<(), Error> {
info!("Handling transaction request: {:?}", job.data);
info!("Attempt: {:?}", attempt);
info!("Worker: {:?}", worker);
info!("Task ID: {:?}", task_id);
info!("Context: {:?}", ctx);
let result = handle_request(job.data, state).await;
handle_result(
result,
attempt,
"Transaction Request",
WORKER_DEFAULT_MAXIMUM_RETRIES,
)
}
async fn handle_request(
request: TransactionRequest,
state: Data<ThinData<AppState<JobProducer>>>,
) -> Result<()> {
let relayer_transaction = get_relayer_transaction(request.relayer_id, &state).await?;
let transaction = get_transaction_by_id(request.transaction_id, &state).await?;
relayer_transaction.prepare_transaction(transaction).await?;
info!("Transaction request handled successfully");
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
use apalis::prelude::Attempt;
#[tokio::test]
async fn test_handler_result_processing() {
let request = TransactionRequest::new("tx123", "relayer-1");
let job = Job::new(crate::jobs::JobType::TransactionRequest, request);
let attempt = Attempt::default();
assert_eq!(job.data.transaction_id, "tx123");
assert_eq!(job.data.relayer_id, "relayer-1");
assert_eq!(attempt.current(), 0);
}
}