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