]> Untitled Git - lemmy.git/blobdiff - crates/apub/src/activities/following/accept.rs
Make functions work with both connection and pool (#3420)
[lemmy.git] / crates / apub / src / activities / following / accept.rs
index c4bbbb1bb6596aa4d65a3319740cf3daea9d7d3f..af7d637255356941afbfa93469546da9a1909a7c 100644 (file)
@@ -1,57 +1,42 @@
 use crate::{
   activities::{generate_activity_id, send_lemmy_activity},
-  check_apub_id_valid,
-  fetch_local_site_data,
-  local_instance,
-  protocol::activities::following::{accept::AcceptFollowCommunity, follow::FollowCommunity},
-  ActorType,
+  insert_activity,
+  protocol::activities::following::{accept::AcceptFollow, follow::Follow},
 };
 use activitypub_federation::{
-  core::object_id::ObjectId,
-  data::Data,
+  config::Data,
+  kinds::activity::AcceptType,
+  protocol::verification::verify_urls_match,
   traits::{ActivityHandler, Actor},
-  utils::verify_urls_match,
 };
-use activitystreams_kinds::activity::AcceptType;
-use lemmy_api_common::{community::CommunityResponse, utils::blocking};
+use lemmy_api_common::context::LemmyContext;
 use lemmy_db_schema::{source::community::CommunityFollower, traits::Followable};
-use lemmy_db_views::structs::LocalUserView;
-use lemmy_db_views_actor::structs::CommunityView;
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::{messages::SendUserRoomMessage, LemmyContext, UserOperation};
 use url::Url;
 
-impl AcceptFollowCommunity {
+impl AcceptFollow {
   #[tracing::instrument(skip_all)]
-  pub async fn send(
-    follow: FollowCommunity,
-    context: &LemmyContext,
-    request_counter: &mut i32,
-  ) -> Result<(), LemmyError> {
-    let community = follow.object.dereference_local(context).await?;
-    let person = follow
-      .actor
-      .clone()
-      .dereference(context, local_instance(context), request_counter)
-      .await?;
-    let accept = AcceptFollowCommunity {
-      actor: ObjectId::new(community.actor_id()),
+  pub async fn send(follow: Follow, context: &Data<LemmyContext>) -> Result<(), LemmyError> {
+    let user_or_community = follow.object.dereference_local(context).await?;
+    let person = follow.actor.clone().dereference(context).await?;
+    let accept = AcceptFollow {
+      actor: user_or_community.id().into(),
+      to: Some([person.id().into()]),
       object: follow,
       kind: AcceptType::Accept,
       id: generate_activity_id(
         AcceptType::Accept,
         &context.settings().get_protocol_and_hostname(),
       )?,
-      unparsed: Default::default(),
     };
     let inbox = vec![person.shared_inbox_or_inbox()];
-    send_lemmy_activity(context, accept, &community, inbox, true).await
+    send_lemmy_activity(context, accept, &user_or_community, inbox, true).await
   }
 }
 
 /// Handle accepted follows
-#[async_trait::async_trait(?Send)]
-impl ActivityHandler for AcceptFollowCommunity {
+#[async_trait::async_trait]
+impl ActivityHandler for AcceptFollow {
   type DataType = LemmyContext;
   type Error = LemmyError;
 
@@ -64,66 +49,24 @@ impl ActivityHandler for AcceptFollowCommunity {
   }
 
   #[tracing::instrument(skip_all)]
-  async fn verify(
-    &self,
-    context: &Data<LemmyContext>,
-    request_counter: &mut i32,
-  ) -> Result<(), LemmyError> {
-    let local_site_data = blocking(context.pool(), fetch_local_site_data).await??;
-    check_apub_id_valid(self.id(), &local_site_data, context.settings())
-      .map_err(LemmyError::from_message)?;
-
+  async fn verify(&self, context: &Data<LemmyContext>) -> Result<(), LemmyError> {
     verify_urls_match(self.actor.inner(), self.object.object.inner())?;
-    self.object.verify(context, request_counter).await?;
+    self.object.verify(context).await?;
+    if let Some(to) = &self.to {
+      verify_urls_match(to[0].inner(), self.object.actor.inner())?;
+    }
     Ok(())
   }
 
   #[tracing::instrument(skip_all)]
-  async fn receive(
-    self,
-    context: &Data<LemmyContext>,
-    request_counter: &mut i32,
-  ) -> Result<(), LemmyError> {
-    let community = self
-      .actor
-      .dereference(context, local_instance(context), request_counter)
-      .await?;
-    let person = self
-      .object
-      .actor
-      .dereference(context, local_instance(context), request_counter)
-      .await?;
+  async fn receive(self, context: &Data<LemmyContext>) -> Result<(), LemmyError> {
+    insert_activity(&self.id, &self, false, true, context).await?;
+    let community = self.actor.dereference(context).await?;
+    let person = self.object.actor.dereference(context).await?;
     // This will throw an error if no follow was requested
     let community_id = community.id;
     let person_id = person.id;
-    blocking(context.pool(), move |conn| {
-      CommunityFollower::follow_accepted(conn, community_id, person_id)
-    })
-    .await??;
-
-    // Send the Subscribed message over websocket
-    // Re-read the community_view to get the new SubscribedType
-    let community_view = blocking(context.pool(), move |conn| {
-      CommunityView::read(conn, community_id, Some(person_id))
-    })
-    .await??;
-
-    // Get the local_user_id
-    let local_recipient_id = blocking(context.pool(), move |conn| {
-      LocalUserView::read_person(conn, person_id)
-    })
-    .await??
-    .local_user
-    .id;
-
-    let response = CommunityResponse { community_view };
-
-    context.chat_server().do_send(SendUserRoomMessage {
-      op: UserOperation::FollowCommunity,
-      response,
-      local_recipient_id,
-      websocket_id: None,
-    });
+    CommunityFollower::follow_accepted(&mut context.pool(), community_id, person_id).await?;
 
     Ok(())
   }