]> Untitled Git - lemmy.git/blob - crates/api/src/site/registration_applications/approve.rs
129e92b7e6488ab42b2ba1205e544eb7b8d9d55f
[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::{blocking, 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 = blocking(context.pool(), move |conn| {
45       RegistrationApplication::update(conn, app_id, &app_form)
46     })
47     .await??;
48
49     // Update the local_user row
50     let local_user_form = LocalUserUpdateForm::builder()
51       .accepted_application(Some(data.approve))
52       .build();
53
54     let approved_user_id = registration_application.local_user_id;
55     blocking(context.pool(), move |conn| {
56       LocalUser::update(conn, approved_user_id, &local_user_form)
57     })
58     .await??;
59
60     if data.approve {
61       let approved_local_user_view = blocking(context.pool(), move |conn| {
62         LocalUserView::read(conn, approved_user_id)
63       })
64       .await??;
65
66       if approved_local_user_view.local_user.email.is_some() {
67         send_application_approved_email(&approved_local_user_view, context.settings())?;
68       }
69     }
70
71     // Read the view
72     let registration_application = blocking(context.pool(), move |conn| {
73       RegistrationApplicationView::read(conn, app_id)
74     })
75     .await??;
76
77     Ok(Self::Response {
78       registration_application,
79     })
80   }
81 }