]> Untitled Git - lemmy.git/blob - crates/apub/src/activities/comment/update.rs
Merge pull request #1678 from LemmyNet/rewrite-post
[lemmy.git] / crates / apub / src / activities / comment / update.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::UpdateType, 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 UpdateComment {
27   to: PublicUrl,
28   object: NoteExt,
29   cc: Vec<Url>,
30   #[serde(rename = "type")]
31   kind: UpdateType,
32   #[serde(flatten)]
33   common: ActivityCommonFields,
34 }
35
36 #[async_trait::async_trait(?Send)]
37 impl ActivityHandler for UpdateComment {
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     Ok(())
55   }
56
57   async fn receive(
58     &self,
59     context: &LemmyContext,
60     request_counter: &mut i32,
61   ) -> Result<(), LemmyError> {
62     let comment = Comment::from_apub(
63       &self.object,
64       context,
65       self.common.actor.clone(),
66       request_counter,
67       false,
68     )
69     .await?;
70
71     let recipients =
72       get_notif_recipients(&self.common.actor, &comment, context, request_counter).await?;
73     send_websocket_message(
74       comment.id,
75       recipients,
76       UserOperationCrud::EditComment,
77       context,
78     )
79     .await
80   }
81
82   fn common(&self) -> &ActivityCommonFields {
83     &self.common
84   }
85 }