2 activities::{generate_activity_id, send_lemmy_activity, verify_person},
4 objects::{person::ApubPerson, private_message::ApubPrivateMessage},
5 protocol::activities::{
6 create_or_update::chat_message::CreateOrUpdateChatMessage,
11 use activitypub_federation::{
13 protocol::verification::verify_domains_match,
14 traits::{ActivityHandler, Actor, Object},
16 use lemmy_api_common::{
17 context::LemmyContext,
18 private_message::{CreatePrivateMessage, EditPrivateMessage, PrivateMessageResponse},
20 use lemmy_db_schema::{
22 source::{person::Person, private_message::PrivateMessage},
25 use lemmy_utils::error::LemmyError;
28 #[async_trait::async_trait]
29 impl SendActivity for CreatePrivateMessage {
30 type Response = PrivateMessageResponse;
32 async fn send_activity(
34 response: &Self::Response,
35 context: &Data<LemmyContext>,
36 ) -> Result<(), LemmyError> {
37 CreateOrUpdateChatMessage::send(
38 &response.private_message_view.private_message,
39 response.private_message_view.creator.id,
40 CreateOrUpdateType::Create,
46 #[async_trait::async_trait]
47 impl SendActivity for EditPrivateMessage {
48 type Response = PrivateMessageResponse;
50 async fn send_activity(
52 response: &Self::Response,
53 context: &Data<LemmyContext>,
54 ) -> Result<(), LemmyError> {
55 CreateOrUpdateChatMessage::send(
56 &response.private_message_view.private_message,
57 response.private_message_view.creator.id,
58 CreateOrUpdateType::Update,
65 impl CreateOrUpdateChatMessage {
66 #[tracing::instrument(skip_all)]
68 private_message: &PrivateMessage,
70 kind: CreateOrUpdateType,
71 context: &Data<LemmyContext>,
72 ) -> Result<(), LemmyError> {
73 let recipient_id = private_message.recipient_id;
74 let sender: ApubPerson = Person::read(&mut context.pool(), sender_id).await?.into();
75 let recipient: ApubPerson = Person::read(&mut context.pool(), recipient_id)
79 let id = generate_activity_id(
81 &context.settings().get_protocol_and_hostname(),
83 let create_or_update = CreateOrUpdateChatMessage {
85 actor: sender.id().into(),
86 to: [recipient.id().into()],
87 object: ApubPrivateMessage(private_message.clone())
92 let inbox = vec![recipient.shared_inbox_or_inbox()];
93 send_lemmy_activity(context, create_or_update, &sender, inbox, true).await
97 #[async_trait::async_trait]
98 impl ActivityHandler for CreateOrUpdateChatMessage {
99 type DataType = LemmyContext;
100 type Error = LemmyError;
102 fn id(&self) -> &Url {
106 fn actor(&self) -> &Url {
110 #[tracing::instrument(skip_all)]
111 async fn verify(&self, context: &Data<Self::DataType>) -> Result<(), LemmyError> {
112 verify_person(&self.actor, context).await?;
113 verify_domains_match(self.actor.inner(), self.object.id.inner())?;
114 verify_domains_match(self.to[0].inner(), self.object.to[0].inner())?;
115 ApubPrivateMessage::verify(&self.object, self.actor.inner(), context).await?;
119 #[tracing::instrument(skip_all)]
120 async fn receive(self, context: &Data<Self::DataType>) -> Result<(), LemmyError> {
121 insert_activity(&self.id, &self, false, true, context).await?;
122 ApubPrivateMessage::from_json(self.object, context).await?;