3 community::send_activity_in_community,
7 verify_person_in_community,
9 activity_lists::AnnouncableActivities,
10 insert_received_activity,
11 objects::{community::ApubCommunity, person::ApubPerson},
12 protocol::{activities::community::update::UpdateCommunity, InCommunity},
14 use activitypub_federation::{
16 kinds::{activity::UpdateType, public},
17 traits::{ActivityHandler, Actor, Object},
19 use lemmy_api_common::context::LemmyContext;
20 use lemmy_db_schema::{
21 source::{community::Community, person::Person},
24 use lemmy_utils::error::LemmyError;
27 pub(crate) async fn send_update_community(
30 context: Data<LemmyContext>,
31 ) -> Result<(), LemmyError> {
32 let community: ApubCommunity = community.into();
33 let actor: ApubPerson = actor.into();
34 let id = generate_activity_id(
36 &context.settings().get_protocol_and_hostname(),
38 let update = UpdateCommunity {
39 actor: actor.id().into(),
41 object: Box::new(community.clone().into_json(&context).await?),
42 cc: vec![community.id()],
43 kind: UpdateType::Update,
45 audience: Some(community.id().into()),
48 let activity = AnnouncableActivities::UpdateCommunity(update);
49 send_activity_in_community(activity, &actor, &community, vec![], true, &context).await
52 #[async_trait::async_trait]
53 impl ActivityHandler for UpdateCommunity {
54 type DataType = LemmyContext;
55 type Error = LemmyError;
57 fn id(&self) -> &Url {
61 fn actor(&self) -> &Url {
65 #[tracing::instrument(skip_all)]
66 async fn verify(&self, context: &Data<Self::DataType>) -> Result<(), LemmyError> {
67 insert_received_activity(&self.id, context).await?;
68 verify_is_public(&self.to, &self.cc)?;
69 let community = self.community(context).await?;
70 verify_person_in_community(&self.actor, &community, context).await?;
71 verify_mod_action(&self.actor, self.object.id.inner(), community.id, context).await?;
72 ApubCommunity::verify(&self.object, &community.actor_id.clone().into(), context).await?;
76 #[tracing::instrument(skip_all)]
77 async fn receive(self, context: &Data<Self::DataType>) -> Result<(), LemmyError> {
78 let community = self.community(context).await?;
80 let community_update_form = self.object.into_update_form();
82 Community::update(&mut context.pool(), community.id, &community_update_form).await?;