openzeppelin_relayer/domain/relayer/util.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
/// This module provides utility functions and structures for managing and interacting
/// with relayers within the application. It includes functions to retrieve relayers
/// by ID, construct network relayers, and handle unsupported operations for specific
/// relayer types.
///
/// The primary components of this module are:
/// - `get_relayer_by_id`: Retrieves a relayer from the repository using its ID.
/// - `get_network_relayer`: Constructs a network relayer using a relayer ID.
/// - `get_network_relayer_by_model`: Constructs a network relayer using a relayer model.
/// - `solana_not_supported`: Returns an error for unsupported Solana relayer operations.
///
/// These utilities are essential for the application's relayer management and
/// interaction with the underlying repositories and factories.
use actix_web::web::ThinData;
use crate::{
domain::{RelayerFactory, RelayerFactoryTrait},
jobs::JobProducer,
models::{ApiError, AppState, RelayerError, RelayerRepoModel},
repositories::Repository,
};
use super::NetworkRelayer;
/// Retrieves a relayer by its ID from the repository.
///
/// # Arguments
///
/// * `relayer_id` - A string slice that holds the ID of the relayer.
/// * `state` - A reference to the application state.
///
/// # Returns
///
/// * `Result<RelayerRepoModel, ApiError>` - Returns a `RelayerRepoModel` on success, or an
/// `ApiError` on failure.
pub async fn get_relayer_by_id(
relayer_id: String,
state: &ThinData<AppState<JobProducer>>,
) -> Result<RelayerRepoModel, ApiError> {
state
.relayer_repository
.get_by_id(relayer_id)
.await
.map_err(|e| e.into())
}
/// Retrieves a network relayer by its ID, constructing it using the relayer and signer models.
///
/// # Arguments
///
/// * `relayer_id` - A string slice that holds the ID of the relayer.
/// * `state` - A reference to the application state.
///
/// # Returns
///
/// * `Result<NetworkRelayer, ApiError>` - Returns a `NetworkRelayer` on success, or an `ApiError`
/// on failure.
pub async fn get_network_relayer(
relayer_id: String,
state: &ThinData<AppState<JobProducer>>,
) -> Result<NetworkRelayer, ApiError> {
let relayer_model = get_relayer_by_id(relayer_id, state).await?;
let signer_model = state
.signer_repository
.get_by_id(relayer_model.signer_id.clone())
.await?;
RelayerFactory::create_relayer(
relayer_model,
signer_model,
state.relayer_repository(),
state.transaction_repository(),
state.transaction_counter_store(),
state.job_producer(),
)
.map_err(|e| e.into())
}
/// Constructs a network relayer using a given relayer model.
///
/// # Arguments
///
/// * `relayer_model` - A `RelayerRepoModel` that holds the relayer data.
/// * `state` - A reference to the application state.
///
/// # Returns
///
/// * `Result<NetworkRelayer, ApiError>` - Returns a `NetworkRelayer` on success, or an `ApiError`
/// on failure.
pub async fn get_network_relayer_by_model(
relayer_model: RelayerRepoModel,
state: &ThinData<AppState<JobProducer>>,
) -> Result<NetworkRelayer, ApiError> {
let signer_model = state
.signer_repository
.get_by_id(relayer_model.signer_id.clone())
.await?;
RelayerFactory::create_relayer(
relayer_model,
signer_model,
state.relayer_repository(),
state.transaction_repository(),
state.transaction_counter_store(),
state.job_producer(),
)
.map_err(|e| e.into())
}
/// Returns an error indicating that the endpoint is not supported for Solana relayers.
///
/// # Returns
///
/// * `Result<T, RelayerError>` - Always returns a `RelayerError::NotSupported`.
pub fn solana_not_supported_relayer<T>() -> Result<T, RelayerError> {
Err(RelayerError::NotSupported(
"Endpoint is not supported for Solana relayers".to_string(),
))
}