X-Git-Url: http://these/git/?a=blobdiff_plain;f=crates%2Fapi%2Fsrc%2Fcommunity%2Fban.rs;h=95c2bbc04175a1b043ae12bf34e7e10cd351e479;hb=3471f3533cb724b2cf6953d563aadfcc9f66c1d2;hp=fb5e7fcfefce7c5c54bccb78875ddfc6edec316d;hpb=c6c52ab9ccde330b5012f8d0ce4fc8f26628d5cc;p=lemmy.git diff --git a/crates/api/src/community/ban.rs b/crates/api/src/community/ban.rs index fb5e7fcf..95c2bbc0 100644 --- a/crates/api/src/community/ban.rs +++ b/crates/api/src/community/ban.rs @@ -3,8 +3,12 @@ use actix_web::web::Data; use lemmy_api_common::{ community::{BanFromCommunity, BanFromCommunityResponse}, context::LemmyContext, - utils::{get_local_user_view_from_jwt, is_mod_or_admin, remove_user_data_in_community}, - websocket::{messages::SendCommunityRoomMessage, UserOperation}, + utils::{ + is_mod_or_admin, + local_user_view_from_jwt, + remove_user_data_in_community, + sanitize_html_opt, + }, }; use lemmy_db_schema::{ source::{ @@ -18,22 +22,23 @@ use lemmy_db_schema::{ }, traits::{Bannable, Crud, Followable}, }; -use lemmy_db_views_actor::structs::PersonViewSafe; -use lemmy_utils::{error::LemmyError, utils::naive_from_unix, ConnectionId}; +use lemmy_db_views_actor::structs::PersonView; +use lemmy_utils::{ + error::{LemmyError, LemmyErrorExt, LemmyErrorType}, + utils::{time::naive_from_unix, validation::is_valid_body_field}, +}; #[async_trait::async_trait(?Send)] impl Perform for BanFromCommunity { type Response = BanFromCommunityResponse; - #[tracing::instrument(skip(context, websocket_id))] + #[tracing::instrument(skip(context))] async fn perform( &self, context: &Data, - websocket_id: Option, ) -> Result { let data: &BanFromCommunity = self; - let local_user_view = - get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?; + let local_user_view = local_user_view_from_jwt(&data.auth, context).await?; let community_id = data.community_id; let banned_person_id = data.person_id; @@ -41,7 +46,8 @@ impl Perform for BanFromCommunity { let expires = data.expires.map(naive_from_unix); // Verify that only mods or admins can ban - is_mod_or_admin(context.pool(), local_user_view.person.id, community_id).await?; + is_mod_or_admin(&mut context.pool(), local_user_view.person.id, community_id).await?; + is_valid_body_field(&data.reason, false)?; let community_user_ban_form = CommunityPersonBanForm { community_id: data.community_id, @@ -50,9 +56,9 @@ impl Perform for BanFromCommunity { }; if data.ban { - CommunityPersonBan::ban(context.pool(), &community_user_ban_form) + CommunityPersonBan::ban(&mut context.pool(), &community_user_ban_form) .await - .map_err(|e| LemmyError::from_error_message(e, "community_user_already_banned"))?; + .with_lemmy_type(LemmyErrorType::CommunityUserAlreadyBanned)?; // Also unsubscribe them from the community, if they are subscribed let community_follower_form = CommunityFollowerForm { @@ -61,18 +67,18 @@ impl Perform for BanFromCommunity { pending: false, }; - CommunityFollower::unfollow(context.pool(), &community_follower_form) + CommunityFollower::unfollow(&mut context.pool(), &community_follower_form) .await .ok(); } else { - CommunityPersonBan::unban(context.pool(), &community_user_ban_form) + CommunityPersonBan::unban(&mut context.pool(), &community_user_ban_form) .await - .map_err(|e| LemmyError::from_error_message(e, "community_user_already_banned"))?; + .with_lemmy_type(LemmyErrorType::CommunityUserAlreadyBanned)?; } // Remove/Restore their data if that's desired if remove_data { - remove_user_data_in_community(community_id, banned_person_id, context.pool()).await?; + remove_user_data_in_community(community_id, banned_person_id, &mut context.pool()).await?; } // Mod tables @@ -80,28 +86,19 @@ impl Perform for BanFromCommunity { mod_person_id: local_user_view.person.id, other_person_id: data.person_id, community_id: data.community_id, - reason: data.reason.clone(), + reason: sanitize_html_opt(&data.reason), banned: Some(data.ban), expires, }; - ModBanFromCommunity::create(context.pool(), &form).await?; + ModBanFromCommunity::create(&mut context.pool(), &form).await?; let person_id = data.person_id; - let person_view = PersonViewSafe::read(context.pool(), person_id).await?; + let person_view = PersonView::read(&mut context.pool(), person_id).await?; - let res = BanFromCommunityResponse { + Ok(BanFromCommunityResponse { person_view, banned: data.ban, - }; - - context.chat_server().do_send(SendCommunityRoomMessage { - op: UserOperation::BanFromCommunity, - response: res.clone(), - community_id, - websocket_id, - }); - - Ok(res) + }) } }