]> Untitled Git - lemmy.git/blob - crates/apub_receive/src/activities/comment/create.rs
Apub inbox rewrite (#1652)
[lemmy.git] / crates / apub_receive / src / activities / comment / create.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::CreateType, 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 CreateComment {
17   to: PublicUrl,
18   object: NoteExt,
19   cc: Vec<Url>,
20   #[serde(rename = "type")]
21   kind: CreateType,
22   #[serde(flatten)]
23   common: ActivityCommonFields,
24 }
25
26 #[async_trait::async_trait(?Send)]
27 impl ActivityHandler for CreateComment {
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     // TODO: should add a check that the correct community is in cc (probably needs changes to
37     //       comment deserialization)
38     Ok(())
39   }
40
41   async fn receive(
42     &self,
43     context: &LemmyContext,
44     request_counter: &mut i32,
45   ) -> Result<(), LemmyError> {
46     let comment = Comment::from_apub(
47       &self.object,
48       context,
49       self.common.actor.clone(),
50       request_counter,
51       false,
52     )
53     .await?;
54     let recipients =
55       get_notif_recipients(&self.common.actor, &comment, context, request_counter).await?;
56     send_websocket_message(
57       comment.id,
58       recipients,
59       UserOperationCrud::CreateComment,
60       context,
61     )
62     .await
63   }
64
65   fn common(&self) -> &ActivityCommonFields {
66     &self.common
67   }
68 }