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