Files
aef-website/src/model/highscore.rs

43 lines
1.3 KiB
Rust

use crate::{model::client::Client, Backend};
pub(crate) struct Rank {
pub(crate) rank: i64,
pub(crate) client: Client,
pub(crate) amount: i64,
}
impl Backend {
pub(crate) async fn highscore(&self) -> Vec<Rank> {
match self {
Backend::Sqlite(db) => {
let rows = sqlx::query!(
"SELECT
RANK() OVER (ORDER BY COUNT(s.client_uuid) DESC) as rank,
c.name,
c.uuid,
COUNT(s.client_uuid) as amount
FROM client c
LEFT JOIN sightings s ON c.uuid = s.client_uuid
GROUP BY c.uuid, c.name
ORDER BY amount DESC"
)
.fetch_all(db)
.await
.unwrap_or_default();
rows.into_iter()
.map(|row| Rank {
rank: row.rank,
client: Client {
uuid: row.uuid,
name: row.name,
},
amount: row.amount,
})
.map(|r| r.into())
.collect()
}
}
}
}