rowt/src/model/stat.rs

36 lines
898 B
Rust
Raw Normal View History

2023-07-24 20:56:46 +02:00
use serde::Serialize;
use sqlx::{FromRow, SqlitePool};
#[derive(FromRow, Serialize, Clone)]
pub struct Stat {
name: String,
rowed_km: i32,
}
impl Stat {
pub async fn get_rowed_km(db: &SqlitePool) -> Vec<Stat> {
sqlx::query!(
"SELECT u.name AS name, COALESCE(SUM(distance_in_km), 0) as rowed_km
FROM user u
INNER JOIN (
SELECT shipmaster AS user_id, distance_in_km
FROM logbook
UNION
SELECT r.rower_id AS user_id, l.distance_in_km
FROM logbook l
INNER JOIN rower r ON r.logbook_id = l.id
) AS subquery ON u.id = subquery.user_id
GROUP BY u.id ORDER BY rowed_km DESC;"
)
.fetch_all(db)
.await
.unwrap()
.into_iter()
.map(|row| Stat {
name: row.name,
rowed_km: row.rowed_km.unwrap_or(0),
})
.collect()
}
}