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