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