fix: diary sort_by rating_desc/rating_asc in all/movie queries

This commit is contained in:
2026-06-04 01:28:35 +02:00
parent 004243dcbb
commit 4206bb4b06
2 changed files with 46 additions and 66 deletions

View File

@@ -111,8 +111,10 @@ impl PostgresRepository {
offset: i64, offset: i64,
) -> Result<Vec<DiaryRow>, DomainError> { ) -> Result<Vec<DiaryRow>, DomainError> {
let order = match sort { let order = match sort {
SortDirection::ByRatingDesc => "r.rating DESC, r.watched_at DESC",
SortDirection::ByRatingAsc => "r.rating ASC, r.watched_at ASC",
SortDirection::Ascending => "r.watched_at ASC", SortDirection::Ascending => "r.watched_at ASC",
_ => "r.watched_at DESC", SortDirection::Descending => "r.watched_at DESC",
}; };
let sql = format!( let sql = format!(
"SELECT m.id, m.external_metadata_id, m.title, m.release_year, m.director, m.poster_path, "SELECT m.id, m.external_metadata_id, m.title, m.release_year, m.director, m.poster_path,
@@ -142,8 +144,10 @@ impl PostgresRepository {
offset: i64, offset: i64,
) -> Result<Vec<DiaryRow>, DomainError> { ) -> Result<Vec<DiaryRow>, DomainError> {
let order = match sort { let order = match sort {
SortDirection::ByRatingDesc => "r.rating DESC, r.watched_at DESC",
SortDirection::ByRatingAsc => "r.rating ASC, r.watched_at ASC",
SortDirection::Ascending => "r.watched_at ASC", SortDirection::Ascending => "r.watched_at ASC",
_ => "r.watched_at DESC", SortDirection::Descending => "r.watched_at DESC",
}; };
let sql = format!( let sql = format!(
"SELECT m.id, m.external_metadata_id, m.title, m.release_year, m.director, m.poster_path, "SELECT m.id, m.external_metadata_id, m.title, m.release_year, m.director, m.poster_path,

View File

@@ -110,38 +110,27 @@ impl SqliteMovieRepository {
limit: i64, limit: i64,
offset: i64, offset: i64,
) -> Result<Vec<DiaryRow>, DomainError> { ) -> Result<Vec<DiaryRow>, DomainError> {
match sort { let order_clause = match sort {
// ByRatingDesc/ByRatingAsc only apply to user-scoped queries; fall back to date sort here SortDirection::ByRatingDesc => "r.rating DESC, r.watched_at DESC",
SortDirection::Descending | SortDirection::ByRatingDesc | SortDirection::ByRatingAsc => sqlx::query_as!( SortDirection::ByRatingAsc => "r.rating ASC, r.watched_at ASC",
DiaryRow, SortDirection::Ascending => "r.watched_at ASC",
"SELECT m.id, m.external_metadata_id, m.title, m.release_year, m.director, m.poster_path, SortDirection::Descending => "r.watched_at DESC",
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 };
FROM reviews r let sql = format!(
INNER JOIN movies m ON m.id = r.movie_id "SELECT m.id, m.external_metadata_id, m.title, m.release_year, m.director, m.poster_path,
ORDER BY r.watched_at DESC 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
LIMIT ? OFFSET ?", FROM reviews r
limit, INNER JOIN movies m ON m.id = r.movie_id
offset ORDER BY {}
) LIMIT ? OFFSET ?",
order_clause
);
sqlx::query_as::<_, DiaryRow>(&sql)
.bind(limit)
.bind(offset)
.fetch_all(&self.pool) .fetch_all(&self.pool)
.await .await
.map_err(Self::map_err), .map_err(Self::map_err)
SortDirection::Ascending => sqlx::query_as!(
DiaryRow,
"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
FROM reviews r
INNER JOIN movies m ON m.id = r.movie_id
ORDER BY r.watched_at ASC
LIMIT ? OFFSET ?",
limit,
offset
)
.fetch_all(&self.pool)
.await
.map_err(Self::map_err),
}
} }
async fn fetch_movie_diary_rows( async fn fetch_movie_diary_rows(
@@ -151,42 +140,29 @@ impl SqliteMovieRepository {
limit: i64, limit: i64,
offset: i64, offset: i64,
) -> Result<Vec<DiaryRow>, DomainError> { ) -> Result<Vec<DiaryRow>, DomainError> {
match sort { let order_clause = match sort {
// ByRatingDesc/ByRatingAsc only apply to user-scoped queries; fall back to date sort here SortDirection::ByRatingDesc => "r.rating DESC, r.watched_at DESC",
SortDirection::Descending | SortDirection::ByRatingDesc | SortDirection::ByRatingAsc => sqlx::query_as!( SortDirection::ByRatingAsc => "r.rating ASC, r.watched_at ASC",
DiaryRow, SortDirection::Ascending => "r.watched_at ASC",
"SELECT m.id, m.external_metadata_id, m.title, m.release_year, m.director, m.poster_path, SortDirection::Descending => "r.watched_at DESC",
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 };
FROM reviews r let sql = format!(
INNER JOIN movies m ON m.id = r.movie_id "SELECT m.id, m.external_metadata_id, m.title, m.release_year, m.director, m.poster_path,
WHERE r.movie_id = ? 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
ORDER BY r.watched_at DESC FROM reviews r
LIMIT ? OFFSET ?", INNER JOIN movies m ON m.id = r.movie_id
movie_id, WHERE r.movie_id = ?
limit, ORDER BY {}
offset LIMIT ? OFFSET ?",
) order_clause
);
sqlx::query_as::<_, DiaryRow>(&sql)
.bind(movie_id)
.bind(limit)
.bind(offset)
.fetch_all(&self.pool) .fetch_all(&self.pool)
.await .await
.map_err(Self::map_err), .map_err(Self::map_err)
SortDirection::Ascending => sqlx::query_as!(
DiaryRow,
"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
FROM reviews r
INNER JOIN movies m ON m.id = r.movie_id
WHERE r.movie_id = ?
ORDER BY r.watched_at ASC
LIMIT ? OFFSET ?",
movie_id,
limit,
offset
)
.fetch_all(&self.pool)
.await
.map_err(Self::map_err),
}
} }
async fn count_user_diary_entries( async fn count_user_diary_entries(