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 {
context: &Data<LemmyContext>,
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(())
}
}