use crate::{FilesClient, Result};
use serde::{Deserialize, Serialize};
use serde_json::json;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SiteEntity {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub admin_user_id: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub allowed_ips: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub allowed_countries: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub disallowed_countries: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_time_zone: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub domain: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub email: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub session_expiry: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ssl_required: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub subdomain: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub welcome_email_enabled: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_lockout: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_lockout_tries: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_lockout_within: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_lockout_lock_period: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub require_2fa: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub allowed_2fa_method_sms: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub allowed_2fa_method_totp: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub allowed_2fa_method_webauthn: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub allowed_2fa_method_yubi: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub currency: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub session_pinned_by_ip: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub bundle_expiration: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub days_to_retain_backups: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_prior_passwords: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub password_validity_days: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub password_min_length: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub password_require_letter: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub password_require_mixed: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub password_require_number: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub password_require_special: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub password_require_unbreached: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sftp_user_root_enabled: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub disable_password_reset: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub custom_namespace: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SiteUsageEntity {
#[serde(skip_serializing_if = "Option::is_none")]
pub current_storage: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub deleted_files_counted_in_minimum: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub deleted_files_storage: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub root_storage: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub total_billable_transfer_used: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub usage_by_top_level_dir: Option<serde_json::Value>,
}
pub struct SiteHandler {
client: FilesClient,
}
impl SiteHandler {
pub fn new(client: FilesClient) -> Self {
Self { client }
}
pub async fn get(&self) -> Result<SiteEntity> {
let response = self.client.get_raw("/site").await?;
Ok(serde_json::from_value(response)?)
}
pub async fn get_usage(&self) -> Result<SiteUsageEntity> {
let response = self.client.get_raw("/site/usage").await?;
Ok(serde_json::from_value(response)?)
}
#[allow(clippy::too_many_arguments)]
pub async fn update(
&self,
name: Option<&str>,
subdomain: Option<&str>,
domain: Option<&str>,
email: Option<&str>,
allowed_ips: Option<&str>,
require_2fa: Option<bool>,
) -> Result<SiteEntity> {
let mut request_body = json!({});
if let Some(n) = name {
request_body["name"] = json!(n);
}
if let Some(s) = subdomain {
request_body["subdomain"] = json!(s);
}
if let Some(d) = domain {
request_body["domain"] = json!(d);
}
if let Some(e) = email {
request_body["email"] = json!(e);
}
if let Some(ips) = allowed_ips {
request_body["allowed_ips"] = json!(ips);
}
if let Some(r2fa) = require_2fa {
request_body["require_2fa"] = json!(r2fa);
}
let response = self.client.patch_raw("/site", request_body).await?;
Ok(serde_json::from_value(response)?)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_handler_creation() {
let client = FilesClient::builder().api_key("test-key").build().unwrap();
let _handler = SiteHandler::new(client);
}
}