1use crate::auth::Auth;
2use crate::error::ManagerError;
3use crate::gen::auth::apis::configuration::Configuration as AuthConfig;
4use crate::gen::manager::apis::configuration::Configuration as ManagerConfig;
5use crate::gen::task_automation::apis::configuration::Configuration as TaskAutomationConfig;
6use crate::gen::task_schedule::apis::configuration::Configuration as TaskScheduleConfig;
7use crate::gen::user::apis::configuration::Configuration as UserConfig;
8use crate::resources::agents::{AgentGroupsResource, AgentsResource};
9use crate::resources::applications::{ApplicationsResource, LocalAutomationsResource};
10use crate::resources::auth::AuthResource;
11use crate::resources::automations::AutomationsResource;
12use crate::resources::babeldesk::{BabeldeskResource, BabeldeskWidgetsResource};
13use crate::resources::businesshours::BusinessHoursResource;
14use crate::resources::calendars::CalendarsResource;
15use crate::resources::calls::{CallsResource, ReportingResource};
16use crate::resources::campaigns::CampaignsResource;
17use crate::resources::conferences::ConferencesResource;
18use crate::resources::conversations::ConversationsResource;
19use crate::resources::dashboards::DashboardsResource;
20use crate::resources::dialer::{DialerBehavioursResource, DialerResource};
21use crate::resources::events::EventsResource;
22use crate::resources::expressions::ExpressionsResource;
23use crate::resources::files::FilesResource;
24use crate::resources::integrations::IntegrationsResource;
25use crate::resources::logs::LogsResource;
26use crate::resources::me::MeResource;
27use crate::resources::metrics::MetricsResource;
28use crate::resources::numbers::NumbersResource;
29use crate::resources::outbound::OutboundResource;
30use crate::resources::phonebook::PhonebookResource;
31use crate::resources::prompts::PromptsResource;
32use crate::resources::queues::{QueueSelectionsResource, QueuesResource};
33use crate::resources::recordings::RecordingsResource;
34use crate::resources::routing::RoutingResource;
35use crate::resources::schedules::TaskSchedulesResource;
36use crate::resources::sessions::SessionsResource;
37use crate::resources::settings::SettingsResource;
38use crate::resources::sms::SmsResource;
39use crate::resources::system::SystemResource;
40use crate::resources::tasks::{
41 TaskMetricsResource, TaskScriptsResource, TaskSecretsResource, TaskSelectionConfigResource,
42 TasksResource,
43};
44use crate::resources::triggers::TriggersResource;
45use crate::resources::users::UsersResource;
46use crate::retry::{RetryMiddleware, RetryPolicy};
47use crate::token::{SharedCfg, TokenManager};
48
49pub const DEFAULT_BASE_URL: &str = "https://services.babelforce.com";
51
52pub struct ManagerClient {
55 pub users: UsersResource,
57 pub agents: AgentsResource,
59 pub me: MeResource,
61 pub calls: CallsResource,
63 pub sms: SmsResource,
65 pub numbers: NumbersResource,
67 pub conferences: ConferencesResource,
69 pub queues: QueuesResource,
71 pub recordings: RecordingsResource,
73 pub routing: RoutingResource,
75 pub triggers: TriggersResource,
77 pub automations: AutomationsResource,
79 pub integrations: IntegrationsResource,
81 pub outbound: OutboundResource,
83 pub phonebook: PhonebookResource,
85 pub campaigns: CampaignsResource,
87 pub business_hours: BusinessHoursResource,
89 pub calendars: CalendarsResource,
91 pub conversations: ConversationsResource,
93 pub dashboards: DashboardsResource,
95 pub dialer: DialerResource,
97 pub sessions: SessionsResource,
99 pub prompts: PromptsResource,
101 pub babeldesk: BabeldeskResource,
103 pub events: EventsResource,
105 pub expressions: ExpressionsResource,
107 pub files: FilesResource,
109 pub logs: LogsResource,
111 pub metrics: MetricsResource,
113 pub system: SystemResource,
115 pub settings: SettingsResource,
117 pub applications: ApplicationsResource,
119 pub tasks: TasksResource,
121 pub schedules: TaskSchedulesResource,
123 pub auth: AuthResource,
125}
126
127impl ManagerClient {
128 pub async fn connect(auth: Auth) -> Result<Self, ManagerError> {
130 Self::builder(auth).connect().await
131 }
132
133 pub fn builder(auth: Auth) -> ManagerClientBuilder {
135 ManagerClientBuilder {
136 base_url: DEFAULT_BASE_URL.to_string(),
137 auth,
138 retry: RetryPolicy::default(),
139 }
140 }
141}
142
143pub struct ManagerClientBuilder {
145 base_url: String,
146 auth: Auth,
147 retry: RetryPolicy,
148}
149
150impl ManagerClientBuilder {
151 pub fn base_url(mut self, url: impl Into<String>) -> Self {
153 self.base_url = url.into();
154 self
155 }
156
157 pub fn retry(mut self, policy: RetryPolicy) -> Self {
159 self.retry = policy;
160 self
161 }
162
163 pub async fn connect(self) -> Result<ManagerClient, ManagerError> {
166 let base = self.base_url.trim_end_matches('/').to_string();
167
168 let http = reqwest::Client::builder()
172 .default_headers(self.auth.static_headers())
173 .build()
174 .map_err(|e| ManagerError::Network(e.to_string()))?;
175 let http = reqwest_middleware::ClientBuilder::new(http)
179 .with(RetryMiddleware::new(self.retry.clone()))
180 .build();
181
182 let token_manager = TokenManager::connect(&base, &self.auth, http.clone()).await?;
185 let (epoch, token) = match &token_manager {
186 Some(manager) => {
187 let (epoch, token) = manager.current().await?;
188 (epoch, Some(token))
189 }
190 None => (0, None),
191 };
192
193 let user_agent =
194 Some(concat!("babelforce-manager-sdk-rust/", env!("CARGO_PKG_VERSION")).to_string());
195
196 let cfg = SharedCfg::new(
197 ManagerConfig {
198 base_path: base.clone(),
199 user_agent: user_agent.clone(),
200 client: http.clone(),
201 basic_auth: None,
202 oauth_access_token: token.clone(),
203 bearer_access_token: None,
204 api_key: None,
205 },
206 token_manager.clone(),
207 epoch,
208 );
209
210 let user_cfg = SharedCfg::new(
212 UserConfig {
213 base_path: base.clone(),
214 user_agent: user_agent.clone(),
215 client: http.clone(),
216 basic_auth: None,
217 oauth_access_token: token.clone(),
218 bearer_access_token: None,
219 api_key: None,
220 },
221 token_manager.clone(),
222 epoch,
223 );
224 let task_automation_cfg = SharedCfg::new(
225 TaskAutomationConfig {
226 base_path: base.clone(),
227 user_agent: user_agent.clone(),
228 client: http.clone(),
229 basic_auth: None,
230 oauth_access_token: token.clone(),
231 bearer_access_token: None,
232 api_key: None,
233 },
234 token_manager.clone(),
235 epoch,
236 );
237 let task_schedule_cfg = SharedCfg::new(
238 TaskScheduleConfig {
239 base_path: base.clone(),
240 user_agent: user_agent.clone(),
241 client: http.clone(),
242 basic_auth: None,
243 oauth_access_token: token.clone(),
244 bearer_access_token: None,
245 api_key: None,
246 },
247 token_manager.clone(),
248 epoch,
249 );
250 let auth_cfg = SharedCfg::new(
253 AuthConfig {
254 base_path: base,
255 user_agent,
256 client: http,
257 basic_auth: None,
258 oauth_access_token: token,
259 bearer_access_token: None,
260 api_key: None,
261 },
262 token_manager,
263 epoch,
264 );
265
266 Ok(ManagerClient {
267 users: UsersResource {
268 cfg: cfg.clone(),
269 retry: self.retry.clone(),
270 },
271 agents: AgentsResource {
272 cfg: cfg.clone(),
273 retry: self.retry.clone(),
274 groups: AgentGroupsResource {
275 cfg: cfg.clone(),
276 retry: self.retry.clone(),
277 },
278 },
279 me: MeResource {
280 cfg: user_cfg,
281 retry: self.retry.clone(),
282 },
283 calls: CallsResource {
284 cfg: cfg.clone(),
285 retry: self.retry.clone(),
286 reporting: ReportingResource {
287 cfg: cfg.clone(),
288 retry: self.retry.clone(),
289 },
290 },
291 sms: SmsResource {
292 cfg: cfg.clone(),
293 retry: self.retry.clone(),
294 },
295 numbers: NumbersResource {
296 cfg: cfg.clone(),
297 retry: self.retry.clone(),
298 },
299 conferences: ConferencesResource {
300 cfg: cfg.clone(),
301 retry: self.retry.clone(),
302 },
303 queues: QueuesResource {
304 cfg: cfg.clone(),
305 retry: self.retry.clone(),
306 selections: QueueSelectionsResource {
307 cfg: cfg.clone(),
308 retry: self.retry.clone(),
309 },
310 },
311 recordings: RecordingsResource {
312 cfg: cfg.clone(),
313 retry: self.retry.clone(),
314 },
315 routing: RoutingResource {
316 cfg: cfg.clone(),
317 retry: self.retry.clone(),
318 },
319 triggers: TriggersResource {
320 cfg: cfg.clone(),
321 retry: self.retry.clone(),
322 },
323 automations: AutomationsResource {
324 cfg: cfg.clone(),
325 retry: self.retry.clone(),
326 },
327 integrations: IntegrationsResource {
328 cfg: cfg.clone(),
329 retry: self.retry.clone(),
330 },
331 outbound: OutboundResource {
332 cfg: cfg.clone(),
333 retry: self.retry.clone(),
334 },
335 phonebook: PhonebookResource {
336 cfg: cfg.clone(),
337 retry: self.retry.clone(),
338 },
339 campaigns: CampaignsResource {
340 cfg: cfg.clone(),
341 retry: self.retry.clone(),
342 },
343 business_hours: BusinessHoursResource {
344 cfg: cfg.clone(),
345 retry: self.retry.clone(),
346 },
347 calendars: CalendarsResource {
348 cfg: cfg.clone(),
349 retry: self.retry.clone(),
350 },
351 conversations: ConversationsResource {
352 cfg: cfg.clone(),
353 retry: self.retry.clone(),
354 },
355 dashboards: DashboardsResource {
356 cfg: cfg.clone(),
357 retry: self.retry.clone(),
358 },
359 dialer: DialerResource {
360 cfg: cfg.clone(),
361 retry: self.retry.clone(),
362 behaviours: DialerBehavioursResource {
363 cfg: cfg.clone(),
364 retry: self.retry.clone(),
365 },
366 },
367 sessions: SessionsResource {
368 cfg: cfg.clone(),
369 retry: self.retry.clone(),
370 },
371 prompts: PromptsResource {
372 cfg: cfg.clone(),
373 retry: self.retry.clone(),
374 },
375 babeldesk: BabeldeskResource {
376 cfg: cfg.clone(),
377 retry: self.retry.clone(),
378 widgets: BabeldeskWidgetsResource {
379 cfg: cfg.clone(),
380 retry: self.retry.clone(),
381 },
382 },
383 events: EventsResource {
384 cfg: cfg.clone(),
385 retry: self.retry.clone(),
386 },
387 expressions: ExpressionsResource {
388 cfg: cfg.clone(),
389 retry: self.retry.clone(),
390 },
391 files: FilesResource {
392 cfg: cfg.clone(),
393 retry: self.retry.clone(),
394 },
395 logs: LogsResource {
396 cfg: cfg.clone(),
397 retry: self.retry.clone(),
398 },
399 metrics: MetricsResource {
400 cfg: cfg.clone(),
401 retry: self.retry.clone(),
402 },
403 system: SystemResource {
404 cfg: cfg.clone(),
405 retry: self.retry.clone(),
406 },
407 settings: SettingsResource {
408 cfg: cfg.clone(),
409 retry: self.retry.clone(),
410 },
411 applications: ApplicationsResource {
412 cfg: cfg.clone(),
413 retry: self.retry.clone(),
414 local_automations: LocalAutomationsResource {
415 cfg: cfg.clone(),
416 retry: self.retry.clone(),
417 },
418 },
419 tasks: TasksResource {
420 cfg: task_automation_cfg.clone(),
421 retry: self.retry.clone(),
422 scripts: TaskScriptsResource {
423 cfg: task_automation_cfg.clone(),
424 retry: self.retry.clone(),
425 },
426 secrets: TaskSecretsResource {
427 cfg: task_automation_cfg.clone(),
428 retry: self.retry.clone(),
429 },
430 selection_config: TaskSelectionConfigResource {
431 cfg: task_automation_cfg.clone(),
432 retry: self.retry.clone(),
433 },
434 metrics: TaskMetricsResource {
435 cfg: task_automation_cfg.clone(),
436 retry: self.retry.clone(),
437 },
438 },
439 schedules: TaskSchedulesResource {
440 cfg: task_schedule_cfg,
441 retry: self.retry.clone(),
442 },
443 auth: AuthResource {
444 cfg: auth_cfg,
445 retry: self.retry.clone(),
446 },
447 })
448 }
449}