]> Untitled Git - lemmy.git/blob - crates/api/src/site/registration_applications/approve.rs
Split apart api files (#2216)
[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   blocking,
5   get_local_user_view_from_jwt,
6   is_admin,
7   send_application_approved_email,
8   site::*,
9 };
10 use lemmy_db_schema::{
11   diesel_option_overwrite,
12   source::{
13     local_user::{LocalUser, LocalUserForm},
14     registration_application::{RegistrationApplication, RegistrationApplicationForm},
15   },
16   traits::Crud,
17 };
18 use lemmy_db_views::{
19   local_user_view::LocalUserView,
20   registration_application_view::RegistrationApplicationView,
21 };
22 use lemmy_utils::{ConnectionId, LemmyError};
23 use lemmy_websocket::LemmyContext;
24
25 #[async_trait::async_trait(?Send)]
26 impl Perform for ApproveRegistrationApplication {
27   type Response = RegistrationApplicationResponse;
28
29   async fn perform(
30     &self,
31     context: &Data<LemmyContext>,
32     _websocket_id: Option<ConnectionId>,
33   ) -> Result<Self::Response, LemmyError> {
34     let data = self;
35     let local_user_view =
36       get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?;
37
38     let app_id = data.id;
39
40     // Only let admins do this
41     is_admin(&local_user_view)?;
42
43     // Update the registration with reason, admin_id
44     let deny_reason = diesel_option_overwrite(&data.deny_reason);
45     let app_form = RegistrationApplicationForm {
46       admin_id: Some(local_user_view.person.id),
47       deny_reason,
48       ..RegistrationApplicationForm::default()
49     };
50
51     let registration_application = blocking(context.pool(), move |conn| {
52       RegistrationApplication::update(conn, app_id, &app_form)
53     })
54     .await??;
55
56     // Update the local_user row
57     let local_user_form = LocalUserForm {
58       accepted_application: Some(data.approve),
59       ..LocalUserForm::default()
60     };
61
62     let approved_user_id = registration_application.local_user_id;
63     blocking(context.pool(), move |conn| {
64       LocalUser::update(conn, approved_user_id, &local_user_form)
65     })
66     .await??;
67
68     if data.approve {
69       let approved_local_user_view = blocking(context.pool(), move |conn| {
70         LocalUserView::read(conn, approved_user_id)
71       })
72       .await??;
73
74       if approved_local_user_view.local_user.email.is_some() {
75         send_application_approved_email(&approved_local_user_view, &context.settings())?;
76       }
77     }
78
79     // Read the view
80     let registration_application = blocking(context.pool(), move |conn| {
81       RegistrationApplicationView::read(conn, app_id)
82     })
83     .await??;
84
85     Ok(Self::Response {
86       registration_application,
87     })
88   }
89 }