From 48b57abf92e62ff69c02cb8247207790abeb0c27 Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Fri, 15 May 2026 15:21:48 +0200 Subject: [PATCH] refactor(adapters): update FeedEntry construction to use EngagementStats + ViewerContext --- crates/adapters/postgres-search/src/lib.rs | 11 +++++---- crates/adapters/postgres/src/feed.rs | 26 ++++++++++++--------- crates/presentation/src/handlers/feed.rs | 27 ++++++++-------------- 3 files changed, 31 insertions(+), 33 deletions(-) diff --git a/crates/adapters/postgres-search/src/lib.rs b/crates/adapters/postgres-search/src/lib.rs index 0a90607..317ce0b 100644 --- a/crates/adapters/postgres-search/src/lib.rs +++ b/crates/adapters/postgres-search/src/lib.rs @@ -97,11 +97,12 @@ fn row_to_entry(r: FeedRow) -> Result { Ok(FeedEntry { thought, author, - like_count: r.like_count, - boost_count: r.boost_count, - reply_count: r.reply_count, - liked_by_viewer: false, - boosted_by_viewer: false, + stats: domain::models::feed::EngagementStats { + like_count: r.like_count, + boost_count: r.boost_count, + reply_count: r.reply_count, + }, + viewer: None, // Task 3 will fix this to use real viewer data }) } diff --git a/crates/adapters/postgres/src/feed.rs b/crates/adapters/postgres/src/feed.rs index 6aacb67..297985b 100644 --- a/crates/adapters/postgres/src/feed.rs +++ b/crates/adapters/postgres/src/feed.rs @@ -106,7 +106,7 @@ fn feed_select(viewer: Option) -> String { ) } -fn row_to_entry(r: FeedRow) -> Result { +fn row_to_entry(r: FeedRow, viewer: Option) -> Result { let thought = Thought { id: ThoughtId::from_uuid(r.thought_id), user_id: UserId::from_uuid(r.t_user_id), @@ -136,11 +136,15 @@ fn row_to_entry(r: FeedRow) -> Result { Ok(FeedEntry { thought, author, - like_count: r.like_count, - boost_count: r.boost_count, - reply_count: r.reply_count, - liked_by_viewer: r.liked_by_viewer, - boosted_by_viewer: r.boosted_by_viewer, + stats: domain::models::feed::EngagementStats { + like_count: r.like_count, + boost_count: r.boost_count, + reply_count: r.reply_count, + }, + viewer: viewer.map(|_| domain::models::feed::ViewerContext { + liked: r.liked_by_viewer, + boosted: r.boosted_by_viewer, + }), }) } @@ -178,7 +182,7 @@ impl FeedRepository for PgFeedRepository { Ok(Paginated { items: rows .into_iter() - .map(row_to_entry) + .map(|r| row_to_entry(r, viewer)) .collect::, _>>()?, total, page: page.page, @@ -211,7 +215,7 @@ impl FeedRepository for PgFeedRepository { Ok(Paginated { items: rows .into_iter() - .map(row_to_entry) + .map(|r| row_to_entry(r, viewer)) .collect::, _>>()?, total, page: page.page, @@ -247,7 +251,7 @@ impl FeedRepository for PgFeedRepository { Ok(Paginated { items: rows .into_iter() - .map(row_to_entry) + .map(|r| row_to_entry(r, viewer)) .collect::, _>>()?, total, page: page.page, @@ -292,7 +296,7 @@ impl FeedRepository for PgFeedRepository { Ok(Paginated { items: rows .into_iter() - .map(row_to_entry) + .map(|r| row_to_entry(r, viewer)) .collect::, _>>()?, total, page: page.page, @@ -335,7 +339,7 @@ impl FeedRepository for PgFeedRepository { Ok(Paginated { items: rows .into_iter() - .map(row_to_entry) + .map(|r| row_to_entry(r, viewer)) .collect::, _>>()?, total, page: page.page, diff --git a/crates/presentation/src/handlers/feed.rs b/crates/presentation/src/handlers/feed.rs index 79a73af..52ab4b9 100644 --- a/crates/presentation/src/handlers/feed.rs +++ b/crates/presentation/src/handlers/feed.rs @@ -29,11 +29,11 @@ pub fn to_thought_response(e: &domain::models::feed::FeedEntry) -> ThoughtRespon visibility: e.thought.visibility.as_str().to_string(), content_warning: e.thought.content_warning.clone(), sensitive: e.thought.sensitive, - like_count: e.like_count, - boost_count: e.boost_count, - reply_count: e.reply_count, - liked_by_viewer: e.liked_by_viewer, - boosted_by_viewer: e.boosted_by_viewer, + like_count: e.stats.like_count, + boost_count: e.stats.boost_count, + reply_count: e.stats.reply_count, + liked_by_viewer: e.viewer.as_ref().map(|v| v.liked).unwrap_or(false), + boosted_by_viewer: e.viewer.as_ref().map(|v| v.boosted).unwrap_or(false), created_at: e.thought.created_at, updated_at: e.thought.updated_at, } @@ -103,15 +103,8 @@ pub async fn search_handler( let query = q.q.trim().to_string(); let (thoughts_result, users_result) = tokio::join!( - s.search.search_thoughts( - &query, - &page, - viewer.as_ref() - ), - s.search.search_users( - &query, - &page - ), + s.search.search_thoughts(&query, &page, viewer.as_ref()), + s.search.search_users(&query, &page), ); let thoughts = thoughts_result? @@ -122,9 +115,9 @@ pub async fn search_handler( "id": e.thought.id.as_uuid(), "content": e.thought.content.as_str(), "author": to_user_response(&e.author), - "like_count": e.like_count, - "boost_count": e.boost_count, - "reply_count": e.reply_count, + "like_count": e.stats.like_count, + "boost_count": e.stats.boost_count, + "reply_count": e.stats.reply_count, "created_at": e.thought.created_at, }) })