1 use crate::activities::{
2 private_message::{delete::DeletePrivateMessage, send_websocket_message},
6 use activitystreams::activity::kind::UndoType;
7 use lemmy_api_common::blocking;
14 use lemmy_db_queries::{source::private_message::PrivateMessage_, ApubObject};
15 use lemmy_db_schema::source::private_message::PrivateMessage;
16 use lemmy_utils::LemmyError;
17 use lemmy_websocket::{LemmyContext, UserOperationCrud};
20 #[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]
21 #[serde(rename_all = "camelCase")]
22 pub struct UndoDeletePrivateMessage {
24 object: DeletePrivateMessage,
25 #[serde(rename = "type")]
28 common: ActivityCommonFields,
31 #[async_trait::async_trait(?Send)]
32 impl ActivityHandler for UndoDeletePrivateMessage {
35 context: &LemmyContext,
36 request_counter: &mut i32,
37 ) -> Result<(), LemmyError> {
38 verify_activity(self.common())?;
39 verify_person(&self.common.actor, context, request_counter).await?;
40 verify_urls_match(&self.common.actor, &self.object.common.actor)?;
41 verify_domains_match(&self.common.actor, &self.object.object)?;
42 self.object.verify(context, request_counter).await?;
48 context: &LemmyContext,
49 _request_counter: &mut i32,
50 ) -> Result<(), LemmyError> {
51 let ap_id = self.object.object.clone();
52 let private_message = blocking(context.pool(), move |conn| {
53 PrivateMessage::read_from_apub_id(conn, &ap_id.into())
57 let deleted_private_message = blocking(context.pool(), move |conn| {
58 PrivateMessage::update_deleted(conn, private_message.id, false)
62 send_websocket_message(
63 deleted_private_message.id,
64 UserOperationCrud::EditPrivateMessage,
72 fn common(&self) -> &ActivityCommonFields {