Send websocket message on accepted follow. Fixes #2369 (#2375)

This commit is contained in:
Dessalines 2022-07-28 11:49:26 -04:00 committed by GitHub
parent b9f1fc0518
commit c62671116c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -11,10 +11,12 @@ use activitypub_federation::{
utils::verify_urls_match, utils::verify_urls_match,
}; };
use activitystreams_kinds::activity::AcceptType; 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_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_utils::error::LemmyError;
use lemmy_websocket::LemmyContext; use lemmy_websocket::{messages::SendUserRoomMessage, LemmyContext, UserOperation};
use url::Url; use url::Url;
impl AcceptFollowCommunity { impl AcceptFollowCommunity {
@ -76,21 +78,47 @@ impl ActivityHandler for AcceptFollowCommunity {
context: &Data<LemmyContext>, context: &Data<LemmyContext>,
request_counter: &mut i32, request_counter: &mut i32,
) -> Result<(), LemmyError> { ) -> Result<(), LemmyError> {
let person = self let community = self
.actor .actor
.dereference(context, local_instance(context), request_counter) .dereference(context, local_instance(context), request_counter)
.await?; .await?;
let community = self let person = self
.object .object
.actor .actor
.dereference(context, local_instance(context), request_counter) .dereference(context, local_instance(context), request_counter)
.await?; .await?;
// This will throw an error if no follow was requested // 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| { blocking(context.pool(), move |conn| {
CommunityFollower::follow_accepted(conn, person.id, community.id) CommunityFollower::follow_accepted(conn, community_id, person_id)
}) })
.await??; .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(()) Ok(())
} }
} }