1use crate::types::Link;
47use crate::{CloudClient, Result};
48use serde::{Deserialize, Serialize};
49
50#[derive(Debug, Clone, Serialize, Deserialize)]
56pub struct ModulesData {
57 #[serde(skip_serializing_if = "Option::is_none")]
58 pub modules: Option<Vec<Module>>,
59
60 #[serde(skip_serializing_if = "Option::is_none")]
62 pub links: Option<Vec<Link>>,
63}
64
65#[derive(Debug, Clone, Serialize, Deserialize)]
67#[serde(rename_all = "camelCase")]
68pub struct RootAccount {
69 #[serde(skip_serializing_if = "Option::is_none")]
71 pub account: Option<Account>,
72
73 #[serde(skip_serializing_if = "Option::is_none")]
75 pub links: Option<Vec<Link>>,
76}
77
78#[derive(Debug, Clone, Serialize, Deserialize)]
80#[serde(rename_all = "camelCase")]
81pub struct Account {
82 #[serde(skip_serializing_if = "Option::is_none")]
84 pub id: Option<i32>,
85
86 #[serde(skip_serializing_if = "Option::is_none")]
88 pub name: Option<String>,
89
90 #[serde(skip_serializing_if = "Option::is_none")]
92 pub created_timestamp: Option<String>,
93
94 #[serde(skip_serializing_if = "Option::is_none")]
96 pub updated_timestamp: Option<String>,
97
98 #[serde(skip_serializing_if = "Option::is_none")]
100 pub marketplace_status: Option<String>,
101
102 #[serde(skip_serializing_if = "Option::is_none")]
104 pub key: Option<AccountApiKeyInfo>,
105}
106
107#[derive(Debug, Clone, Serialize, Deserialize)]
109#[serde(rename_all = "camelCase")]
110pub struct AccountApiKeyInfo {
111 #[serde(skip_serializing_if = "Option::is_none")]
113 pub name: Option<String>,
114
115 #[serde(skip_serializing_if = "Option::is_none")]
117 pub account_id: Option<i32>,
118
119 #[serde(skip_serializing_if = "Option::is_none")]
121 pub account_name: Option<String>,
122
123 #[serde(skip_serializing_if = "Option::is_none")]
125 pub allowed_source_ips: Option<Vec<String>>,
126
127 #[serde(skip_serializing_if = "Option::is_none")]
129 pub owner: Option<AccountApiKeyOwner>,
130
131 #[serde(skip_serializing_if = "Option::is_none")]
133 pub user_account_id: Option<i32>,
134
135 #[serde(skip_serializing_if = "Option::is_none")]
137 pub http_source_ip: Option<String>,
138
139 #[serde(skip_serializing_if = "Option::is_none")]
141 pub account_marketplace_id: Option<String>,
142}
143
144#[derive(Debug, Clone, Serialize, Deserialize)]
146#[serde(rename_all = "camelCase")]
147pub struct AccountApiKeyOwner {
148 #[serde(skip_serializing_if = "Option::is_none")]
150 pub name: Option<String>,
151
152 #[serde(skip_serializing_if = "Option::is_none")]
154 pub email: Option<String>,
155}
156
157#[derive(Debug, Clone, Serialize, Deserialize)]
159#[serde(rename_all = "camelCase")]
160pub struct AccountSystemLogEntry {
161 #[serde(skip_serializing_if = "Option::is_none")]
162 pub id: Option<i32>,
163
164 #[serde(skip_serializing_if = "Option::is_none")]
165 pub time: Option<String>,
166
167 #[serde(skip_serializing_if = "Option::is_none")]
168 pub originator: Option<String>,
169
170 #[serde(skip_serializing_if = "Option::is_none")]
171 pub api_key_name: Option<String>,
172
173 #[serde(skip_serializing_if = "Option::is_none")]
174 pub resource: Option<String>,
175
176 #[serde(skip_serializing_if = "Option::is_none")]
178 pub resource_id: Option<i32>,
179
180 #[serde(skip_serializing_if = "Option::is_none")]
181 pub r#type: Option<String>,
182
183 #[serde(skip_serializing_if = "Option::is_none")]
184 pub description: Option<String>,
185}
186
187#[derive(Debug, Clone, Serialize, Deserialize)]
189pub struct Regions {
190 #[serde(skip_serializing_if = "Option::is_none")]
191 pub regions: Option<Vec<Region>>,
192
193 #[serde(skip_serializing_if = "Option::is_none")]
195 pub links: Option<Vec<Link>>,
196}
197
198#[derive(Debug, Clone, Serialize, Deserialize)]
200pub struct Region {
201 #[serde(skip_serializing_if = "Option::is_none")]
203 pub id: Option<i32>,
204
205 #[serde(skip_serializing_if = "Option::is_none")]
207 pub name: Option<String>,
208
209 #[serde(skip_serializing_if = "Option::is_none")]
211 pub provider: Option<String>,
212}
213
214#[derive(Debug, Clone, Serialize, Deserialize)]
216#[serde(rename_all = "camelCase")]
217pub struct PaymentMethods {
218 #[serde(skip_serializing_if = "Option::is_none")]
219 pub account_id: Option<i32>,
220
221 #[serde(skip_serializing_if = "Option::is_none")]
223 pub payment_methods: Option<Vec<PaymentMethod>>,
224
225 #[serde(skip_serializing_if = "Option::is_none")]
227 pub links: Option<Vec<Link>>,
228}
229
230#[derive(Debug, Clone, Serialize, Deserialize)]
232#[serde(rename_all = "camelCase")]
233pub struct PaymentMethod {
234 #[serde(skip_serializing_if = "Option::is_none")]
236 pub id: Option<i32>,
237
238 #[serde(skip_serializing_if = "Option::is_none")]
240 pub r#type: Option<String>,
241
242 #[serde(skip_serializing_if = "Option::is_none")]
244 pub credit_card_ends_with: Option<i32>,
245
246 #[serde(skip_serializing_if = "Option::is_none")]
248 pub name_on_card: Option<String>,
249
250 #[serde(skip_serializing_if = "Option::is_none")]
252 pub expiration_month: Option<i32>,
253
254 #[serde(skip_serializing_if = "Option::is_none")]
256 pub expiration_year: Option<i32>,
257
258 #[serde(skip_serializing_if = "Option::is_none")]
260 pub links: Option<Vec<Link>>,
261}
262
263#[derive(Debug, Clone, Serialize, Deserialize)]
265#[serde(rename_all = "camelCase")]
266pub struct Module {
267 #[serde(skip_serializing_if = "Option::is_none")]
269 pub name: Option<String>,
270
271 #[serde(skip_serializing_if = "Option::is_none")]
273 pub capability_name: Option<String>,
274
275 #[serde(skip_serializing_if = "Option::is_none")]
277 pub description: Option<String>,
278
279 #[serde(skip_serializing_if = "Option::is_none")]
281 pub parameters: Option<Vec<ModuleParameter>>,
282}
283
284#[derive(Debug, Clone, Serialize, Deserialize)]
286#[serde(rename_all = "camelCase")]
287pub struct ModuleParameter {
288 #[serde(skip_serializing_if = "Option::is_none")]
290 pub name: Option<String>,
291
292 #[serde(skip_serializing_if = "Option::is_none")]
294 pub description: Option<String>,
295
296 #[serde(skip_serializing_if = "Option::is_none")]
298 pub r#type: Option<String>,
299
300 #[serde(skip_serializing_if = "Option::is_none")]
302 pub default_value: Option<i64>,
303
304 #[serde(skip_serializing_if = "Option::is_none")]
306 pub required: Option<bool>,
307}
308
309#[derive(Debug, Clone, Serialize, Deserialize)]
311pub struct AccountSystemLogEntries {
312 #[serde(skip_serializing_if = "Option::is_none")]
313 pub entries: Option<Vec<AccountSystemLogEntry>>,
314
315 #[serde(skip_serializing_if = "Option::is_none")]
317 pub links: Option<Vec<Link>>,
318}
319
320#[derive(Debug, Clone, Serialize, Deserialize)]
322#[serde(rename_all = "camelCase")]
323pub struct SearchScalingFactorsData {
324 #[serde(skip_serializing_if = "Option::is_none")]
326 pub query_performance_factors: Option<Vec<String>>,
327
328 #[serde(skip_serializing_if = "Option::is_none")]
330 pub links: Option<Vec<Link>>,
331}
332
333#[derive(Debug, Clone, Serialize, Deserialize)]
335#[serde(rename_all = "camelCase")]
336pub struct AccountSessionLogEntry {
337 #[serde(skip_serializing_if = "Option::is_none")]
339 pub id: Option<String>,
340
341 #[serde(skip_serializing_if = "Option::is_none")]
343 pub time: Option<String>,
344
345 #[serde(skip_serializing_if = "Option::is_none")]
347 pub user: Option<String>,
348
349 #[serde(skip_serializing_if = "Option::is_none")]
351 pub user_agent: Option<String>,
352
353 #[serde(skip_serializing_if = "Option::is_none")]
355 pub ip_address: Option<String>,
356
357 #[serde(skip_serializing_if = "Option::is_none")]
359 pub user_role: Option<String>,
360
361 #[serde(skip_serializing_if = "Option::is_none")]
363 pub r#type: Option<String>,
364
365 #[serde(skip_serializing_if = "Option::is_none")]
367 pub action: Option<String>,
368}
369
370#[derive(Debug, Clone, Serialize, Deserialize)]
372pub struct DataPersistenceEntry {
373 #[serde(skip_serializing_if = "Option::is_none")]
375 pub name: Option<String>,
376
377 #[serde(skip_serializing_if = "Option::is_none")]
379 pub description: Option<String>,
380}
381
382#[derive(Debug, Clone, Serialize, Deserialize)]
384#[serde(rename_all = "camelCase")]
385pub struct DataPersistenceOptions {
386 #[serde(skip_serializing_if = "Option::is_none")]
388 pub data_persistence: Option<Vec<DataPersistenceEntry>>,
389
390 #[serde(skip_serializing_if = "Option::is_none")]
392 pub links: Option<Vec<Link>>,
393}
394
395#[derive(Debug, Clone, Serialize, Deserialize)]
397pub struct AccountSessionLogEntries {
398 #[serde(skip_serializing_if = "Option::is_none")]
399 pub entries: Option<Vec<AccountSessionLogEntry>>,
400
401 #[serde(skip_serializing_if = "Option::is_none")]
403 pub links: Option<Vec<Link>>,
404}
405
406pub struct AccountHandler {
416 client: CloudClient,
417}
418
419impl AccountHandler {
420 #[must_use]
422 pub fn new(client: CloudClient) -> Self {
423 Self { client }
424 }
425
426 pub async fn get_current_account(&self) -> Result<RootAccount> {
450 self.client.get("/").await
451 }
452
453 pub async fn get_data_persistence_options(&self) -> Result<DataPersistenceOptions> {
458 self.client.get("/data-persistence").await
459 }
460
461 pub async fn get_supported_database_modules(&self) -> Result<ModulesData> {
466 self.client.get("/database-modules").await
467 }
468
469 pub async fn get_account_system_logs(
474 &self,
475 offset: Option<i32>,
476 limit: Option<i32>,
477 ) -> Result<AccountSystemLogEntries> {
478 let mut query = Vec::new();
479 if let Some(v) = offset {
480 query.push(format!("offset={v}"));
481 }
482 if let Some(v) = limit {
483 query.push(format!("limit={v}"));
484 }
485 let query_string = if query.is_empty() {
486 String::new()
487 } else {
488 format!("?{}", query.join("&"))
489 };
490 self.client.get(&format!("/logs{query_string}")).await
491 }
492
493 pub async fn get_account_payment_methods(&self) -> Result<PaymentMethods> {
498 self.client.get("/payment-methods").await
499 }
500
501 pub async fn get_supported_search_scaling_factors(&self) -> Result<SearchScalingFactorsData> {
506 self.client.get("/query-performance-factors").await
507 }
508
509 pub async fn get_supported_regions(&self, provider: Option<String>) -> Result<Regions> {
514 let mut query = Vec::new();
515 if let Some(v) = provider {
516 query.push(format!("provider={v}"));
517 }
518 let query_string = if query.is_empty() {
519 String::new()
520 } else {
521 format!("?{}", query.join("&"))
522 };
523 self.client.get(&format!("/regions{query_string}")).await
524 }
525
526 pub async fn get_account_session_logs(
531 &self,
532 offset: Option<i32>,
533 limit: Option<i32>,
534 ) -> Result<AccountSessionLogEntries> {
535 let mut query = Vec::new();
536 if let Some(v) = offset {
537 query.push(format!("offset={v}"));
538 }
539 if let Some(v) = limit {
540 query.push(format!("limit={v}"));
541 }
542 let query_string = if query.is_empty() {
543 String::new()
544 } else {
545 format!("?{}", query.join("&"))
546 };
547 self.client
548 .get(&format!("/session-logs{query_string}"))
549 .await
550 }
551}