1 use activitypub_federation::config::Data;
2 use actix_web::web::Json;
3 use lemmy_api_common::{
5 person::{BanPerson, BanPersonResponse},
6 send_activity::{ActivityChannel, SendActivityData},
7 utils::{is_admin, local_user_view_from_jwt, remove_user_data, sanitize_html_opt},
11 moderator::{ModBan, ModBanForm},
12 person::{Person, PersonUpdateForm},
16 use lemmy_db_views_actor::structs::PersonView;
18 error::{LemmyError, LemmyErrorExt, LemmyErrorType},
19 utils::{time::naive_from_unix, validation::is_valid_body_field},
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?;
28 // Make sure user is an admin
29 is_admin(&local_user_view)?;
31 is_valid_body_field(&data.reason, false)?;
33 let expires = data.expires.map(naive_from_unix);
35 let person = Person::update(
39 banned: Some(data.ban),
40 ban_expires: Some(expires),
45 .with_lemmy_type(LemmyErrorType::CouldntUpdateUser)?;
47 // Remove their data if that's desired
48 let remove_data = data.remove_data.unwrap_or(false);
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),
68 ModBan::create(&mut context.pool(), &form).await?;
70 let person_view = PersonView::read(&mut context.pool(), data.person_id).await?;
72 ActivityChannel::submit_activity(
73 SendActivityData::BanFromSite(
74 local_user_view.person,
75 person_view.person.clone(),
82 Ok(Json(BanPersonResponse {