only one place to 'calculate' the name
This commit is contained in:
@@ -1,56 +1,42 @@
|
||||
use crate::{random_names::get_name_by_uuid, Backend};
|
||||
|
||||
struct RankDb {
|
||||
pub(crate) rank: i64,
|
||||
pub(crate) name: Option<String>,
|
||||
pub(crate) uuid: String,
|
||||
pub(crate) amount: i64,
|
||||
}
|
||||
use crate::{model::client::Client, Backend};
|
||||
|
||||
pub(crate) struct Rank {
|
||||
pub(crate) rank: i64,
|
||||
pub(crate) name: String,
|
||||
pub(crate) uuid: String,
|
||||
pub(crate) client: Client,
|
||||
pub(crate) amount: i64,
|
||||
}
|
||||
|
||||
impl From<RankDb> for Rank {
|
||||
fn from(value: RankDb) -> Self {
|
||||
let name = match value.name {
|
||||
Some(name) => name,
|
||||
None => get_name_by_uuid(&value.uuid).to_string(),
|
||||
};
|
||||
|
||||
Self {
|
||||
rank: value.rank,
|
||||
name,
|
||||
uuid: value.uuid,
|
||||
amount: value.amount,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Backend {
|
||||
pub(crate) async fn highscore(&self) -> Vec<Rank> {
|
||||
match self {
|
||||
Backend::Sqlite(db) => sqlx::query_as!(
|
||||
RankDb,
|
||||
"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()
|
||||
.into_iter()
|
||||
.map(|r| r.into())
|
||||
.collect(),
|
||||
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()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user