]> Untitled Git - lemmy.git/blob - crates/api/src/community/hide.rs
Rewrite remaining federation actions, get rid of PerformCrud trait (#3794)
[lemmy.git] / crates / api / src / community / hide.rs
1 use activitypub_federation::config::Data;
2 use actix_web::web::Json;
3 use lemmy_api_common::{
4   build_response::build_community_response,
5   community::{CommunityResponse, HideCommunity},
6   context::LemmyContext,
7   send_activity::{ActivityChannel, SendActivityData},
8   utils::{is_admin, local_user_view_from_jwt, sanitize_html_opt},
9 };
10 use lemmy_db_schema::{
11   source::{
12     community::{Community, CommunityUpdateForm},
13     moderator::{ModHideCommunity, ModHideCommunityForm},
14   },
15   traits::Crud,
16 };
17 use lemmy_utils::error::{LemmyError, LemmyErrorExt, LemmyErrorType};
18
19 #[tracing::instrument(skip(context))]
20 pub async fn hide_community(
21   data: Json<HideCommunity>,
22   context: Data<LemmyContext>,
23 ) -> Result<Json<CommunityResponse>, LemmyError> {
24   // Verify its a admin (only admin can hide or unhide it)
25   let local_user_view = local_user_view_from_jwt(&data.auth, &context).await?;
26   is_admin(&local_user_view)?;
27
28   let community_form = CommunityUpdateForm::builder()
29     .hidden(Some(data.hidden))
30     .build();
31
32   let mod_hide_community_form = ModHideCommunityForm {
33     community_id: data.community_id,
34     mod_person_id: local_user_view.person.id,
35     reason: sanitize_html_opt(&data.reason),
36     hidden: Some(data.hidden),
37   };
38
39   let community_id = data.community_id;
40   let community = Community::update(&mut context.pool(), community_id, &community_form)
41     .await
42     .with_lemmy_type(LemmyErrorType::CouldntUpdateCommunityHiddenStatus)?;
43
44   ModHideCommunity::create(&mut context.pool(), &mod_hide_community_form).await?;
45
46   ActivityChannel::submit_activity(
47     SendActivityData::UpdateCommunity(local_user_view.person.clone(), community),
48     &context,
49   )
50   .await?;
51
52   build_community_response(&context, local_user_view, community_id).await
53 }