From 90dbf767532176ca0ffd59836c49339bf9980946 Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Fri, 15 May 2026 05:47:26 +0200 Subject: [PATCH] feat(feed): include remote following posts in home feed --- crates/adapters/postgres/src/feed.rs | 32 +++++++++++++++++++++------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/crates/adapters/postgres/src/feed.rs b/crates/adapters/postgres/src/feed.rs index 3beba3c..ec672f1 100644 --- a/crates/adapters/postgres/src/feed.rs +++ b/crates/adapters/postgres/src/feed.rs @@ -67,6 +67,19 @@ struct FeedRow { boosted_by_viewer: bool, } +fn federation_following_clause(follower: Option) -> String { + match follower { + Some(fid) => format!( + " OR t.user_id IN ( + SELECT u2.id FROM users u2 + JOIN federation_following ff ON u2.ap_id = ff.remote_actor_url + WHERE ff.local_user_id = '{fid}' + )" + ), + None => String::new(), + } +} + fn feed_select(viewer: Option) -> String { let viewer_checks = match viewer { Some(uid) => format!( @@ -146,16 +159,19 @@ impl FeedRepository for PgFeedRepository { ) -> Result, DomainError> { let ids: Vec = following_ids.iter().map(|id| id.as_uuid()).collect(); let viewer = viewer_id.map(|v| v.as_uuid()); - let total: i64 = sqlx::query_scalar( - "SELECT COUNT(*) FROM thoughts t WHERE t.user_id=ANY($1) AND t.visibility != 'direct'", - ) - .bind(&ids) - .fetch_one(&self.pool) - .await - .map_err(|e| DomainError::Internal(e.to_string()))?; + let fed_clause = federation_following_clause(viewer); + let count_sql = format!( + "SELECT COUNT(*) FROM thoughts t WHERE (t.user_id=ANY($1){}) AND t.visibility != 'direct'", + fed_clause + ); + let total: i64 = sqlx::query_scalar(&count_sql) + .bind(&ids) + .fetch_one(&self.pool) + .await + .map_err(|e| DomainError::Internal(e.to_string()))?; let sel = feed_select(viewer); - let sql = format!("{sel} WHERE t.user_id=ANY($1) AND t.visibility != 'direct' ORDER BY t.created_at DESC LIMIT $2 OFFSET $3"); + let sql = format!("{sel} WHERE (t.user_id=ANY($1){}) AND t.visibility != 'direct' ORDER BY t.created_at DESC LIMIT $2 OFFSET $3", fed_clause); let rows = sqlx::query_as::<_, FeedRow>(&sql) .bind(&ids) .bind(page.limit())