userlib/store/
user_store.rs

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        // todo change usize to status message ?
43        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(), // todo option body ?
103        )
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        // todo temp solution
113        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        // todo temp solution
122        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        // todo get???
133        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        // todo response
173        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        // todo response
392        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        // todo response
397        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}