3 community::send_activity_in_community,
7 verify_person_in_community,
9 activity_lists::AnnouncableActivities,
10 objects::{community::ApubCommunity, person::ApubPerson},
11 protocol::{activities::community::update::UpdateCommunity, InCommunity},
15 use activitypub_federation::{
16 core::object_id::ObjectId,
18 traits::{ActivityHandler, ApubObject},
20 use activitystreams_kinds::{activity::UpdateType, public};
21 use lemmy_api_common::{
22 community::{CommunityResponse, EditCommunity, HideCommunity},
23 context::LemmyContext,
24 utils::get_local_user_view_from_jwt,
25 websocket::{send::send_community_ws_message, UserOperationCrud},
27 use lemmy_db_schema::{source::community::Community, traits::Crud};
28 use lemmy_utils::error::LemmyError;
31 #[async_trait::async_trait(?Send)]
32 impl SendActivity for EditCommunity {
33 type Response = CommunityResponse;
35 async fn send_activity(
37 _response: &Self::Response,
38 context: &LemmyContext,
39 ) -> Result<(), LemmyError> {
41 get_local_user_view_from_jwt(&request.auth, context.pool(), context.secret()).await?;
42 let community = Community::read(context.pool(), request.community_id).await?;
43 UpdateCommunity::send(community.into(), &local_user_view.person.into(), context).await
47 impl UpdateCommunity {
48 #[tracing::instrument(skip_all)]
50 community: ApubCommunity,
52 context: &LemmyContext,
53 ) -> Result<(), LemmyError> {
54 let id = generate_activity_id(
56 &context.settings().get_protocol_and_hostname(),
58 let update = UpdateCommunity {
59 actor: ObjectId::new(actor.actor_id()),
61 object: Box::new(community.clone().into_apub(context).await?),
62 cc: vec![community.actor_id()],
63 kind: UpdateType::Update,
65 audience: Some(ObjectId::new(community.actor_id())),
68 let activity = AnnouncableActivities::UpdateCommunity(update);
69 send_activity_in_community(activity, actor, &community, vec![], true, context).await
73 #[async_trait::async_trait(?Send)]
74 impl ActivityHandler for UpdateCommunity {
75 type DataType = LemmyContext;
76 type Error = LemmyError;
78 fn id(&self) -> &Url {
82 fn actor(&self) -> &Url {
86 #[tracing::instrument(skip_all)]
89 context: &Data<LemmyContext>,
90 request_counter: &mut i32,
91 ) -> Result<(), LemmyError> {
92 verify_is_public(&self.to, &self.cc)?;
93 let community = self.community(context, request_counter).await?;
94 verify_person_in_community(&self.actor, &community, context, request_counter).await?;
97 self.object.id.inner(),
103 ApubCommunity::verify(
105 &community.actor_id.clone().into(),
113 #[tracing::instrument(skip_all)]
116 context: &Data<LemmyContext>,
117 request_counter: &mut i32,
118 ) -> Result<(), LemmyError> {
119 let community = self.community(context, request_counter).await?;
121 let community_update_form = self.object.into_update_form();
123 let updated_community =
124 Community::update(context.pool(), community.id, &community_update_form).await?;
126 send_community_ws_message(
127 updated_community.id,
128 UserOperationCrud::EditCommunity,
138 #[async_trait::async_trait(?Send)]
139 impl SendActivity for HideCommunity {
140 type Response = CommunityResponse;
142 async fn send_activity(
144 _response: &Self::Response,
145 context: &LemmyContext,
146 ) -> Result<(), LemmyError> {
147 let local_user_view =
148 get_local_user_view_from_jwt(&request.auth, context.pool(), context.secret()).await?;
149 let community = Community::read(context.pool(), request.community_id).await?;
150 UpdateCommunity::send(community.into(), &local_user_view.person.into(), context).await