]> Untitled Git - lemmy.git/blob - crates/apub/src/activities/private_message/delete.rs
Rewrite fetcher (#1792)
[lemmy.git] / crates / apub / src / activities / private_message / delete.rs
1 use crate::{
2   activities::{generate_activity_id, verify_activity, verify_person},
3   activity_queue::send_activity_new,
4   extensions::context::lemmy_context,
5   fetcher::object_id::ObjectId,
6   ActorType,
7 };
8 use activitystreams::{
9   activity::kind::DeleteType,
10   base::AnyBase,
11   primitives::OneOrMany,
12   unparsed::Unparsed,
13 };
14 use lemmy_api_common::blocking;
15 use lemmy_apub_lib::{verify_domains_match, ActivityFields, ActivityHandler};
16 use lemmy_db_queries::{source::private_message::PrivateMessage_, ApubObject, Crud};
17 use lemmy_db_schema::source::{person::Person, private_message::PrivateMessage};
18 use lemmy_utils::LemmyError;
19 use lemmy_websocket::{send::send_pm_ws_message, LemmyContext, UserOperationCrud};
20 use serde::{Deserialize, Serialize};
21 use url::Url;
22
23 #[derive(Clone, Debug, Deserialize, Serialize, ActivityFields)]
24 #[serde(rename_all = "camelCase")]
25 pub struct DeletePrivateMessage {
26   actor: ObjectId<Person>,
27   to: ObjectId<Person>,
28   pub(in crate::activities::private_message) object: Url,
29   #[serde(rename = "type")]
30   kind: DeleteType,
31   id: Url,
32   #[serde(rename = "@context")]
33   context: OneOrMany<AnyBase>,
34   #[serde(flatten)]
35   unparsed: Unparsed,
36 }
37
38 impl DeletePrivateMessage {
39   pub(in crate::activities::private_message) fn new(
40     actor: &Person,
41     pm: &PrivateMessage,
42   ) -> Result<DeletePrivateMessage, LemmyError> {
43     Ok(DeletePrivateMessage {
44       actor: ObjectId::new(actor.actor_id()),
45       to: ObjectId::new(actor.actor_id()),
46       object: pm.ap_id.clone().into(),
47       kind: DeleteType::Delete,
48       id: generate_activity_id(DeleteType::Delete)?,
49       context: lemmy_context(),
50       unparsed: Default::default(),
51     })
52   }
53   pub async fn send(
54     actor: &Person,
55     pm: &PrivateMessage,
56     context: &LemmyContext,
57   ) -> Result<(), LemmyError> {
58     let delete = DeletePrivateMessage::new(actor, pm)?;
59     let delete_id = delete.id.clone();
60
61     let recipient_id = pm.recipient_id;
62     let recipient =
63       blocking(context.pool(), move |conn| Person::read(conn, recipient_id)).await??;
64     let inbox = vec![recipient.get_shared_inbox_or_inbox_url()];
65     send_activity_new(context, &delete, &delete_id, actor, inbox, true).await
66   }
67 }
68
69 #[async_trait::async_trait(?Send)]
70 impl ActivityHandler for DeletePrivateMessage {
71   async fn verify(
72     &self,
73     context: &LemmyContext,
74     request_counter: &mut i32,
75   ) -> Result<(), LemmyError> {
76     verify_activity(self)?;
77     verify_person(&self.actor, context, request_counter).await?;
78     verify_domains_match(self.actor.inner(), &self.object)?;
79     Ok(())
80   }
81
82   async fn receive(
83     self,
84     context: &LemmyContext,
85     _request_counter: &mut i32,
86   ) -> Result<(), LemmyError> {
87     let ap_id = self.object.clone();
88     let private_message = blocking(context.pool(), move |conn| {
89       PrivateMessage::read_from_apub_id(conn, &ap_id.into())
90     })
91     .await??;
92     let deleted_private_message = blocking(context.pool(), move |conn| {
93       PrivateMessage::update_deleted(conn, private_message.id, true)
94     })
95     .await??;
96
97     send_pm_ws_message(
98       deleted_private_message.id,
99       UserOperationCrud::DeletePrivateMessage,
100       None,
101       context,
102     )
103     .await?;
104
105     Ok(())
106   }
107 }