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