use crate::{
queries, utils,
v1::{bool_from_int, bool_to_int, response_payload},
FilenSettings,
};
use secstr::SecUtf8;
use serde::{Deserialize, Serialize};
use snafu::{ResultExt, Snafu};
type Result<T, E = Error> = std::result::Result<T, E>;
const USER_USAGE_PATH: &str = "/v1/user/usage";
const USER_SYNC_GET_DATA_PATH: &str = "/v1/user/sync/get/data";
#[derive(Snafu, Debug)]
pub enum Error {
#[snafu(display("{} query failed: {}", USER_USAGE_PATH, source))]
UserUsageQueryFailed { source: queries::Error },
#[snafu(display("{} query failed: {}", USER_SYNC_GET_DATA_PATH, source))]
UserSyncGetDataQueryFailed { source: queries::Error },
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct UserSyncGetDataResponseData {
pub email: String,
#[serde(rename = "maxStorage")]
pub max_storage: u64,
#[serde(rename = "storageUsed")]
pub storage_used: u64,
#[serde(
rename = "isPremium",
deserialize_with = "bool_from_int",
serialize_with = "bool_to_int"
)]
pub is_premium: bool,
}
utils::display_from_json!(UserSyncGetDataResponseData);
response_payload!(
UserSyncGetDataResponsePayload<UserSyncGetDataResponseData>
);
#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
pub struct UserUsageResponseData {
pub uploads: u64,
pub folders: u64,
pub storage: u64,
pub max: u64,
#[serde(rename = "twoFactorEnabled")]
pub two_factor_enabled: bool,
pub pro: bool,
pub email: String,
}
utils::display_from_json!(UserUsageResponseData);
response_payload!(
UserUsageResponsePayload<UserUsageResponseData>
);
pub fn user_sync_get_data_request(
api_key: &SecUtf8,
filen_settings: &FilenSettings,
) -> Result<UserSyncGetDataResponsePayload> {
queries::query_filen_api(USER_SYNC_GET_DATA_PATH, &utils::api_key_json(api_key), filen_settings)
.context(UserSyncGetDataQueryFailedSnafu {})
}
#[cfg(feature = "async")]
pub async fn user_sync_get_data_request_async(
api_key: &SecUtf8,
filen_settings: &FilenSettings,
) -> Result<UserSyncGetDataResponsePayload> {
queries::query_filen_api_async(USER_SYNC_GET_DATA_PATH, &utils::api_key_json(api_key), filen_settings)
.await
.context(UserSyncGetDataQueryFailedSnafu {})
}
pub fn user_usage_request(api_key: &SecUtf8, filen_settings: &FilenSettings) -> Result<UserUsageResponsePayload> {
queries::query_filen_api(USER_USAGE_PATH, &utils::api_key_json(api_key), filen_settings)
.context(UserUsageQueryFailedSnafu {})
}
#[cfg(feature = "async")]
pub async fn user_usage_request_async(
api_key: &SecUtf8,
filen_settings: &FilenSettings,
) -> Result<UserUsageResponsePayload> {
queries::query_filen_api_async(USER_USAGE_PATH, &utils::api_key_json(api_key), filen_settings)
.await
.context(UserUsageQueryFailedSnafu {})
}