3 deletion::{receive_delete_action, verify_delete_activity, DeletableObjects},
7 objects::{community::ApubCommunity, person::ApubPerson},
8 protocol::activities::deletion::{delete::Delete, undo_delete::UndoDelete},
10 use activitypub_federation::{core::object_id::ObjectId, data::Data, traits::ActivityHandler};
11 use activitystreams_kinds::activity::UndoType;
12 use lemmy_db_schema::{
14 comment::{Comment, CommentUpdateForm},
15 community::{Community, CommunityUpdateForm},
20 ModRemoveCommunityForm,
24 post::{Post, PostUpdateForm},
28 use lemmy_utils::error::LemmyError;
29 use lemmy_websocket::{
30 send::{send_comment_ws_message_simple, send_community_ws_message, send_post_ws_message},
36 #[async_trait::async_trait(?Send)]
37 impl ActivityHandler for UndoDelete {
38 type DataType = LemmyContext;
39 type Error = LemmyError;
41 fn id(&self) -> &Url {
45 fn actor(&self) -> &Url {
49 #[tracing::instrument(skip_all)]
52 context: &Data<LemmyContext>,
53 request_counter: &mut i32,
54 ) -> Result<(), LemmyError> {
55 self.object.verify(context, request_counter).await?;
56 verify_delete_activity(
58 self.object.summary.is_some(),
66 #[tracing::instrument(skip_all)]
69 context: &Data<LemmyContext>,
70 request_counter: &mut i32,
71 ) -> Result<(), LemmyError> {
72 if self.object.summary.is_some() {
73 UndoDelete::receive_undo_remove_action(
76 .dereference(context, local_instance(context).await, request_counter)
78 self.object.object.id(),
83 receive_delete_action(
84 self.object.object.id(),
96 #[tracing::instrument(skip_all)]
97 pub(in crate::activities::deletion) fn new(
99 object: DeletableObjects,
101 community: Option<&Community>,
102 summary: Option<String>,
103 context: &LemmyContext,
104 ) -> Result<UndoDelete, LemmyError> {
105 let object = Delete::new(actor, object, to.clone(), community, summary, context)?;
107 let id = generate_activity_id(
109 &context.settings().get_protocol_and_hostname(),
111 let cc: Option<Url> = community.map(|c| c.actor_id.clone().into());
113 actor: ObjectId::new(actor.actor_id.clone()),
116 cc: cc.into_iter().collect(),
117 kind: UndoType::Undo,
119 audience: community.map(|c| ObjectId::<ApubCommunity>::new(c.actor_id.clone())),
123 #[tracing::instrument(skip_all)]
124 pub(in crate::activities) async fn receive_undo_remove_action(
127 context: &LemmyContext,
128 ) -> Result<(), LemmyError> {
129 use UserOperationCrud::*;
130 match DeletableObjects::read_from_db(object, context).await? {
131 DeletableObjects::Community(community) => {
133 return Err(LemmyError::from_message(
134 "Only local admin can restore community",
137 let form = ModRemoveCommunityForm {
138 mod_person_id: actor.id,
139 community_id: community.id,
140 removed: Some(false),
144 ModRemoveCommunity::create(context.pool(), &form).await?;
145 let deleted_community = Community::update(
148 &CommunityUpdateForm::builder().removed(Some(false)).build(),
151 send_community_ws_message(deleted_community.id, EditCommunity, None, None, context).await?;
153 DeletableObjects::Post(post) => {
154 let form = ModRemovePostForm {
155 mod_person_id: actor.id,
157 removed: Some(false),
160 ModRemovePost::create(context.pool(), &form).await?;
161 let removed_post = Post::update(
164 &PostUpdateForm::builder().removed(Some(false)).build(),
167 send_post_ws_message(removed_post.id, EditPost, None, None, context).await?;
169 DeletableObjects::Comment(comment) => {
170 let form = ModRemoveCommentForm {
171 mod_person_id: actor.id,
172 comment_id: comment.id,
173 removed: Some(false),
176 ModRemoveComment::create(context.pool(), &form).await?;
177 let removed_comment = Comment::update(
180 &CommentUpdateForm::builder().removed(Some(false)).build(),
183 send_comment_ws_message_simple(removed_comment.id, EditComment, context).await?;
185 DeletableObjects::PrivateMessage(_) => unimplemented!(),