]> Untitled Git - lemmy.git/blob - crates/api/src/local_user/ban_person.rs
83768bc23d207db86021a76d65b35724a47ff6f4
[lemmy.git] / crates / api / src / local_user / ban_person.rs
1 use crate::Perform;
2 use actix_web::web::Data;
3 use lemmy_api_common::{
4   context::LemmyContext,
5   person::{BanPerson, BanPersonResponse},
6   utils::{is_admin, local_user_view_from_jwt, remove_user_data},
7 };
8 use lemmy_db_schema::{
9   source::{
10     moderator::{ModBan, ModBanForm},
11     person::{Person, PersonUpdateForm},
12   },
13   traits::Crud,
14 };
15 use lemmy_db_views_actor::structs::PersonView;
16 use lemmy_utils::{
17   error::{LemmyError, LemmyErrorExt, LemmyErrorType},
18   utils::{time::naive_from_unix, validation::is_valid_body_field},
19 };
20
21 #[async_trait::async_trait(?Send)]
22 impl Perform for BanPerson {
23   type Response = BanPersonResponse;
24
25   #[tracing::instrument(skip(context))]
26   async fn perform(&self, context: &Data<LemmyContext>) -> Result<BanPersonResponse, LemmyError> {
27     let data: &BanPerson = self;
28     let local_user_view = local_user_view_from_jwt(&data.auth, context).await?;
29
30     // Make sure user is an admin
31     is_admin(&local_user_view)?;
32
33     is_valid_body_field(&data.reason, false)?;
34
35     let ban = data.ban;
36     let banned_person_id = data.person_id;
37     let expires = data.expires.map(naive_from_unix);
38
39     let person = Person::update(
40       &mut context.pool(),
41       banned_person_id,
42       &PersonUpdateForm::builder()
43         .banned(Some(ban))
44         .ban_expires(Some(expires))
45         .build(),
46     )
47     .await
48     .with_lemmy_type(LemmyErrorType::CouldntUpdateUser)?;
49
50     // Remove their data if that's desired
51     let remove_data = data.remove_data.unwrap_or(false);
52     if remove_data {
53       remove_user_data(
54         person.id,
55         &mut context.pool(),
56         context.settings(),
57         context.client(),
58       )
59       .await?;
60     }
61
62     // Mod tables
63     let form = ModBanForm {
64       mod_person_id: local_user_view.person.id,
65       other_person_id: data.person_id,
66       reason: data.reason.clone(),
67       banned: Some(data.ban),
68       expires,
69     };
70
71     ModBan::create(&mut context.pool(), &form).await?;
72
73     let person_id = data.person_id;
74     let person_view = PersonView::read(&mut context.pool(), person_id).await?;
75
76     Ok(BanPersonResponse {
77       person_view,
78       banned: data.ban,
79     })
80   }
81 }