1pub mod admin;
6
7use crate::{
8 request::request, CCashError, CCashResponse, CCashSession, CCashUser, TransactionLog,
9};
10use reqwest::Method;
11use velcro::hash_map;
12
13pub async fn get_balance(
20 session: &CCashSession,
21 user: &CCashUser,
22) -> Result<u32, CCashError> {
23 let url = format!(
24 "{}/user/balance?name={}",
25 &session.session_url, &user.username
26 );
27
28 let r = request::<()>(Method::GET, session, &url, Some(user), None).await?;
29 if let Ok(v) = r.convert_message::<u32>() {
30 Ok(v)
31 } else {
32 Err(r.into())
33 }
34}
35
36pub async fn get_logs(
44 session: &CCashSession,
45 user: &CCashUser,
46) -> Result<Vec<TransactionLog>, CCashError> {
47 let url = format!("{}/user/log", &session.session_url);
48
49 let r = request::<()>(Method::GET, session, &url, Some(user), None).await?;
50 if let Ok(v) = r.convert_message::<Vec<TransactionLog>>() {
51 Ok(v)
52 } else {
53 Err(r.into())
54 }
55}
56
57pub async fn contains_user(
66 session: &CCashSession,
67 user: &CCashUser,
68) -> Result<bool, CCashError> {
69 let url = format!(
70 "{}/user/exists?name={}",
71 &session.session_url, &user.username
72 );
73
74 let r = request::<()>(Method::GET, session, &url, Some(user), None).await?;
75 match r {
76 CCashResponse::Success { .. } => Ok(true),
77 #[cfg(feature = "interpret_endpoint_errors_as_false")]
78 CCashResponse::Error { .. } => Ok(false),
79 #[cfg(not(feature = "interpret_endpoint_errors_as_false"))]
80 CCashResponse::Error { code: 401, .. } => Ok(false),
81 #[cfg(not(feature = "interpret_endpoint_errors_as_false"))]
82 CCashResponse::Error { .. } => Err(r.into()),
83 }
84}
85
86pub async fn verify_password(
95 session: &CCashSession,
96 user: &CCashUser,
97) -> Result<bool, CCashError> {
98 let url = format!("{}/user/verify_password", &session.session_url);
99
100 let r = request::<()>(Method::POST, session, &url, Some(user), None).await?;
101 match r {
102 CCashResponse::Success { .. } => Ok(true),
103 #[cfg(feature = "interpret_endpoint_errors_as_false")]
104 CCashResponse::Error { .. } => Ok(false),
105 #[cfg(not(feature = "interpret_endpoint_errors_as_false"))]
106 CCashResponse::Error { code: 401, .. } => Ok(false),
107 #[cfg(not(feature = "interpret_endpoint_errors_as_false"))]
108 CCashResponse::Error { .. } => Err(r.into()),
109 }
110}
111
112pub async fn change_password(
123 session: &CCashSession,
124 user: &mut CCashUser,
125 new_password: &str,
126) -> Result<bool, CCashError> {
127 let url = format!("{}/user/change_password", &session.session_url);
128 let body = hash_map! { "pass": new_password };
129
130 let r = request(Method::PATCH, session, &url, Some(user), Some(&body)).await?;
131 match r {
132 CCashResponse::Success { .. } => {
133 user.update_password(new_password);
134 Ok(true)
135 },
136 #[cfg(feature = "interpret_endpoint_errors_as_false")]
137 CCashResponse::Error { .. } => Ok(false),
138 #[cfg(not(feature = "interpret_endpoint_errors_as_false"))]
139 CCashResponse::Error { .. } => Err(r.into()),
140 }
141}
142
143pub async fn send_funds(
152 session: &CCashSession,
153 user: &CCashUser,
154 recipient_name: &str,
155 amount: u32,
156) -> Result<u32, CCashError> {
157 #[derive(serde::Serialize)]
158 struct FundsTransfer {
159 name: String,
160 amount: u32,
161 }
162
163 let url = format!("{}/user/transfer", &session.session_url);
164 let body = FundsTransfer {
165 name: recipient_name.into(),
166 amount,
167 };
168
169 let r = request(Method::POST, session, &url, Some(user), Some(&body)).await?;
170
171 if let Ok(v) = r.convert_message::<u32>() {
172 Ok(v)
173 } else {
174 Err(r.into())
175 }
176}
177
178pub async fn add_user(
192 session: &CCashSession,
193 user: &CCashUser,
194) -> Result<bool, CCashError> {
195 let url = format!("{}/user/register", &session.session_url);
196
197 let r = request(Method::POST, session, &url, None, Some(user)).await?;
198 match r {
199 CCashResponse::Success { .. } => Ok(true),
200 #[cfg(feature = "interpret_endpoint_errors_as_false")]
201 CCashResponse::Error { .. } => Ok(false),
202 #[cfg(not(feature = "interpret_endpoint_errors_as_false"))]
203 CCashResponse::Error { code: 409, .. } => Ok(false),
204 #[cfg(not(feature = "interpret_endpoint_errors_as_false"))]
205 CCashResponse::Error { .. } => Err(r.into()),
206 }
207}
208
209pub async fn delete_user(
217 session: &CCashSession,
218 user: &CCashUser,
219) -> Result<(), CCashError> {
220 let url = format!("{}/user/delete", &session.session_url);
221
222 let r = request::<()>(Method::DELETE, session, &url, Some(user), None).await?;
223 match r {
224 CCashResponse::Success { .. } => Ok(()),
225 CCashResponse::Error { .. } => Err(r.into()),
226 }
227}