]> Untitled Git - lemmy.git/blob - crates/apub/src/activities/undo_remove.rs
Rewrite remaining activities (#1712)
[lemmy.git] / crates / apub / src / activities / undo_remove.rs
1 use crate::activities::{
2   community::remove_mod::RemoveMod,
3   deletion::{undo_delete::UndoDelete, verify_delete_activity},
4   verify_activity,
5 };
6 use activitystreams::{
7   activity::kind::UndoType,
8   base::AnyBase,
9   primitives::OneOrMany,
10   unparsed::Unparsed,
11 };
12 use lemmy_apub_lib::{values::PublicUrl, ActivityFields, ActivityHandler};
13 use lemmy_utils::LemmyError;
14 use lemmy_websocket::LemmyContext;
15 use serde::{Deserialize, Serialize};
16 use url::Url;
17
18 #[derive(Clone, Debug, Deserialize, Serialize, ActivityFields)]
19 #[serde(rename_all = "camelCase")]
20 pub struct UndoRemovePostCommentOrCommunity {
21   actor: Url,
22   to: PublicUrl,
23   // Note, there is no such thing as Undo/Remove/Mod, so we ignore that
24   object: RemoveMod,
25   cc: [Url; 1],
26   #[serde(rename = "type")]
27   kind: UndoType,
28   id: Url,
29   #[serde(rename = "@context")]
30   context: OneOrMany<AnyBase>,
31   #[serde(flatten)]
32   unparsed: Unparsed,
33 }
34
35 #[async_trait::async_trait(?Send)]
36 impl ActivityHandler for UndoRemovePostCommentOrCommunity {
37   async fn verify(
38     &self,
39     context: &LemmyContext,
40     request_counter: &mut i32,
41   ) -> Result<(), LemmyError> {
42     verify_activity(self)?;
43     self.object.verify(context, request_counter).await?;
44
45     verify_delete_activity(
46       &self.object.object,
47       self,
48       &self.cc[0],
49       true,
50       context,
51       request_counter,
52     )
53     .await?;
54     Ok(())
55   }
56
57   async fn receive(
58     self,
59     context: &LemmyContext,
60     _request_counter: &mut i32,
61   ) -> Result<(), LemmyError> {
62     UndoDelete::receive_undo_remove_action(&self.object.object, context).await
63   }
64 }