2 activities::{generate_activity_id, send_lemmy_activity, verify_person},
3 objects::{person::ApubPerson, private_message::ApubPrivateMessage},
4 protocol::activities::{
5 create_or_update::private_message::CreateOrUpdatePrivateMessage,
10 use activitypub_federation::{
11 core::object_id::ObjectId,
13 traits::{ActivityHandler, Actor, ApubObject},
14 utils::verify_domains_match,
16 use lemmy_db_schema::{source::person::Person, traits::Crud};
17 use lemmy_utils::error::LemmyError;
18 use lemmy_websocket::{send::send_pm_ws_message, LemmyContext, UserOperationCrud};
21 impl CreateOrUpdatePrivateMessage {
22 #[tracing::instrument(skip_all)]
24 private_message: ApubPrivateMessage,
26 kind: CreateOrUpdateType,
27 context: &LemmyContext,
28 ) -> Result<(), LemmyError> {
29 let recipient_id = private_message.recipient_id;
30 let recipient: ApubPerson = Person::read(context.pool(), recipient_id).await?.into();
32 let id = generate_activity_id(
34 &context.settings().get_protocol_and_hostname(),
36 let create_or_update = CreateOrUpdatePrivateMessage {
38 actor: ObjectId::new(actor.actor_id()),
39 to: [ObjectId::new(recipient.actor_id())],
40 object: private_message.into_apub(context).await?,
42 unparsed: Default::default(),
44 let inbox = vec![recipient.shared_inbox_or_inbox()];
45 send_lemmy_activity(context, create_or_update, actor, inbox, true).await
49 #[async_trait::async_trait(?Send)]
50 impl ActivityHandler for CreateOrUpdatePrivateMessage {
51 type DataType = LemmyContext;
52 type Error = LemmyError;
54 fn id(&self) -> &Url {
58 fn actor(&self) -> &Url {
62 #[tracing::instrument(skip_all)]
65 context: &Data<LemmyContext>,
66 request_counter: &mut i32,
67 ) -> Result<(), LemmyError> {
68 verify_person(&self.actor, context, request_counter).await?;
69 verify_domains_match(self.actor.inner(), self.object.id.inner())?;
70 verify_domains_match(self.to[0].inner(), self.object.to[0].inner())?;
71 ApubPrivateMessage::verify(&self.object, self.actor.inner(), context, request_counter).await?;
75 #[tracing::instrument(skip_all)]
78 context: &Data<LemmyContext>,
79 request_counter: &mut i32,
80 ) -> Result<(), LemmyError> {
82 ApubPrivateMessage::from_apub(self.object, context, request_counter).await?;
84 let notif_type = match self.kind {
85 CreateOrUpdateType::Create => UserOperationCrud::CreatePrivateMessage,
86 CreateOrUpdateType::Update => UserOperationCrud::EditPrivateMessage,
88 send_pm_ws_message(private_message.id, notif_type, None, context).await?;