3 check_community_deleted_or_removed,
4 community::send_activity_in_community,
8 verify_person_in_community,
10 activity_lists::AnnouncableActivities,
14 community::lock_page::{LockPage, LockType, UndoLockPage},
15 create_or_update::page::CreateOrUpdatePage,
22 use activitypub_federation::{core::object_id::ObjectId, data::Data, traits::ActivityHandler};
23 use activitystreams_kinds::{activity::UndoType, public};
24 use lemmy_api_common::{
25 context::LemmyContext,
26 post::{LockPost, PostResponse},
27 utils::get_local_user_view_from_jwt,
29 use lemmy_db_schema::{
32 post::{Post, PostUpdateForm},
36 use lemmy_utils::error::LemmyError;
39 #[async_trait::async_trait(?Send)]
40 impl ActivityHandler for LockPage {
41 type DataType = LemmyContext;
42 type Error = LemmyError;
44 fn id(&self) -> &Url {
48 fn actor(&self) -> &Url {
54 context: &Data<Self::DataType>,
55 request_counter: &mut i32,
56 ) -> Result<(), Self::Error> {
57 verify_is_public(&self.to, &self.cc)?;
58 let community = self.community(context, request_counter).await?;
59 verify_person_in_community(&self.actor, &community, context, request_counter).await?;
60 check_community_deleted_or_removed(&community)?;
74 context: &Data<Self::DataType>,
75 request_counter: &mut i32,
76 ) -> Result<(), Self::Error> {
77 let form = PostUpdateForm::builder().locked(Some(true)).build();
80 .dereference(context, local_instance(context).await, request_counter)
82 Post::update(context.pool(), post.id, &form).await?;
87 #[async_trait::async_trait(?Send)]
88 impl ActivityHandler for UndoLockPage {
89 type DataType = LemmyContext;
90 type Error = LemmyError;
92 fn id(&self) -> &Url {
96 fn actor(&self) -> &Url {
102 context: &Data<Self::DataType>,
103 request_counter: &mut i32,
104 ) -> Result<(), Self::Error> {
105 verify_is_public(&self.to, &self.cc)?;
106 let community = self.community(context, request_counter).await?;
107 verify_person_in_community(&self.actor, &community, context, request_counter).await?;
108 check_community_deleted_or_removed(&community)?;
111 self.object.object.inner(),
122 context: &Data<Self::DataType>,
123 request_counter: &mut i32,
124 ) -> Result<(), Self::Error> {
125 let form = PostUpdateForm::builder().locked(Some(false)).build();
129 .dereference(context, local_instance(context).await, request_counter)
131 Post::update(context.pool(), post.id, &form).await?;
136 #[async_trait::async_trait(?Send)]
137 impl SendActivity for LockPost {
138 type Response = PostResponse;
140 async fn send_activity(
142 response: &Self::Response,
143 context: &LemmyContext,
144 ) -> Result<(), LemmyError> {
145 let local_user_view =
146 get_local_user_view_from_jwt(&request.auth, context.pool(), context.secret()).await?;
147 // For backwards compat with 0.17
148 CreateOrUpdatePage::send(
149 &response.post_view.post,
150 local_user_view.person.id,
151 CreateOrUpdateType::Update,
155 let id = generate_activity_id(
157 &context.settings().get_protocol_and_hostname(),
159 let community_id: Url = response.post_view.community.actor_id.clone().into();
160 let actor = ObjectId::new(local_user_view.person.actor_id.clone());
161 let lock = LockPage {
164 object: ObjectId::new(response.post_view.post.ap_id.clone()),
165 cc: vec![community_id.clone()],
166 kind: LockType::Lock,
168 audience: Some(ObjectId::new(community_id)),
170 let activity = if request.locked {
171 AnnouncableActivities::LockPost(lock)
173 let id = generate_activity_id(
175 &context.settings().get_protocol_and_hostname(),
177 let undo = UndoLockPage {
178 actor: lock.actor.clone(),
181 kind: UndoType::Undo,
183 audience: lock.audience.clone(),
186 AnnouncableActivities::UndoLockPost(undo)
188 let community = Community::read(context.pool(), response.post_view.community.id).await?;
189 send_activity_in_community(
191 &local_user_view.person.into(),