feat: user tombstone and retired usernames

This commit is contained in:
2026-10-26 02:03:36 +01:00
parent bde8040cc3
commit 31f5d5f337
15 changed files with 550 additions and 56 deletions

View File

@@ -131,11 +131,16 @@ impl DiaryQuery for SqliteDiaryRepository {
FeedSortBy::RatingAsc => "r.rating ASC, r.watched_at ASC",
};
// Tombstoned local authors vanish from the feed; remote and orphan
// rows have no `users` match, so `deleted_at` is NULL for them.
where_parts.push("u.deleted_at IS NULL".to_string());
let where_clause = where_parts.join(" AND ");
let count_sql = format!(
"SELECT COUNT(*) FROM reviews r
INNER JOIN movies m ON m.id = r.movie_id
LEFT JOIN users u ON u.id = r.user_id
WHERE {}",
where_clause
);
@@ -304,12 +309,14 @@ impl DiaryQuery for SqliteDiaryRepository {
let limit = page.limit as i64;
let offset = page.offset as i64;
let total: i64 =
sqlx::query_scalar::<_, i64>("SELECT COUNT(*) FROM reviews WHERE movie_id = ?")
.bind(&id_str)
.fetch_one(&self.pool)
.await
.map_err(crate::shared::map_sqlx_error)?;
let total: i64 = sqlx::query_scalar::<_, i64>(
"SELECT COUNT(*) FROM reviews r LEFT JOIN users u ON u.id = r.user_id
WHERE r.movie_id = ? AND u.deleted_at IS NULL",
)
.bind(&id_str)
.fetch_one(&self.pool)
.await
.map_err(crate::shared::map_sqlx_error)?;
let rows = sqlx::query_as::<_, FeedRow>(
"SELECT m.id, m.external_metadata_id, m.title, m.release_year, m.director, m.poster_path,
@@ -321,7 +328,7 @@ impl DiaryQuery for SqliteDiaryRepository {
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 r.movie_id = ?
WHERE r.movie_id = ? AND u.deleted_at IS NULL
ORDER BY r.watched_at DESC
LIMIT ? OFFSET ?",
)