diff --git a/.sqlx/query-2c7353f34c4748d4d4be6abbf343fa7ea30eeb985c4bfd12b0fc3997d1ba03bb.json b/.sqlx/query-771236034946abb52809203ba9a1259900e343174cf3f435fc18d9e689deb187.json similarity index 61% rename from .sqlx/query-2c7353f34c4748d4d4be6abbf343fa7ea30eeb985c4bfd12b0fc3997d1ba03bb.json rename to .sqlx/query-771236034946abb52809203ba9a1259900e343174cf3f435fc18d9e689deb187.json index 71a8608..7f82c14 100644 --- a/.sqlx/query-2c7353f34c4748d4d4be6abbf343fa7ea30eeb985c4bfd12b0fc3997d1ba03bb.json +++ b/.sqlx/query-771236034946abb52809203ba9a1259900e343174cf3f435fc18d9e689deb187.json @@ -1,6 +1,6 @@ { "db_name": "SQLite", - "query": "SELECT u.id AS \"id!: String\",\n u.email AS \"email!: String\",\n COUNT(DISTINCT r.movie_id) AS \"total_movies!: i64\",\n AVG(CAST(r.rating AS REAL)) AS avg_rating\n FROM users u\n LEFT JOIN reviews r ON r.user_id = u.id AND r.remote_actor_url IS NULL\n GROUP BY u.id, u.email\n ORDER BY u.email ASC", + "query": "SELECT u.id AS \"id!: String\",\n u.email AS \"email!: String\",\n COUNT(DISTINCT r.movie_id) AS \"total_movies!: i64\",\n AVG(CAST(r.rating AS REAL)) AS avg_rating,\n u.avatar_path\n FROM users u\n LEFT JOIN reviews r ON r.user_id = u.id AND r.remote_actor_url IS NULL\n GROUP BY u.id, u.email, u.avatar_path\n ORDER BY u.email ASC", "describe": { "columns": [ { @@ -22,6 +22,11 @@ "name": "avg_rating", "ordinal": 3, "type_info": "Float" + }, + { + "name": "avatar_path", + "ordinal": 4, + "type_info": "Text" } ], "parameters": { @@ -31,8 +36,9 @@ true, false, false, + true, true ] }, - "hash": "2c7353f34c4748d4d4be6abbf343fa7ea30eeb985c4bfd12b0fc3997d1ba03bb" + "hash": "771236034946abb52809203ba9a1259900e343174cf3f435fc18d9e689deb187" } diff --git a/crates/adapters/postgres/src/models.rs b/crates/adapters/postgres/src/models.rs index f5c127c..84ff421 100644 --- a/crates/adapters/postgres/src/models.rs +++ b/crates/adapters/postgres/src/models.rs @@ -229,6 +229,7 @@ pub(crate) struct UserSummaryRow { pub email: String, pub total_movies: i64, pub avg_rating: Option, + pub avatar_path: Option, } impl UserSummaryRow { @@ -238,6 +239,7 @@ impl UserSummaryRow { Email::new(self.email)?, self.total_movies, self.avg_rating, + self.avatar_path, )) } } diff --git a/crates/adapters/postgres/src/users.rs b/crates/adapters/postgres/src/users.rs index e0ddc06..a5716ff 100644 --- a/crates/adapters/postgres/src/users.rs +++ b/crates/adapters/postgres/src/users.rs @@ -270,10 +270,11 @@ impl UserRepository for PostgresUserRepository { sqlx::query_as::<_, UserSummaryRow>( r#"SELECT u.id, u.email, COUNT(DISTINCT r.movie_id) AS total_movies, - AVG(r.rating::float) AS avg_rating + AVG(r.rating::float) AS avg_rating, + u.avatar_path FROM users u LEFT JOIN reviews r ON r.user_id = u.id AND r.remote_actor_url IS NULL - GROUP BY u.id, u.email + GROUP BY u.id, u.email, u.avatar_path ORDER BY u.email ASC"#, ) .fetch_all(&self.pool) diff --git a/crates/adapters/sqlite/src/models.rs b/crates/adapters/sqlite/src/models.rs index ef7cbd6..5672590 100644 --- a/crates/adapters/sqlite/src/models.rs +++ b/crates/adapters/sqlite/src/models.rs @@ -240,6 +240,7 @@ pub(crate) struct UserSummaryRow { pub email: String, pub total_movies: i64, pub avg_rating: Option, + pub avatar_path: Option, } impl UserSummaryRow { @@ -249,6 +250,7 @@ impl UserSummaryRow { Email::new(self.email)?, self.total_movies, self.avg_rating, + self.avatar_path, )) } } diff --git a/crates/adapters/sqlite/src/users.rs b/crates/adapters/sqlite/src/users.rs index 767f505..c501077 100644 --- a/crates/adapters/sqlite/src/users.rs +++ b/crates/adapters/sqlite/src/users.rs @@ -229,10 +229,11 @@ impl UserRepository for SqliteUserRepository { r#"SELECT u.id AS "id!: String", u.email AS "email!: String", COUNT(DISTINCT r.movie_id) AS "total_movies!: i64", - AVG(CAST(r.rating AS REAL)) AS avg_rating + AVG(CAST(r.rating AS REAL)) AS avg_rating, + u.avatar_path FROM users u LEFT JOIN reviews r ON r.user_id = u.id AND r.remote_actor_url IS NULL - GROUP BY u.id, u.email + GROUP BY u.id, u.email, u.avatar_path ORDER BY u.email ASC"# ) .fetch_all(&self.pool) diff --git a/crates/adapters/template-askama/src/lib.rs b/crates/adapters/template-askama/src/lib.rs index 6f75ed6..4bf89b3 100644 --- a/crates/adapters/template-askama/src/lib.rs +++ b/crates/adapters/template-askama/src/lib.rs @@ -170,6 +170,7 @@ struct UserSummaryView { initial: char, avg_rating_display: String, total_movies: i64, + avatar_url: Option, } #[derive(Template)] @@ -495,6 +496,7 @@ impl HtmlRenderer for AskamaHtmlRenderer { initial, avg_rating_display, total_movies: u.total_movies, + avatar_url: u.avatar_path.as_ref().map(|p| format!("/images/{}", p)), } }) .collect(); diff --git a/crates/adapters/template-askama/templates/users.html b/crates/adapters/template-askama/templates/users.html index d928375..d3432fe 100644 --- a/crates/adapters/template-askama/templates/users.html +++ b/crates/adapters/template-askama/templates/users.html @@ -12,7 +12,11 @@ {% endif %} {% for user in users %}
+ {% if let Some(url) = &user.avatar_url %} + {{ user.initial }} + {% else %}
{{ user.initial }}
+ {% endif %}