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_api_common::utils::blocking;
17 use lemmy_db_schema::{source::person::Person, traits::Crud};
18 use lemmy_utils::error::LemmyError;
19 use lemmy_websocket::{send::send_pm_ws_message, LemmyContext, UserOperationCrud};
22 impl CreateOrUpdatePrivateMessage {
23 #[tracing::instrument(skip_all)]
25 private_message: ApubPrivateMessage,
27 kind: CreateOrUpdateType,
28 context: &LemmyContext,
29 ) -> Result<(), LemmyError> {
30 let recipient_id = private_message.recipient_id;
31 let recipient: ApubPerson =
32 blocking(context.pool(), move |conn| Person::read(conn, recipient_id))
36 let id = generate_activity_id(
38 &context.settings().get_protocol_and_hostname(),
40 let create_or_update = CreateOrUpdatePrivateMessage {
42 actor: ObjectId::new(actor.actor_id()),
43 to: [ObjectId::new(recipient.actor_id())],
44 object: private_message.into_apub(context).await?,
46 unparsed: Default::default(),
48 let inbox = vec![recipient.shared_inbox_or_inbox()];
49 send_lemmy_activity(context, create_or_update, actor, inbox, true).await
53 #[async_trait::async_trait(?Send)]
54 impl ActivityHandler for CreateOrUpdatePrivateMessage {
55 type DataType = LemmyContext;
56 type Error = LemmyError;
58 fn id(&self) -> &Url {
62 fn actor(&self) -> &Url {
66 #[tracing::instrument(skip_all)]
69 context: &Data<LemmyContext>,
70 request_counter: &mut i32,
71 ) -> Result<(), LemmyError> {
72 verify_person(&self.actor, context, request_counter).await?;
73 verify_domains_match(self.actor.inner(), self.object.id.inner())?;
74 verify_domains_match(self.to[0].inner(), self.object.to[0].inner())?;
75 ApubPrivateMessage::verify(&self.object, self.actor.inner(), context, request_counter).await?;
79 #[tracing::instrument(skip_all)]
82 context: &Data<LemmyContext>,
83 request_counter: &mut i32,
84 ) -> Result<(), LemmyError> {
86 ApubPrivateMessage::from_apub(self.object, context, request_counter).await?;
88 let notif_type = match self.kind {
89 CreateOrUpdateType::Create => UserOperationCrud::CreatePrivateMessage,
90 CreateOrUpdateType::Update => UserOperationCrud::EditPrivateMessage,
92 send_pm_ws_message(private_message.id, notif_type, None, context).await?;