1use crate::{request::request, CCashError, CCashResponse, CCashSession, CCashUser};
8use reqwest::Method;
9use velcro::hash_map;
10
11pub async fn verify_account(
20 session: &CCashSession,
21 user: &CCashUser,
22) -> Result<bool, CCashError> {
23 let url = format!("{}/admin/verify_account", &session.session_url);
24
25 let r = request::<()>(Method::POST, session, &url, Some(user), None).await?;
26 match r {
27 CCashResponse::Success { .. } => Ok(true),
28 #[cfg(feature = "interpret_endpoint_errors_as_false")]
29 CCashResponse::Error { .. } => Ok(false),
30 #[cfg(not(feature = "interpret_endpoint_errors_as_false"))]
31 CCashResponse::Error { code: 401, .. } => Ok(false),
32 #[cfg(not(feature = "interpret_endpoint_errors_as_false"))]
33 CCashResponse::Error { .. } => Err(r.into()),
34 }
35}
36
37pub async fn change_password(
49 session: &CCashSession,
50 admin_user: &CCashUser,
51 user: &mut CCashUser,
52 new_password: &str,
53) -> Result<bool, CCashError> {
54 let url = format!("{}/admin/user/change_password", &session.session_url);
55
56 let new_user = CCashUser {
57 username: user.username.clone(),
58 password: new_password.into(),
59 };
60
61 let r = request(
62 Method::PATCH,
63 session,
64 &url,
65 Some(admin_user),
66 Some(&new_user),
67 )
68 .await?;
69
70 match r {
71 CCashResponse::Success { .. } => {
72 *user = new_user;
73 Ok(true)
74 },
75 #[cfg(feature = "interpret_endpoint_errors_as_false")]
76 CCashResponse::Error { .. } => Ok(false),
77 #[cfg(not(feature = "interpret_endpoint_errors_as_false"))]
78 CCashResponse::Error { .. } => Err(r.into()),
79 }
80}
81
82pub async fn set_balance(
91 session: &CCashSession,
92 admin_user: &CCashUser,
93 username: &str,
94 new_balance: u32,
95) -> Result<(), CCashError> {
96 #[derive(serde::Serialize)]
97 struct SetBalanceData {
98 name: String,
99 amount: u32,
100 }
101
102 let url = format!("{}/admin/set_balance", &session.session_url);
103
104 let body = SetBalanceData {
105 name: username.into(),
106 amount: new_balance,
107 };
108
109 let r = request(Method::PATCH, session, &url, Some(admin_user), Some(&body)).await?;
110 match r {
111 CCashResponse::Success { .. } => Ok(()),
112 CCashResponse::Error { .. } => Err(r.into()),
113 }
114}
115
116pub async fn impact_balance(
125 session: &CCashSession,
126 admin_user: &CCashUser,
127 username: &str,
128 amount: i64,
129) -> Result<(), CCashError> {
130 #[derive(serde::Serialize)]
131 struct ImpactBalanceData {
132 name: String,
133 amount: i64,
134 }
135
136 let url = format!("{}/admin/impact_balance", &session.session_url);
137
138 let body = ImpactBalanceData {
139 name: username.into(),
140 amount,
141 };
142
143 let r = request(Method::POST, session, &url, Some(admin_user), Some(&body)).await?;
144 match r {
145 CCashResponse::Success { .. } => Ok(()),
146 CCashResponse::Error { .. } => Err(r.into()),
147 }
148}
149
150pub async fn add_user(
160 session: &CCashSession,
161 admin_user: &CCashUser,
162 new_user: &CCashUser,
163 amount: u32,
164) -> Result<bool, CCashError> {
165 #[derive(serde::Serialize)]
166 struct AddUserData {
167 #[serde(flatten)]
168 user: CCashUser,
169 amount: u32,
170 }
171
172 let url = format!("{}/admin/user/register", &session.session_url);
173
174 let body = AddUserData {
175 user: new_user.clone(),
176 amount,
177 };
178
179 let r = request(Method::POST, session, &url, Some(admin_user), Some(&body)).await?;
180 match r {
181 CCashResponse::Success { .. } => Ok(true),
182 #[cfg(feature = "interpret_endpoint_errors_as_false")]
183 CCashResponse::Error { .. } => Ok(false),
184 #[cfg(not(feature = "interpret_endpoint_errors_as_false"))]
185 CCashResponse::Error { code: 409, .. } => Ok(false),
186 #[cfg(not(feature = "interpret_endpoint_errors_as_false"))]
187 CCashResponse::Error { .. } => Err(r.into()),
188 }
189}
190
191pub async fn delete_user(
200 session: &CCashSession,
201 admin_user: &CCashUser,
202 username: &str,
203) -> Result<(), CCashError> {
204 let url = format!("{}/admin/user/delete", &session.session_url);
205 let body = hash_map! { "name": username };
206
207 let r = request(Method::DELETE, session, &url, Some(admin_user), Some(&body)).await?;
208 match r {
209 CCashResponse::Success { .. } => Ok(()),
210 CCashResponse::Error { .. } => Err(r.into()),
211 }
212}
213
214pub async fn prune_users(
224 session: &CCashSession,
225 admin_user: &CCashUser,
226 amount: u32,
227 time: Option<i64>,
228) -> Result<u64, CCashError> {
229 #[derive(serde::Serialize)]
230 struct PruneUsersData {
231 amount: u32,
232 time: Option<i64>,
233 }
234
235 let url = format!("{}/admin/prune_users", &session.session_url);
236
237 let body = PruneUsersData { amount, time };
238
239 let r = request(Method::POST, session, &url, Some(admin_user), Some(&body)).await?;
240 match r {
241 CCashResponse::Success { .. } =>
242 if let Ok(amount) = r.convert_message::<u64>() {
243 Ok(amount)
244 } else {
245 Err(CCashError::Error(
246 "Could not parse amount of users pruned into a valid u64".into(),
247 ))
248 },
249 CCashResponse::Error { .. } => Err(r.into()),
250 }
251}
252
253pub async fn close(
264 session: &mut CCashSession,
265 admin_user: &CCashUser,
266) -> Result<(), CCashError> {
267 let url = format!("{}/admin/shutdown", &session.session_url);
268
269 let r = request::<()>(Method::POST, session, &url, Some(admin_user), None).await?;
270 match r {
271 CCashResponse::Success { .. } => {
272 session.is_connected = false;
273 session.client = None;
274 session.properties = None;
275
276 Ok(())
277 },
278 CCashResponse::Error { .. } => Err(r.into()),
279 }
280}