- // restoring a post or comment
- else {
- match get_or_fetch_and_insert_post_or_comment(&self.object.object, context, request_counter)
- .await?
- {
- PostOrComment::Post(post) => {
- let deleted_post = blocking(context.pool(), move |conn| {
- Post::update_deleted(conn, post.id, false)
- })
- .await??;
- send_post_message(deleted_post.id, UserOperationCrud::EditPost, context).await
- }
- PostOrComment::Comment(comment) => {
- let deleted_comment = blocking(context.pool(), move |conn| {
- Comment::update_deleted(conn, comment.id, false)
- })
- .await??;
- send_comment_message(
- deleted_comment.id,
- vec![],
- UserOperationCrud::EditComment,
- context,
- )
- .await
+ }
+}
+
+impl UndoDelete {
+ #[tracing::instrument(skip_all)]
+ pub(in crate::activities::deletion) fn new(
+ actor: &ApubPerson,
+ object: DeletableObjects,
+ to: Url,
+ community: Option<&Community>,
+ summary: Option<String>,
+ context: &Data<LemmyContext>,
+ ) -> Result<UndoDelete, LemmyError> {
+ let object = Delete::new(actor, object, to.clone(), community, summary, context)?;
+
+ let id = generate_activity_id(
+ UndoType::Undo,
+ &context.settings().get_protocol_and_hostname(),
+ )?;
+ let cc: Option<Url> = community.map(|c| c.actor_id.clone().into());
+ Ok(UndoDelete {
+ actor: actor.actor_id.clone().into(),
+ to: vec![to],
+ object,
+ cc: cc.into_iter().collect(),
+ kind: UndoType::Undo,
+ id,
+ audience: community.map(|c| c.actor_id.clone().into()),
+ })
+ }
+
+ #[tracing::instrument(skip_all)]
+ pub(in crate::activities) async fn receive_undo_remove_action(
+ actor: &ApubPerson,
+ object: &Url,
+ context: &Data<LemmyContext>,
+ ) -> Result<(), LemmyError> {
+ match DeletableObjects::read_from_db(object, context).await? {
+ DeletableObjects::Community(community) => {
+ if community.local {
+ return Err(LemmyErrorType::OnlyLocalAdminCanRestoreCommunity)?;