diff --git a/crates/adapters/postgres/src/diary.rs b/crates/adapters/postgres/src/diary.rs index 7a54009..1f950fc 100644 --- a/crates/adapters/postgres/src/diary.rs +++ b/crates/adapters/postgres/src/diary.rs @@ -322,10 +322,11 @@ impl DiaryRepository for PostgresDiaryRepository { to_char(r.watched_at AT TIME ZONE 'UTC', 'YYYY-MM-DD HH24:MI:SS') AS watched_at, to_char(r.created_at AT TIME ZONE 'UTC', 'YYYY-MM-DD HH24:MI:SS') AS created_at, r.remote_actor_url, - COALESCE(u.email, r.remote_actor_url) AS user_email + COALESCE(u.email, a.handle, r.remote_actor_url) AS user_email FROM reviews r INNER JOIN movies m ON m.id = r.movie_id LEFT JOIN users u ON u.id = r.user_id + LEFT JOIN ap_remote_actors a ON a.url = r.remote_actor_url WHERE {} ORDER BY {} LIMIT {} OFFSET {}", diff --git a/crates/adapters/sqlite/src/diary.rs b/crates/adapters/sqlite/src/diary.rs index fe0fc3e..76aeee9 100644 --- a/crates/adapters/sqlite/src/diary.rs +++ b/crates/adapters/sqlite/src/diary.rs @@ -291,10 +291,11 @@ impl DiaryRepository for SqliteDiaryRepository { "SELECT m.id, m.external_metadata_id, m.title, m.release_year, m.director, m.poster_path, r.id AS review_id, r.movie_id, r.user_id, r.rating, r.comment, r.watched_at, r.created_at, r.remote_actor_url, - COALESCE(u.email, r.remote_actor_url) AS user_email + COALESCE(u.email, a.handle, r.remote_actor_url) AS user_email FROM reviews r INNER JOIN movies m ON m.id = r.movie_id LEFT JOIN users u ON u.id = r.user_id + LEFT JOIN ap_remote_actors a ON a.url = r.remote_actor_url WHERE {} ORDER BY {} LIMIT ? OFFSET ?", diff --git a/crates/api-types/src/diary.rs b/crates/api-types/src/diary.rs index bc5d86d..32f24f6 100644 --- a/crates/api-types/src/diary.rs +++ b/crates/api-types/src/diary.rs @@ -55,9 +55,10 @@ pub struct FeedEntryDto { pub movie: MovieDto, pub review: ReviewDto, pub user_id: Uuid, - pub user_email: String, pub user_display_name: String, pub is_federated: bool, + #[serde(skip_serializing_if = "Option::is_none")] + pub actor_url: Option, } #[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)] diff --git a/crates/presentation/src/mappers/diary.rs b/crates/presentation/src/mappers/diary.rs index 34e90f4..e38c24f 100644 --- a/crates/presentation/src/mappers/diary.rs +++ b/crates/presentation/src/mappers/diary.rs @@ -4,12 +4,17 @@ use domain::models::FeedEntry; use super::movies::{movie_to_dto, review_to_dto}; pub fn feed_entry_to_dto(e: &FeedEntry) -> FeedEntryDto { + use domain::models::ReviewSource; + let actor_url = match e.review().source() { + ReviewSource::Remote { actor_url } => Some(actor_url.clone()), + ReviewSource::Local => None, + }; FeedEntryDto { movie: movie_to_dto(e.movie()), review: review_to_dto(e.review()), user_id: e.review().user_id().value(), - user_email: e.user_email().to_string(), user_display_name: e.user_display_name().to_string(), is_federated: e.review().is_remote(), + actor_url, } } diff --git a/spa/src/components/review-card.tsx b/spa/src/components/review-card.tsx index 0820d3d..e0e9905 100644 --- a/spa/src/components/review-card.tsx +++ b/spa/src/components/review-card.tsx @@ -12,9 +12,10 @@ type ReviewCardProps = { userName?: string userId?: string isFederated?: boolean + actorUrl?: string } -export function ReviewCard({ movie, review, userName, userId, isFederated }: ReviewCardProps) { +export function ReviewCard({ movie, review, userName, userId, isFederated, actorUrl }: ReviewCardProps) { return ( @@ -28,6 +29,10 @@ export function ReviewCard({ movie, review, userName, userId, isFederated }: Rev {userName} + ) : actorUrl ? ( + + {userName} + ) : ( {userName} )} diff --git a/spa/src/lib/api/diary.ts b/spa/src/lib/api/diary.ts index 63d3d1d..04b9f95 100644 --- a/spa/src/lib/api/diary.ts +++ b/spa/src/lib/api/diary.ts @@ -29,9 +29,9 @@ export const feedEntryDtoSchema = z.object({ movie: movieDtoSchema, review: reviewDtoSchema, user_id: z.string().uuid(), - user_email: z.string(), user_display_name: z.string(), is_federated: z.boolean(), + actor_url: z.string().optional(), }) export type FeedEntryDto = z.infer diff --git a/spa/src/routes/_app/index.tsx b/spa/src/routes/_app/index.tsx index 8d8a339..08a5ed9 100644 --- a/spa/src/routes/_app/index.tsx +++ b/spa/src/routes/_app/index.tsx @@ -115,8 +115,9 @@ function FeedTab() { movie={entry.movie} review={entry.review} userName={entry.user_display_name} - userId={entry.user_id} + userId={entry.is_federated ? undefined : entry.user_id} isFederated={entry.is_federated} + actorUrl={entry.actor_url} /> ) return entry.user_id === auth?.user_id ? (