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