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