]> Untitled Git - lemmy.git/blob - crates/api/src/site/registration_applications/approve.rs
Add diesel_async, get rid of blocking function (#2510)
[lemmy.git] / crates / api / src / site / registration_applications / approve.rs
1 use crate::Perform;
2 use actix_web::web::Data;
3 use lemmy_api_common::{
4   site::{ApproveRegistrationApplication, RegistrationApplicationResponse},
5   utils::{get_local_user_view_from_jwt, is_admin, send_application_approved_email},
6 };
7 use lemmy_db_schema::{
8   source::{
9     local_user::{LocalUser, LocalUserUpdateForm},
10     registration_application::{RegistrationApplication, RegistrationApplicationUpdateForm},
11   },
12   traits::Crud,
13   utils::diesel_option_overwrite,
14 };
15 use lemmy_db_views::structs::{LocalUserView, RegistrationApplicationView};
16 use lemmy_utils::{error::LemmyError, ConnectionId};
17 use lemmy_websocket::LemmyContext;
18
19 #[async_trait::async_trait(?Send)]
20 impl Perform for ApproveRegistrationApplication {
21   type Response = RegistrationApplicationResponse;
22
23   async fn perform(
24     &self,
25     context: &Data<LemmyContext>,
26     _websocket_id: Option<ConnectionId>,
27   ) -> Result<Self::Response, LemmyError> {
28     let data = self;
29     let local_user_view =
30       get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?;
31
32     let app_id = data.id;
33
34     // Only let admins do this
35     is_admin(&local_user_view)?;
36
37     // Update the registration with reason, admin_id
38     let deny_reason = diesel_option_overwrite(&data.deny_reason);
39     let app_form = RegistrationApplicationUpdateForm {
40       admin_id: Some(Some(local_user_view.person.id)),
41       deny_reason,
42     };
43
44     let registration_application =
45       RegistrationApplication::update(context.pool(), app_id, &app_form).await?;
46
47     // Update the local_user row
48     let local_user_form = LocalUserUpdateForm::builder()
49       .accepted_application(Some(data.approve))
50       .build();
51
52     let approved_user_id = registration_application.local_user_id;
53     LocalUser::update(context.pool(), approved_user_id, &local_user_form).await?;
54
55     if data.approve {
56       let approved_local_user_view = LocalUserView::read(context.pool(), approved_user_id).await?;
57
58       if approved_local_user_view.local_user.email.is_some() {
59         send_application_approved_email(&approved_local_user_view, context.settings())?;
60       }
61     }
62
63     // Read the view
64     let registration_application =
65       RegistrationApplicationView::read(context.pool(), app_id).await?;
66
67     Ok(Self::Response {
68       registration_application,
69     })
70   }
71 }