]> Untitled Git - lemmy.git/blob - crates/apub/src/activities/private_message/create.rs
Apub inbox rewrite (#1652)
[lemmy.git] / crates / apub / src / activities / private_message / create.rs
1 use crate::{
2   activities::{private_message::send_websocket_message, verify_activity, verify_person},
3   objects::FromApub,
4   NoteExt,
5 };
6 use activitystreams::{activity::kind::CreateType, base::BaseExt};
7 use lemmy_apub_lib::{verify_domains_match_opt, ActivityCommonFields, ActivityHandler};
8 use lemmy_db_schema::source::private_message::PrivateMessage;
9 use lemmy_utils::LemmyError;
10 use lemmy_websocket::{LemmyContext, UserOperationCrud};
11 use url::Url;
12
13 #[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]
14 #[serde(rename_all = "camelCase")]
15 pub struct CreatePrivateMessage {
16   to: Url,
17   object: NoteExt,
18   #[serde(rename = "type")]
19   kind: CreateType,
20   #[serde(flatten)]
21   common: ActivityCommonFields,
22 }
23
24 #[async_trait::async_trait(?Send)]
25 impl ActivityHandler for CreatePrivateMessage {
26   async fn verify(
27     &self,
28     context: &LemmyContext,
29     request_counter: &mut i32,
30   ) -> Result<(), LemmyError> {
31     verify_activity(self.common())?;
32     verify_person(&self.common.actor, context, request_counter).await?;
33     verify_domains_match_opt(&self.common.actor, self.object.id_unchecked())?;
34     Ok(())
35   }
36
37   async fn receive(
38     &self,
39     context: &LemmyContext,
40     request_counter: &mut i32,
41   ) -> Result<(), LemmyError> {
42     let private_message = PrivateMessage::from_apub(
43       &self.object,
44       context,
45       self.common.actor.clone(),
46       request_counter,
47       false,
48     )
49     .await?;
50
51     send_websocket_message(
52       private_message.id,
53       UserOperationCrud::CreatePrivateMessage,
54       context,
55     )
56     .await?;
57
58     Ok(())
59   }
60
61   fn common(&self) -> &ActivityCommonFields {
62     &self.common
63   }
64 }