]> Untitled Git - lemmy.git/blob - crates/apub/src/activities/private_message/undo_delete.rs
Merge apub, apub_receive crates (fixes #1621)
[lemmy.git] / crates / apub / src / activities / private_message / undo_delete.rs
1 use crate::activities::{
2   private_message::{delete::DeletePrivateMessage, send_websocket_message},
3   verify_activity,
4   verify_person,
5 };
6 use activitystreams::activity::kind::UndoType;
7 use lemmy_api_common::blocking;
8 use lemmy_apub_lib::{
9   verify_domains_match,
10   verify_urls_match,
11   ActivityCommonFields,
12   ActivityHandler,
13 };
14 use lemmy_db_queries::{source::private_message::PrivateMessage_, ApubObject};
15 use lemmy_db_schema::source::private_message::PrivateMessage;
16 use lemmy_utils::LemmyError;
17 use lemmy_websocket::{LemmyContext, UserOperationCrud};
18 use url::Url;
19
20 #[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]
21 #[serde(rename_all = "camelCase")]
22 pub struct UndoDeletePrivateMessage {
23   to: Url,
24   object: DeletePrivateMessage,
25   #[serde(rename = "type")]
26   kind: UndoType,
27   #[serde(flatten)]
28   common: ActivityCommonFields,
29 }
30
31 #[async_trait::async_trait(?Send)]
32 impl ActivityHandler for UndoDeletePrivateMessage {
33   async fn verify(
34     &self,
35     context: &LemmyContext,
36     request_counter: &mut i32,
37   ) -> Result<(), LemmyError> {
38     verify_activity(self.common())?;
39     verify_person(&self.common.actor, context, request_counter).await?;
40     verify_urls_match(&self.common.actor, &self.object.common.actor)?;
41     verify_domains_match(&self.common.actor, &self.object.object)?;
42     self.object.verify(context, request_counter).await?;
43     Ok(())
44   }
45
46   async fn receive(
47     &self,
48     context: &LemmyContext,
49     _request_counter: &mut i32,
50   ) -> Result<(), LemmyError> {
51     let ap_id = self.object.object.clone();
52     let private_message = blocking(context.pool(), move |conn| {
53       PrivateMessage::read_from_apub_id(conn, &ap_id.into())
54     })
55     .await??;
56
57     let deleted_private_message = blocking(context.pool(), move |conn| {
58       PrivateMessage::update_deleted(conn, private_message.id, false)
59     })
60     .await??;
61
62     send_websocket_message(
63       deleted_private_message.id,
64       UserOperationCrud::EditPrivateMessage,
65       context,
66     )
67     .await?;
68
69     Ok(())
70   }
71
72   fn common(&self) -> &ActivityCommonFields {
73     &self.common
74   }
75 }