1use std::collections::HashMap;
2use std::str::FromStr;
3
4use common::model::status_message::StatusMessage;
5use common::remote::services::USER_API;
6use common::security::captcha::CaptchaResponse;
7use common::store::build_exp_link;
8use common::store::{delete, get, post, put};
9use uuid::Uuid;
10
11use crate::dto::address_request::AddressRequest;
12use crate::dto::auth_request::AuthRequest;
13use crate::dto::change_pass_request::ChangePasswordRequest;
14use crate::dto::file_request::FileRequest;
15use crate::dto::get_token_response::GetTokenResponse;
16use crate::dto::recovered_password_request::RecoveredPasswordRequest;
17use crate::dto::recovery_response::RecoveryResponse;
18use crate::dto::update_user_request::UpdateUserRequest;
19use crate::dto::user_request::UserRequest;
20use crate::dto::user_role_qr_card_response::UserRoleQrCardResponse;
21use crate::dto::user_role_response::UserRoleResponse;
22use crate::dto::user_with_roles_response::UserWithRolesResponse;
23use crate::dto::verification_role_org_request::VerificationRoleOrgRequest;
24
25pub struct UserStore {}
26
27impl UserStore {
28 pub async fn create(new_user: UserRequest) -> Result<UserWithRolesResponse, String> {
29 post::<_, UserWithRolesResponse>(build_exp_link(USER_API, format!("/user")), new_user).await
30 }
31
32 pub async fn get(user_id: Uuid) -> Result<UserWithRolesResponse, String> {
33 get::<UserWithRolesResponse>(build_exp_link(USER_API, format!("/user/{}", user_id))).await
34 }
35
36 pub async fn update(updated_user: UpdateUserRequest) -> Result<UserWithRolesResponse, String> {
37 put::<_, UserWithRolesResponse>(build_exp_link(USER_API, format!("/user")), updated_user)
38 .await
39 }
40
41 pub async fn delete(user_id: Uuid) -> Result<usize, String> {
42 delete::<usize>(build_exp_link(USER_API, format!("/user/{}", user_id))).await
44 }
45
46 pub async fn get_users_without_roles() -> Result<UserWithRolesResponse, String> {
47 get::<UserWithRolesResponse>(build_exp_link(
48 USER_API,
49 format!("/user/getUsersWithoutRoles"),
50 ))
51 .await
52 }
53
54 pub async fn save_student_data_from_csv(
55 file_request: FileRequest,
56 ) -> Result<UserWithRolesResponse, String> {
57 post::<_, UserWithRolesResponse>(
58 build_exp_link(USER_API, format!("/user/saveStudentDataFromCSV")),
59 file_request,
60 )
61 .await
62 }
63
64 pub async fn get_token(auth_request: AuthRequest) -> Result<GetTokenResponse, String> {
65 post::<_, GetTokenResponse>(
66 build_exp_link(USER_API, format!("/user/getToken")),
67 auth_request,
68 )
69 .await
70 }
71
72 pub async fn get_token_for_user(user_id: Uuid) -> Result<GetTokenResponse, String> {
73 get::<GetTokenResponse>(build_exp_link(
74 USER_API,
75 format!("/user/getToken/{}", user_id),
76 ))
77 .await
78 }
79
80 pub async fn get_qr_cards(user_id_lists: Vec<Uuid>) -> Result<UserRoleQrCardResponse, String> {
81 post::<_, UserRoleQrCardResponse>(
82 build_exp_link(USER_API, format!("/user/getQrCards")),
83 user_id_lists,
84 )
85 .await
86 }
87
88 pub async fn change_pass(
89 user_id: Uuid,
90 change_password_request: ChangePasswordRequest,
91 ) -> Result<UserWithRolesResponse, String> {
92 post::<_, UserWithRolesResponse>(
93 build_exp_link(USER_API, format!("/user/changePass/{}", user_id)),
94 change_password_request,
95 )
96 .await
97 }
98
99 pub async fn change_online_status(status: String) -> Result<UserWithRolesResponse, String> {
100 put::<_, UserWithRolesResponse>(
101 build_exp_link(USER_API, format!("/user/changeOnlineStatus/{}", status)),
102 serde_json::Value::from_str("{}").unwrap(), )
104 .await
105 }
106
107 pub async fn find_users_for_org() -> Result<UserRoleQrCardResponse, String> {
108 get::<UserRoleQrCardResponse>(build_exp_link(USER_API, format!("/user/findForOrg"))).await
109 }
110
111 pub async fn enable_two_step_auth(user_id: Uuid) -> Result<String, String> {
112 get::<String>(build_exp_link(
114 USER_API,
115 format!("/user/enableTwoStepAuth/{}", user_id),
116 ))
117 .await
118 }
119
120 pub async fn disable_two_step_auth(user_id: Uuid) -> Result<String, String> {
121 get::<String>(build_exp_link(
123 USER_API,
124 format!("/user/disableTwoStepAuth/{}", user_id),
125 ))
126 .await
127 }
128
129 pub async fn get_users_by_list_ids(
130 id_list: Vec<Uuid>,
131 ) -> Result<UserWithRolesResponse, String> {
132 post::<_, UserWithRolesResponse>(
134 build_exp_link(USER_API, format!("/user/getUsersByListIds")),
135 id_list,
136 )
137 .await
138 }
139
140 pub async fn get_users_by_org_id(id: Uuid) -> Result<UserWithRolesResponse, String> {
141 get::<UserWithRolesResponse>(build_exp_link(USER_API, format!("/user/findByOrgId/{id}")))
142 .await
143 }
144
145 pub async fn get_users_by_org_ids(id_list: Vec<Uuid>) -> Result<UserWithRolesResponse, String> {
146 post::<_, UserWithRolesResponse>(
147 build_exp_link(USER_API, format!("/user/findByOrgIds")),
148 id_list,
149 )
150 .await
151 }
152
153 pub async fn find_by_email(email: String) -> Result<String, String> {
154 get::<String>(build_exp_link(
155 USER_API,
156 format!("/user/findByEmail/{}", email),
157 ))
158 .await
159 }
160
161 pub async fn edit_user_admin(user: UpdateUserRequest) -> Result<UserWithRolesResponse, String> {
162 put::<_, UserWithRolesResponse>(
163 build_exp_link(USER_API, format!("/user/editUserAdmin")),
164 user,
165 )
166 .await
167 }
168
169 pub async fn send_invitation(
170 verification_request: VerificationRoleOrgRequest,
171 ) -> Result<String, String> {
172 post::<_, String>(
174 build_exp_link(USER_API, format!("/user/sendInvitation")),
175 verification_request,
176 )
177 .await
178 }
179
180 pub async fn find_ids_for_school_invitation() -> Result<Vec<Uuid>, String> {
181 get::<Vec<Uuid>>(build_exp_link(
182 USER_API,
183 format!("/user/getIdsForSchoolInvitation"),
184 ))
185 .await
186 }
187
188 pub async fn send_school_invitations_by_ids_list(id_list: Vec<Uuid>) -> Result<String, String> {
189 post::<_, String>(
190 build_exp_link(USER_API, format!("/user/sendSchoolInvitationsByIdsList")),
191 id_list,
192 )
193 .await
194 }
195
196 pub async fn send_school_invitations(id_list: Vec<Uuid>) -> Result<String, String> {
197 post::<_, String>(
198 build_exp_link(USER_API, format!("/user/sendSchoolInvitations")),
199 id_list,
200 )
201 .await
202 }
203
204 pub async fn send_invitation_from_org(
205 org_id: Uuid,
206 vitrification_request: VerificationRoleOrgRequest,
207 ) -> Result<String, String> {
208 post::<_, String>(
209 build_exp_link(USER_API, format!("/user/sendInvitation/{org_id}")),
210 vitrification_request,
211 )
212 .await
213 }
214
215 pub async fn recover_password_with_captcha(
216 auth_request: AuthRequest,
217 ) -> Result<String, String> {
218 post::<_, String>(
219 build_exp_link(USER_API, format!("/user/recover")),
220 auth_request,
221 )
222 .await
223 }
224
225 pub async fn recover_password(auth_request: AuthRequest) -> Result<StatusMessage, String> {
226 post::<_, StatusMessage>(
227 build_exp_link(USER_API, format!("/user/recoverGuest")),
228 auth_request,
229 )
230 .await
231 }
232
233 pub async fn recovered_password(
234 recovery_request: RecoveredPasswordRequest,
235 ) -> Result<usize, String> {
236 put::<_, usize>(
237 build_exp_link(USER_API, format!("/user/recoveredPassword")),
238 recovery_request,
239 )
240 .await
241 }
242
243 pub async fn login_by_token(token: String) -> Result<Vec<UserRoleResponse>, String> {
244 get::<Vec<UserRoleResponse>>(build_exp_link(
245 USER_API,
246 format!("/user/loginByToken/{token}"),
247 ))
248 .await
249 }
250
251 pub async fn approve_role(role_id: Uuid, domain: String) -> Result<UserRoleResponse, String> {
252 get::<UserRoleResponse>(build_exp_link(
253 USER_API,
254 format!("/user/approveRole/{role_id}/{domain}"),
255 ))
256 .await
257 }
258
259 pub async fn delete_user_from_class(
260 user_id: Uuid,
261 class_id: Uuid,
262 ) -> Result<Vec<UserRoleResponse>, String> {
263 get::<Vec<UserRoleResponse>>(build_exp_link(
264 USER_API,
265 format!("/user/deleteFromClass/{user_id}/{class_id}"),
266 ))
267 .await
268 }
269
270 pub async fn decline_role(role_id: Uuid) -> Result<UserRoleResponse, String> {
271 get::<UserRoleResponse>(build_exp_link(
272 USER_API,
273 format!("/user/declineRole/{role_id}"),
274 ))
275 .await
276 }
277
278 pub async fn block_role(role_id: Uuid) -> Result<UserRoleResponse, String> {
279 get::<UserRoleResponse>(build_exp_link(
280 USER_API,
281 format!("/user/blockRole/{role_id}"),
282 ))
283 .await
284 }
285
286 pub async fn set_avatar(path: String) -> Result<UserWithRolesResponse, String> {
287 put::<_, UserWithRolesResponse>(build_exp_link(USER_API, format!("/user/setAvatar")), path)
288 .await
289 }
290
291 pub async fn set_avatar_by_id(
292 user_id: Uuid,
293 path: String,
294 ) -> Result<UserWithRolesResponse, String> {
295 put::<_, UserWithRolesResponse>(
296 build_exp_link(USER_API, format!("/user/setAvatar/{user_id}")),
297 path,
298 )
299 .await
300 }
301
302 pub async fn approve_email_from_token() -> Result<UserRoleResponse, String> {
303 get::<UserRoleResponse>(build_exp_link(
304 USER_API,
305 format!("/user/approveEmailFromToken"),
306 ))
307 .await
308 }
309
310 pub async fn approve_email(user_id: Uuid) -> Result<UserRoleResponse, String> {
311 get::<UserRoleResponse>(build_exp_link(
312 USER_API,
313 format!("/user/approveEmail/{user_id}"),
314 ))
315 .await
316 }
317
318 pub async fn block_user(user_id: Uuid) -> Result<UserWithRolesResponse, String> {
319 put::<_, UserWithRolesResponse>(
320 build_exp_link(USER_API, format!("/user/blockUser/{user_id}")),
321 serde_json::Value::from_str("{}").unwrap(),
322 )
323 .await
324 }
325
326 pub async fn register(user: UpdateUserRequest) -> Result<UserWithRolesResponse, String> {
327 post::<_, UserWithRolesResponse>(build_exp_link(USER_API, format!("/user/register")), user)
328 .await
329 }
330
331 pub async fn get_recovery_response(token: String) -> Result<RecoveryResponse, String> {
332 get::<RecoveryResponse>(build_exp_link(
333 USER_API,
334 format!("/user/getRecovResponse/{token}"),
335 ))
336 .await
337 }
338
339 pub async fn save_teacher_data_from_csv(
340 file: FileRequest,
341 ) -> Result<UserWithRolesResponse, String> {
342 post::<_, UserWithRolesResponse>(
343 build_exp_link(USER_API, format!("/user/saveTeacherDataFromCSV")),
344 file,
345 )
346 .await
347 }
348
349 pub async fn get_users_by_string_data_for_curr_org(
350 data: Vec<String>,
351 ) -> Result<UserWithRolesResponse, String> {
352 post::<_, UserWithRolesResponse>(
353 build_exp_link(USER_API, format!("/user/getUsersByStringDataForCurrOrg")),
354 data,
355 )
356 .await
357 }
358
359 pub async fn get_users_by_string_data_for_all_orgs_except_current(
360 data: Vec<String>,
361 ) -> Result<UserWithRolesResponse, String> {
362 post::<_, UserWithRolesResponse>(
363 build_exp_link(
364 USER_API,
365 format!("/user/getUsersByStringDataForAllOrgsExceptCurrent"),
366 ),
367 data,
368 )
369 .await
370 }
371
372 pub async fn find_for_class(class_id: Uuid) -> Result<Vec<UserWithRolesResponse>, String> {
373 get::<Vec<UserWithRolesResponse>>(build_exp_link(
374 USER_API,
375 format!("/user/findForClass/{class_id}"),
376 ))
377 .await
378 }
379
380 pub async fn find_by_ids(
381 ids: Vec<Uuid>,
382 ) -> Result<HashMap<Uuid, UserWithRolesResponse>, String> {
383 post::<_, HashMap<Uuid, UserWithRolesResponse>>(
384 build_exp_link(USER_API, format!("/user/findByIds")),
385 ids,
386 )
387 .await
388 }
389
390 pub async fn find_my_addresses() -> Result<Vec<AddressRequest>, String> {
391 get::<Vec<AddressRequest>>(build_exp_link(USER_API, format!("/user/addresses"))).await
393 }
394
395 pub async fn find_addresses_for_user(user_id: Uuid) -> Result<Vec<AddressRequest>, String> {
396 get::<Vec<AddressRequest>>(build_exp_link(
398 USER_API,
399 format!("/user/addressesForUser/{user_id}"),
400 ))
401 .await
402 }
403
404 pub async fn get_roboteacher() -> Result<UserWithRolesResponse, String> {
405 get::<UserWithRolesResponse>(build_exp_link(USER_API, format!("/user/getRoboTeacher")))
406 .await
407 }
408 pub async fn generate_captcha() -> Result<CaptchaResponse, String> {
409 get::<CaptchaResponse>(build_exp_link(USER_API, format!("/user/captcha"))).await
410 }
411}