refactor(adapters): update FeedEntry construction to use EngagementStats + ViewerContext

This commit is contained in:
2026-05-15 15:21:48 +02:00
parent 686dc1c91a
commit 48b57abf92
3 changed files with 31 additions and 33 deletions

View File

@@ -97,11 +97,12 @@ fn row_to_entry(r: FeedRow) -> Result<FeedEntry, DomainError> {
Ok(FeedEntry { Ok(FeedEntry {
thought, thought,
author, author,
like_count: r.like_count, stats: domain::models::feed::EngagementStats {
boost_count: r.boost_count, like_count: r.like_count,
reply_count: r.reply_count, boost_count: r.boost_count,
liked_by_viewer: false, reply_count: r.reply_count,
boosted_by_viewer: false, },
viewer: None, // Task 3 will fix this to use real viewer data
}) })
} }

View File

@@ -106,7 +106,7 @@ fn feed_select(viewer: Option<uuid::Uuid>) -> String {
) )
} }
fn row_to_entry(r: FeedRow) -> Result<FeedEntry, DomainError> { fn row_to_entry(r: FeedRow, viewer: Option<uuid::Uuid>) -> Result<FeedEntry, DomainError> {
let thought = Thought { let thought = Thought {
id: ThoughtId::from_uuid(r.thought_id), id: ThoughtId::from_uuid(r.thought_id),
user_id: UserId::from_uuid(r.t_user_id), user_id: UserId::from_uuid(r.t_user_id),
@@ -136,11 +136,15 @@ fn row_to_entry(r: FeedRow) -> Result<FeedEntry, DomainError> {
Ok(FeedEntry { Ok(FeedEntry {
thought, thought,
author, author,
like_count: r.like_count, stats: domain::models::feed::EngagementStats {
boost_count: r.boost_count, like_count: r.like_count,
reply_count: r.reply_count, boost_count: r.boost_count,
liked_by_viewer: r.liked_by_viewer, reply_count: r.reply_count,
boosted_by_viewer: r.boosted_by_viewer, },
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 { Ok(Paginated {
items: rows items: rows
.into_iter() .into_iter()
.map(row_to_entry) .map(|r| row_to_entry(r, viewer))
.collect::<Result<Vec<_>, _>>()?, .collect::<Result<Vec<_>, _>>()?,
total, total,
page: page.page, page: page.page,
@@ -211,7 +215,7 @@ impl FeedRepository for PgFeedRepository {
Ok(Paginated { Ok(Paginated {
items: rows items: rows
.into_iter() .into_iter()
.map(row_to_entry) .map(|r| row_to_entry(r, viewer))
.collect::<Result<Vec<_>, _>>()?, .collect::<Result<Vec<_>, _>>()?,
total, total,
page: page.page, page: page.page,
@@ -247,7 +251,7 @@ impl FeedRepository for PgFeedRepository {
Ok(Paginated { Ok(Paginated {
items: rows items: rows
.into_iter() .into_iter()
.map(row_to_entry) .map(|r| row_to_entry(r, viewer))
.collect::<Result<Vec<_>, _>>()?, .collect::<Result<Vec<_>, _>>()?,
total, total,
page: page.page, page: page.page,
@@ -292,7 +296,7 @@ impl FeedRepository for PgFeedRepository {
Ok(Paginated { Ok(Paginated {
items: rows items: rows
.into_iter() .into_iter()
.map(row_to_entry) .map(|r| row_to_entry(r, viewer))
.collect::<Result<Vec<_>, _>>()?, .collect::<Result<Vec<_>, _>>()?,
total, total,
page: page.page, page: page.page,
@@ -335,7 +339,7 @@ impl FeedRepository for PgFeedRepository {
Ok(Paginated { Ok(Paginated {
items: rows items: rows
.into_iter() .into_iter()
.map(row_to_entry) .map(|r| row_to_entry(r, viewer))
.collect::<Result<Vec<_>, _>>()?, .collect::<Result<Vec<_>, _>>()?,
total, total,
page: page.page, page: page.page,

View File

@@ -29,11 +29,11 @@ pub fn to_thought_response(e: &domain::models::feed::FeedEntry) -> ThoughtRespon
visibility: e.thought.visibility.as_str().to_string(), visibility: e.thought.visibility.as_str().to_string(),
content_warning: e.thought.content_warning.clone(), content_warning: e.thought.content_warning.clone(),
sensitive: e.thought.sensitive, sensitive: e.thought.sensitive,
like_count: e.like_count, like_count: e.stats.like_count,
boost_count: e.boost_count, boost_count: e.stats.boost_count,
reply_count: e.reply_count, reply_count: e.stats.reply_count,
liked_by_viewer: e.liked_by_viewer, liked_by_viewer: e.viewer.as_ref().map(|v| v.liked).unwrap_or(false),
boosted_by_viewer: e.boosted_by_viewer, boosted_by_viewer: e.viewer.as_ref().map(|v| v.boosted).unwrap_or(false),
created_at: e.thought.created_at, created_at: e.thought.created_at,
updated_at: e.thought.updated_at, updated_at: e.thought.updated_at,
} }
@@ -103,15 +103,8 @@ pub async fn search_handler(
let query = q.q.trim().to_string(); let query = q.q.trim().to_string();
let (thoughts_result, users_result) = tokio::join!( let (thoughts_result, users_result) = tokio::join!(
s.search.search_thoughts( s.search.search_thoughts(&query, &page, viewer.as_ref()),
&query, s.search.search_users(&query, &page),
&page,
viewer.as_ref()
),
s.search.search_users(
&query,
&page
),
); );
let thoughts = thoughts_result? let thoughts = thoughts_result?
@@ -122,9 +115,9 @@ pub async fn search_handler(
"id": e.thought.id.as_uuid(), "id": e.thought.id.as_uuid(),
"content": e.thought.content.as_str(), "content": e.thought.content.as_str(),
"author": to_user_response(&e.author), "author": to_user_response(&e.author),
"like_count": e.like_count, "like_count": e.stats.like_count,
"boost_count": e.boost_count, "boost_count": e.stats.boost_count,
"reply_count": e.reply_count, "reply_count": e.stats.reply_count,
"created_at": e.thought.created_at, "created_at": e.thought.created_at,
}) })
}) })