openzeppelin_relayer/jobs/handlers/
solana_swap_request_handler.rs

1//! Solana swap request handling worker implementation.
2//!
3//! This module implements the solana token swap request handling worker that processes
4//! notification jobs from the queue.
5
6use actix_web::web::ThinData;
7use apalis::prelude::{Attempt, Data, *};
8use eyre::Result;
9use log::info;
10
11use crate::{
12    constants::WORKER_DEFAULT_MAXIMUM_RETRIES,
13    domain::{create_solana_relayer, get_relayer_by_id, SolanaRelayerDexTrait},
14    jobs::{handle_result, Job, SolanaTokenSwapRequest},
15    models::DefaultAppState,
16    repositories::Repository,
17};
18
19/// Handles incoming swap jobs from the queue.
20///
21/// # Arguments
22/// * `job` - The notification job containing recipient and message details
23/// * `context` - Application state containing notification services
24///
25/// # Returns
26/// * `Result<(), Error>` - Success or failure of notification processing
27pub async fn solana_token_swap_request_handler(
28    job: Job<SolanaTokenSwapRequest>,
29    context: Data<ThinData<DefaultAppState>>,
30    attempt: Attempt,
31) -> Result<(), Error> {
32    info!("handling solana token swap request: {:?}", job.data);
33
34    let result = handle_request(job.data, context).await;
35
36    handle_result(
37        result,
38        attempt,
39        "SolanaTokenSwapRequest",
40        WORKER_DEFAULT_MAXIMUM_RETRIES,
41    )
42}
43
44#[derive(Default, Debug, Clone)]
45pub struct CronReminder();
46
47/// Handles incoming swap jobs from the cron queue.
48pub async fn solana_token_swap_cron_handler(
49    job: CronReminder,
50    relayer_id: Data<String>,
51    data: Data<ThinData<DefaultAppState>>,
52    attempt: Attempt,
53) -> Result<(), Error> {
54    info!("handling solana token swap cron request: {:?}", job);
55
56    let result = handle_request(
57        SolanaTokenSwapRequest {
58            relayer_id: relayer_id.to_string(),
59        },
60        data,
61    )
62    .await;
63
64    handle_result(
65        result,
66        attempt,
67        "SolanaTokenSwapRequest",
68        WORKER_DEFAULT_MAXIMUM_RETRIES,
69    )
70}
71
72async fn handle_request(
73    request: SolanaTokenSwapRequest,
74    context: Data<ThinData<DefaultAppState>>,
75) -> Result<()> {
76    info!("handling solana token swap request: {:?}", request);
77
78    let relayer_model = get_relayer_by_id(request.relayer_id.clone(), &context).await?;
79    let signer_model = context
80        .signer_repository
81        .get_by_id(relayer_model.signer_id.clone())
82        .await?;
83
84    let relayer = create_solana_relayer(
85        relayer_model,
86        signer_model,
87        context.relayer_repository(),
88        context.network_repository(),
89        context.transaction_repository(),
90        context.job_producer(),
91    )
92    .await?;
93
94    relayer
95        .handle_token_swap_request(request.relayer_id.clone())
96        .await
97        .map_err(|e| eyre::eyre!("Failed to handle solana token swap request: {}", e))?;
98
99    Ok(())
100}
101
102#[cfg(test)]
103mod tests {}