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