pub mod admin;
use crate::{
request::request, CCashError, CCashResponse, CCashSession, CCashUser, TransactionLog,
};
use reqwest::Method;
use velcro::hash_map;
pub async fn get_balance(
session: &CCashSession,
user: &CCashUser,
) -> Result<u32, CCashError> {
let url = format!(
"{}/user/balance?name={}",
&session.session_url, &user.username
);
let r = request::<()>(Method::GET, session, &url, Some(user), None).await?;
if let Ok(v) = r.convert_message::<u32>() {
Ok(v)
} else {
Err(r.into())
}
}
pub async fn get_logs(
session: &CCashSession,
user: &CCashUser,
) -> Result<Vec<TransactionLog>, CCashError> {
let url = format!("{}/user/log", &session.session_url);
let r = request::<()>(Method::GET, session, &url, Some(user), None).await?;
if let Ok(v) = r.convert_message::<Vec<TransactionLog>>() {
Ok(v)
} else {
Err(r.into())
}
}
pub async fn contains_user(
session: &CCashSession,
user: &CCashUser,
) -> Result<bool, CCashError> {
let url = format!(
"{}/user/exists?name={}",
&session.session_url, &user.username
);
let r = request::<()>(Method::GET, session, &url, Some(user), None).await?;
match r {
CCashResponse::Success { .. } => Ok(true),
#[cfg(feature = "interpret_endpoint_errors_as_false")]
CCashResponse::Error { .. } => Ok(false),
#[cfg(not(feature = "interpret_endpoint_errors_as_false"))]
CCashResponse::Error { code: 401, .. } => Ok(false),
#[cfg(not(feature = "interpret_endpoint_errors_as_false"))]
CCashResponse::Error { .. } => Err(r.into()),
}
}
pub async fn verify_password(
session: &CCashSession,
user: &CCashUser,
) -> Result<bool, CCashError> {
let url = format!("{}/user/verify_password", &session.session_url);
let r = request::<()>(Method::POST, session, &url, Some(user), None).await?;
match r {
CCashResponse::Success { .. } => Ok(true),
#[cfg(feature = "interpret_endpoint_errors_as_false")]
CCashResponse::Error { .. } => Ok(false),
#[cfg(not(feature = "interpret_endpoint_errors_as_false"))]
CCashResponse::Error { code: 401, .. } => Ok(false),
#[cfg(not(feature = "interpret_endpoint_errors_as_false"))]
CCashResponse::Error { .. } => Err(r.into()),
}
}
pub async fn change_password(
session: &CCashSession,
user: &mut CCashUser,
new_password: &str,
) -> Result<bool, CCashError> {
let url = format!("{}/user/change_password", &session.session_url);
let body = hash_map! { "pass": new_password };
let r = request(Method::PATCH, session, &url, Some(user), Some(&body)).await?;
match r {
CCashResponse::Success { .. } => {
user.update_password(new_password);
Ok(true)
},
#[cfg(feature = "interpret_endpoint_errors_as_false")]
CCashResponse::Error { .. } => Ok(false),
#[cfg(not(feature = "interpret_endpoint_errors_as_false"))]
CCashResponse::Error { .. } => Err(r.into()),
}
}
pub async fn send_funds(
session: &CCashSession,
user: &CCashUser,
recipient_name: &str,
amount: u32,
) -> Result<u32, CCashError> {
#[derive(serde::Serialize)]
struct FundsTransfer {
name: String,
amount: u32,
}
let url = format!("{}/user/transfer", &session.session_url);
let body = FundsTransfer {
name: recipient_name.into(),
amount,
};
let r = request(Method::POST, session, &url, Some(user), Some(&body)).await?;
if let Ok(v) = r.convert_message::<u32>() {
Ok(v)
} else {
Err(r.into())
}
}
pub async fn add_user(
session: &CCashSession,
user: &CCashUser,
) -> Result<bool, CCashError> {
let url = format!("{}/user/register", &session.session_url);
let r = request(Method::POST, session, &url, None, Some(user)).await?;
match r {
CCashResponse::Success { .. } => Ok(true),
#[cfg(feature = "interpret_endpoint_errors_as_false")]
CCashResponse::Error { .. } => Ok(false),
#[cfg(not(feature = "interpret_endpoint_errors_as_false"))]
CCashResponse::Error { code: 409, .. } => Ok(false),
#[cfg(not(feature = "interpret_endpoint_errors_as_false"))]
CCashResponse::Error { .. } => Err(r.into()),
}
}
pub async fn delete_user(
session: &CCashSession,
user: &CCashUser,
) -> Result<(), CCashError> {
let url = format!("{}/user/delete", &session.session_url);
let r = request::<()>(Method::DELETE, session, &url, Some(user), None).await?;
match r {
CCashResponse::Success { .. } => Ok(()),
CCashResponse::Error { .. } => Err(r.into()),
}
}