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