3 community::{announce::AnnouncableActivities, send_to_community},
7 verify_delete_activity,
14 context::lemmy_context,
15 fetcher::object_id::ObjectId,
16 migrations::PublicUrlMigration,
17 objects::{community::ApubCommunity, person::ApubPerson},
19 use activitystreams::{
20 activity::kind::UndoType,
22 primitives::OneOrMany,
26 use lemmy_api_common::blocking;
29 traits::{ActivityFields, ActivityHandler, ActorType},
31 use lemmy_db_schema::source::{comment::Comment, community::Community, post::Post};
32 use lemmy_utils::LemmyError;
33 use lemmy_websocket::{
34 send::{send_comment_ws_message_simple, send_community_ws_message, send_post_ws_message},
38 use serde::{Deserialize, Serialize};
41 #[derive(Clone, Debug, Deserialize, Serialize, ActivityFields)]
42 #[serde(rename_all = "camelCase")]
43 pub struct UndoDelete {
44 actor: ObjectId<ApubPerson>,
45 to: PublicUrlMigration,
47 cc: [ObjectId<ApubCommunity>; 1],
48 #[serde(rename = "type")]
51 #[serde(rename = "@context")]
52 context: OneOrMany<AnyBase>,
57 #[async_trait::async_trait(?Send)]
58 impl ActivityHandler for UndoDelete {
59 type DataType = LemmyContext;
62 context: &Data<LemmyContext>,
63 request_counter: &mut i32,
64 ) -> Result<(), LemmyError> {
65 verify_activity(self, &context.settings())?;
66 self.object.verify(context, request_counter).await?;
67 verify_delete_activity(
71 self.object.summary.is_some(),
81 context: &Data<LemmyContext>,
82 request_counter: &mut i32,
83 ) -> Result<(), LemmyError> {
84 if self.object.summary.is_some() {
85 UndoDelete::receive_undo_remove_action(&self.object.object, context).await
87 receive_delete_action(
91 community: UserOperationCrud::EditCommunity,
92 post: UserOperationCrud::EditPost,
93 comment: UserOperationCrud::EditComment,
105 pub(in crate::activities::deletion) async fn send(
107 community: &ApubCommunity,
109 summary: Option<String>,
110 context: &LemmyContext,
111 ) -> Result<(), LemmyError> {
112 let object = Delete::new(actor, community, object_id, summary, context)?;
114 let id = generate_activity_id(
116 &context.settings().get_protocol_and_hostname(),
118 let undo = UndoDelete {
119 actor: ObjectId::new(actor.actor_id()),
120 to: PublicUrlMigration::create(),
122 cc: [ObjectId::new(community.actor_id())],
123 kind: UndoType::Undo,
125 context: lemmy_context(),
126 unparsed: Default::default(),
129 let activity = AnnouncableActivities::UndoDelete(undo);
130 send_to_community(activity, &id, actor, community, vec![], context).await
133 pub(in crate::activities) async fn receive_undo_remove_action(
135 context: &LemmyContext,
136 ) -> Result<(), LemmyError> {
137 use UserOperationCrud::*;
138 match DeletableObjects::read_from_db(object, context).await? {
139 DeletableObjects::Community(community) => {
141 return Err(anyhow!("Only local admin can restore community").into());
143 let deleted_community = blocking(context.pool(), move |conn| {
144 Community::update_removed(conn, community.id, false)
147 send_community_ws_message(deleted_community.id, EditCommunity, None, None, context).await?;
149 DeletableObjects::Post(post) => {
150 let removed_post = blocking(context.pool(), move |conn| {
151 Post::update_removed(conn, post.id, false)
154 send_post_ws_message(removed_post.id, EditPost, None, None, context).await?;
156 DeletableObjects::Comment(comment) => {
157 let removed_comment = blocking(context.pool(), move |conn| {
158 Comment::update_removed(conn, comment.id, false)
161 send_comment_ws_message_simple(removed_comment.id, EditComment, context).await?;