]> Untitled Git - lemmy.git/blobdiff - crates/apub/src/activities/following/accept.rs
Rewrite activitypub following, person, community, pm (#1692)
[lemmy.git] / crates / apub / src / activities / following / accept.rs
index 6bd5d272f7f4d8420c8929a46975e3149ca9e9ff..bc6895899d1437f67b5bd074481d60de413acb4c 100644 (file)
@@ -1,12 +1,23 @@
 use crate::{
-  activities::{following::follow::FollowCommunity, verify_activity, verify_community},
+  activities::{
+    following::follow::FollowCommunity,
+    generate_activity_id,
+    verify_activity,
+    verify_community,
+  },
+  activity_queue::send_activity_new,
+  extensions::context::lemmy_context,
   fetcher::{community::get_or_fetch_and_upsert_community, person::get_or_fetch_and_upsert_person},
+  ActorType,
 };
 use activitystreams::activity::kind::AcceptType;
 use lemmy_api_common::blocking;
 use lemmy_apub_lib::{verify_urls_match, ActivityCommonFields, ActivityHandler};
-use lemmy_db_queries::Followable;
-use lemmy_db_schema::source::community::CommunityFollower;
+use lemmy_db_queries::{ApubObject, Followable};
+use lemmy_db_schema::source::{
+  community::{Community, CommunityFollower},
+  person::Person,
+};
 use lemmy_utils::LemmyError;
 use lemmy_websocket::LemmyContext;
 use url::Url;
@@ -22,6 +33,35 @@ pub struct AcceptFollowCommunity {
   common: ActivityCommonFields,
 }
 
+impl AcceptFollowCommunity {
+  pub async fn send(follow: FollowCommunity, context: &LemmyContext) -> Result<(), LemmyError> {
+    let community_id = follow.object.clone();
+    let community = blocking(context.pool(), move |conn| {
+      Community::read_from_apub_id(conn, &community_id.into())
+    })
+    .await??;
+    let person_id = follow.common.actor.clone();
+    let person = blocking(context.pool(), move |conn| {
+      Person::read_from_apub_id(conn, &person_id.into())
+    })
+    .await??;
+
+    let id = generate_activity_id(AcceptType::Accept)?;
+    let accept = AcceptFollowCommunity {
+      to: person.actor_id(),
+      object: follow,
+      kind: AcceptType::Accept,
+      common: ActivityCommonFields {
+        context: lemmy_context(),
+        id: id.clone(),
+        actor: community.actor_id(),
+        unparsed: Default::default(),
+      },
+    };
+    let inbox = vec![person.inbox_url.into()];
+    send_activity_new(context, &accept, &id, &community, inbox, true).await
+  }
+}
 /// Handle accepted follows
 #[async_trait::async_trait(?Send)]
 impl ActivityHandler for AcceptFollowCommunity {
@@ -39,7 +79,7 @@ impl ActivityHandler for AcceptFollowCommunity {
   }
 
   async fn receive(
-    &self,
+    self,
     context: &LemmyContext,
     request_counter: &mut i32,
   ) -> Result<(), LemmyError> {