3 check_community_deleted_or_removed,
4 community::send_activity_in_community,
8 verify_person_in_community,
10 activity_lists::AnnouncableActivities,
11 insert_received_activity,
12 objects::community::ApubCommunity,
14 activities::community::lock_page::{LockPage, LockType, UndoLockPage},
18 use activitypub_federation::{
20 fetch::object_id::ObjectId,
21 kinds::{activity::UndoType, public},
22 traits::ActivityHandler,
24 use lemmy_api_common::context::LemmyContext;
25 use lemmy_db_schema::{
29 post::{Post, PostUpdateForm},
33 use lemmy_utils::error::LemmyError;
36 #[async_trait::async_trait]
37 impl ActivityHandler for LockPage {
38 type DataType = LemmyContext;
39 type Error = LemmyError;
41 fn id(&self) -> &Url {
45 fn actor(&self) -> &Url {
49 async fn verify(&self, context: &Data<Self::DataType>) -> Result<(), Self::Error> {
50 verify_is_public(&self.to, &self.cc)?;
51 let community = self.community(context).await?;
52 verify_person_in_community(&self.actor, &community, context).await?;
53 check_community_deleted_or_removed(&community)?;
54 verify_mod_action(&self.actor, self.object.inner(), community.id, context).await?;
58 async fn receive(self, context: &Data<Self::DataType>) -> Result<(), Self::Error> {
59 let form = PostUpdateForm::builder().locked(Some(true)).build();
60 let post = self.object.dereference(context).await?;
61 Post::update(&mut context.pool(), post.id, &form).await?;
66 #[async_trait::async_trait]
67 impl ActivityHandler for UndoLockPage {
68 type DataType = LemmyContext;
69 type Error = LemmyError;
71 fn id(&self) -> &Url {
75 fn actor(&self) -> &Url {
79 async fn verify(&self, context: &Data<Self::DataType>) -> Result<(), Self::Error> {
80 insert_received_activity(&self.id, context).await?;
81 verify_is_public(&self.to, &self.cc)?;
82 let community = self.community(context).await?;
83 verify_person_in_community(&self.actor, &community, context).await?;
84 check_community_deleted_or_removed(&community)?;
87 self.object.object.inner(),
95 async fn receive(self, context: &Data<Self::DataType>) -> Result<(), Self::Error> {
96 let form = PostUpdateForm::builder().locked(Some(false)).build();
97 let post = self.object.object.dereference(context).await?;
98 Post::update(&mut context.pool(), post.id, &form).await?;
103 pub(crate) async fn send_lock_post(
107 context: Data<LemmyContext>,
108 ) -> Result<(), LemmyError> {
109 let community: ApubCommunity = Community::read(&mut context.pool(), post.community_id)
112 let id = generate_activity_id(
114 &context.settings().get_protocol_and_hostname(),
116 let community_id = community.actor_id.inner().clone();
117 let lock = LockPage {
118 actor: actor.actor_id.clone().into(),
120 object: ObjectId::from(post.ap_id),
121 cc: vec![community_id.clone()],
122 kind: LockType::Lock,
124 audience: Some(community_id.into()),
126 let activity = if locked {
127 AnnouncableActivities::LockPost(lock)
129 let id = generate_activity_id(
131 &context.settings().get_protocol_and_hostname(),
133 let undo = UndoLockPage {
134 actor: lock.actor.clone(),
137 kind: UndoType::Undo,
139 audience: lock.audience.clone(),
142 AnnouncableActivities::UndoLockPost(undo)
144 send_activity_in_community(activity, &actor.into(), &community, vec![], true, &context).await?;