use crate::{Backend, model::client::Client}; 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 { 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, }) .collect() } } } }