]> Untitled Git - lemmy.git/blob - crates/apub/src/activities/comment/create.rs
Merge pull request #1678 from LemmyNet/rewrite-post
[lemmy.git] / crates / apub / src / activities / comment / create.rs
1 use crate::{
2   activities::{
3     comment::{get_notif_recipients, send_websocket_message},
4     extract_community,
5     verify_activity,
6     verify_person_in_community,
7   },
8   objects::FromApub,
9   ActorType,
10   NoteExt,
11 };
12 use activitystreams::{activity::kind::CreateType, base::BaseExt};
13 use lemmy_apub_lib::{
14   values::PublicUrl,
15   verify_domains_match_opt,
16   ActivityCommonFields,
17   ActivityHandler,
18 };
19 use lemmy_db_schema::source::comment::Comment;
20 use lemmy_utils::LemmyError;
21 use lemmy_websocket::{LemmyContext, UserOperationCrud};
22 use url::Url;
23
24 #[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]
25 #[serde(rename_all = "camelCase")]
26 pub struct CreateComment {
27   to: PublicUrl,
28   object: NoteExt,
29   cc: Vec<Url>,
30   #[serde(rename = "type")]
31   kind: CreateType,
32   #[serde(flatten)]
33   common: ActivityCommonFields,
34 }
35
36 #[async_trait::async_trait(?Send)]
37 impl ActivityHandler for CreateComment {
38   async fn verify(
39     &self,
40     context: &LemmyContext,
41     request_counter: &mut i32,
42   ) -> Result<(), LemmyError> {
43     let community = extract_community(&self.cc, context, request_counter).await?;
44
45     verify_activity(self.common())?;
46     verify_person_in_community(
47       &self.common.actor,
48       &community.actor_id(),
49       context,
50       request_counter,
51     )
52     .await?;
53     verify_domains_match_opt(&self.common.actor, self.object.id_unchecked())?;
54     // TODO: should add a check that the correct community is in cc (probably needs changes to
55     //       comment deserialization)
56     Ok(())
57   }
58
59   async fn receive(
60     &self,
61     context: &LemmyContext,
62     request_counter: &mut i32,
63   ) -> Result<(), LemmyError> {
64     let comment = Comment::from_apub(
65       &self.object,
66       context,
67       self.common.actor.clone(),
68       request_counter,
69       false,
70     )
71     .await?;
72     let recipients =
73       get_notif_recipients(&self.common.actor, &comment, context, request_counter).await?;
74     send_websocket_message(
75       comment.id,
76       recipients,
77       UserOperationCrud::CreateComment,
78       context,
79     )
80     .await
81   }
82
83   fn common(&self) -> &ActivityCommonFields {
84     &self.common
85   }
86 }