use crate::types::Link;
use crate::{CloudClient, Result};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ModulesData {
#[serde(skip_serializing_if = "Option::is_none")]
pub modules: Option<Vec<Module>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub links: Option<Vec<Link>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RootAccount {
#[serde(skip_serializing_if = "Option::is_none")]
pub account: Option<Account>,
#[serde(skip_serializing_if = "Option::is_none")]
pub links: Option<Vec<Link>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Account {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_timestamp: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub updated_timestamp: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub marketplace_status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub key: Option<AccountApiKeyInfo>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AccountApiKeyInfo {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub account_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub account_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub allowed_source_ips: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub owner: Option<AccountApiKeyOwner>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_account_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub http_source_ip: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub account_marketplace_id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AccountApiKeyOwner {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub email: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AccountSystemLogEntry {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub originator: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub api_key_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub resource: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub resource_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub r#type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Regions {
#[serde(skip_serializing_if = "Option::is_none")]
pub regions: Option<Vec<Region>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub links: Option<Vec<Link>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Region {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub provider: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PaymentMethods {
#[serde(skip_serializing_if = "Option::is_none")]
pub account_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub payment_methods: Option<Vec<PaymentMethod>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub links: Option<Vec<Link>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PaymentMethod {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub r#type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub credit_card_ends_with: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name_on_card: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expiration_month: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expiration_year: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub links: Option<Vec<Link>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Module {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub capability_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parameters: Option<Vec<ModuleParameter>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ModuleParameter {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub r#type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_value: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub required: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AccountSystemLogEntries {
#[serde(skip_serializing_if = "Option::is_none")]
pub entries: Option<Vec<AccountSystemLogEntry>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub links: Option<Vec<Link>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SearchScalingFactorsData {
#[serde(skip_serializing_if = "Option::is_none")]
pub query_performance_factors: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub links: Option<Vec<Link>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AccountSessionLogEntry {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_agent: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ip_address: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_role: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub r#type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub action: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DataPersistenceEntry {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct DataPersistenceOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub data_persistence: Option<Vec<DataPersistenceEntry>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub links: Option<Vec<Link>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AccountSessionLogEntries {
#[serde(skip_serializing_if = "Option::is_none")]
pub entries: Option<Vec<AccountSessionLogEntry>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub links: Option<Vec<Link>>,
}
pub struct AccountHandler {
client: CloudClient,
}
impl AccountHandler {
#[must_use]
pub fn new(client: CloudClient) -> Self {
Self { client }
}
pub async fn get_current_account(&self) -> Result<RootAccount> {
self.client.get("/").await
}
pub async fn get_data_persistence_options(&self) -> Result<DataPersistenceOptions> {
self.client.get("/data-persistence").await
}
pub async fn get_supported_database_modules(&self) -> Result<ModulesData> {
self.client.get("/database-modules").await
}
pub async fn get_account_system_logs(
&self,
offset: Option<i32>,
limit: Option<i32>,
) -> Result<AccountSystemLogEntries> {
let mut query = Vec::new();
if let Some(v) = offset {
query.push(format!("offset={v}"));
}
if let Some(v) = limit {
query.push(format!("limit={v}"));
}
let query_string = if query.is_empty() {
String::new()
} else {
format!("?{}", query.join("&"))
};
self.client.get(&format!("/logs{query_string}")).await
}
pub async fn get_account_payment_methods(&self) -> Result<PaymentMethods> {
self.client.get("/payment-methods").await
}
pub async fn get_supported_search_scaling_factors(&self) -> Result<SearchScalingFactorsData> {
self.client.get("/query-performance-factors").await
}
pub async fn get_supported_regions(&self, provider: Option<String>) -> Result<Regions> {
let mut query = Vec::new();
if let Some(v) = provider {
query.push(format!("provider={v}"));
}
let query_string = if query.is_empty() {
String::new()
} else {
format!("?{}", query.join("&"))
};
self.client.get(&format!("/regions{query_string}")).await
}
pub async fn get_account_session_logs(
&self,
offset: Option<i32>,
limit: Option<i32>,
) -> Result<AccountSessionLogEntries> {
let mut query = Vec::new();
if let Some(v) = offset {
query.push(format!("offset={v}"));
}
if let Some(v) = limit {
query.push(format!("limit={v}"));
}
let query_string = if query.is_empty() {
String::new()
} else {
format!("?{}", query.join("&"))
};
self.client
.get(&format!("/session-logs{query_string}"))
.await
}
}