]> Untitled Git - lemmy.git/blob - crates/api/src/site/registration_applications/approve.rs
Dont return error in case optional auth is invalid (#2879)
[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   context::LemmyContext,
5   site::{ApproveRegistrationApplication, RegistrationApplicationResponse},
6   utils::{is_admin, local_user_view_from_jwt, send_application_approved_email},
7 };
8 use lemmy_db_schema::{
9   source::{
10     local_user::{LocalUser, LocalUserUpdateForm},
11     registration_application::{RegistrationApplication, RegistrationApplicationUpdateForm},
12   },
13   traits::Crud,
14   utils::diesel_option_overwrite,
15 };
16 use lemmy_db_views::structs::{LocalUserView, RegistrationApplicationView};
17 use lemmy_utils::{error::LemmyError, ConnectionId};
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 = local_user_view_from_jwt(&data.auth, context).await?;
30
31     let app_id = data.id;
32
33     // Only let admins do this
34     is_admin(&local_user_view)?;
35
36     // Update the registration with reason, admin_id
37     let deny_reason = diesel_option_overwrite(&data.deny_reason);
38     let app_form = RegistrationApplicationUpdateForm {
39       admin_id: Some(Some(local_user_view.person.id)),
40       deny_reason,
41     };
42
43     let registration_application =
44       RegistrationApplication::update(context.pool(), app_id, &app_form).await?;
45
46     // Update the local_user row
47     let local_user_form = LocalUserUpdateForm::builder()
48       .accepted_application(Some(data.approve))
49       .build();
50
51     let approved_user_id = registration_application.local_user_id;
52     LocalUser::update(context.pool(), approved_user_id, &local_user_form).await?;
53
54     if data.approve {
55       let approved_local_user_view = LocalUserView::read(context.pool(), approved_user_id).await?;
56
57       if approved_local_user_view.local_user.email.is_some() {
58         send_application_approved_email(&approved_local_user_view, context.settings())?;
59       }
60     }
61
62     // Read the view
63     let registration_application =
64       RegistrationApplicationView::read(context.pool(), app_id).await?;
65
66     Ok(Self::Response {
67       registration_application,
68     })
69   }
70 }