From c62671116c71a7eaf1aaf13067fa8f5ef9e2f784 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Thu, 28 Jul 2022 11:49:26 -0400 Subject: [PATCH] Send websocket message on accepted follow. Fixes #2369 (#2375) --- .../apub/src/activities/following/accept.rs | 38 ++++++++++++++++--- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/crates/apub/src/activities/following/accept.rs b/crates/apub/src/activities/following/accept.rs index 34764264e..f964da086 100644 --- a/crates/apub/src/activities/following/accept.rs +++ b/crates/apub/src/activities/following/accept.rs @@ -11,10 +11,12 @@ use activitypub_federation::{ utils::verify_urls_match, }; use activitystreams_kinds::activity::AcceptType; -use lemmy_api_common::utils::blocking; +use lemmy_api_common::{community::CommunityResponse, utils::blocking}; 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::LemmyContext; +use lemmy_websocket::{messages::SendUserRoomMessage, LemmyContext, UserOperation}; use url::Url; impl AcceptFollowCommunity { @@ -76,21 +78,47 @@ impl ActivityHandler for AcceptFollowCommunity { context: &Data, request_counter: &mut i32, ) -> Result<(), LemmyError> { - let person = self + let community = self .actor .dereference(context, local_instance(context), request_counter) .await?; - let community = self + let person = self .object .actor .dereference(context, local_instance(context), request_counter) .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, person.id, community.id) + 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, + }); + Ok(()) } }