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