autoendpoint/routers/stub/
router.rs1use super::client::StubClient;
2use super::error::StubError;
3use super::settings::{StubServerSettings, StubSettings};
4use crate::error::ApiResult;
5use crate::extractors::notification::Notification;
6use crate::extractors::router_data_input::RouterDataInput;
7use crate::routers::{Router, RouterError, RouterResponse};
8use async_trait::async_trait;
9use serde_json::Value;
10use std::collections::HashMap;
11
12pub struct StubRouter {
31 settings: StubSettings,
32 server_settings: StubServerSettings,
33 clients: HashMap<String, StubClient>,
35}
36
37impl StubRouter {
38 pub fn new(settings: StubSettings) -> Result<Self, StubError> {
40 let server_settings =
41 serde_json::from_str::<StubServerSettings>(&settings.server_credentials)
42 .unwrap_or_default();
43 let clients = Self::create_clients(&server_settings);
44 Ok(Self {
45 settings,
46 server_settings,
47 clients,
48 })
49 }
50
51 fn create_clients(server_settings: &StubServerSettings) -> HashMap<String, StubClient> {
57 let mut clients = HashMap::new();
58 clients.insert("success".to_owned(), StubClient::success());
61 clients.insert(
62 "error".to_owned(),
63 StubClient::error(StubError::General(server_settings.error.clone())),
64 );
65 clients
66 }
67}
68
69#[async_trait(?Send)]
70impl Router for StubRouter {
71 fn register(
72 &self,
73 router_data_input: &RouterDataInput,
74 app_id: &str,
75 ) -> Result<HashMap<String, Value>, RouterError> {
76 if !self.clients.contains_key(app_id) {
77 return Err(
78 StubError::General(format!("Unknown App ID: {}", app_id.to_owned())).into(),
79 );
80 }
81
82 let mut router_data = HashMap::new();
83 router_data.insert(
84 "token".to_owned(),
85 serde_json::to_value(&router_data_input.token).unwrap(),
86 );
87 router_data.insert("app_id".to_owned(), serde_json::to_value(app_id).unwrap());
88
89 Ok(router_data)
90 }
91
92 async fn route_notification(&self, notification: Notification) -> ApiResult<RouterResponse> {
93 debug!(
94 "Sending Test notification to UAID {}",
95 notification.subscription.user.uaid
96 );
97 trace!("Notification = {:?}", notification);
98
99 let router_data = notification
100 .subscription
101 .user
102 .router_data
103 .as_ref()
104 .ok_or(StubError::General("No Registration".to_owned()))?;
105
106 let default = Value::String("success".to_owned());
107 let client_type = router_data.get("type").unwrap_or(&default);
108 let client = self
109 .clients
110 .get(&client_type.to_string().to_lowercase())
111 .unwrap_or_else(|| self.clients.get("error").unwrap());
112 client.call(&self.server_settings).await?;
113 Ok(RouterResponse::success(
114 format!("{}/m/123", self.settings.url),
115 notification.headers.ttl as usize,
116 ))
117 }
118}