add stats

This commit is contained in:
2023-07-24 20:56:46 +02:00
parent e90e27fc3d
commit 082fac9789
11 changed files with 142 additions and 9 deletions

View File

@ -30,6 +30,7 @@ pub struct LogbookWithBoatAndRowers {
pub enum LogbookUpdateError {
NotYourEntry,
TooManyRowers(usize, usize),
}
pub enum LogbookCreateError {
@ -170,6 +171,13 @@ impl Logbook {
Ok(())
}
async fn remove_rowers(&self, db: &SqlitePool) {
sqlx::query!("DELETE FROM rower WHERE logbook_id=?", self.id)
.execute(db)
.await
.unwrap();
}
pub async fn home(
&self,
db: &SqlitePool,
@ -178,10 +186,21 @@ impl Logbook {
distance_in_km: i64,
comments: Option<String>,
logtype: Option<i64>,
rower: Vec<i64>,
) -> Result<(), LogbookUpdateError> {
if user.id != self.shipmaster {
return Err(LogbookUpdateError::NotYourEntry);
}
let boat = Boat::find_by_id(db, self.boat_id as i32).await.unwrap(); //ok
if rower.len() > boat.amount_seats as usize - 1 {
return Err(LogbookUpdateError::TooManyRowers(
boat.amount_seats as usize,
rower.len() + 1,
));
}
//TODO: check current date
let arrival = format!("{}", chrono::offset::Local::now().format("%Y-%m-%d %H:%M"));
@ -197,6 +216,13 @@ impl Logbook {
)
.execute(db)
.await.unwrap(); //TODO: fixme
self.remove_rowers(db).await;
for rower in &rower {
Rower::create(db, self.id, *rower).await;
}
Ok(())
}

View File

@ -14,6 +14,7 @@ pub mod logbook;
pub mod logtype;
pub mod planned_event;
pub mod rower;
pub mod stat;
pub mod trip;
pub mod tripdetails;
pub mod triptype;

35
src/model/stat.rs Normal file
View File

@ -0,0 +1,35 @@
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()
}
}

View File

@ -40,6 +40,29 @@ pub enum LoginError {
}
impl User {
pub async fn rowed_km(&self, db: &SqlitePool) -> i32 {
sqlx::query!(
"SELECT COALESCE(SUM(distance_in_km),0) as rowed_km
FROM (
SELECT distance_in_km
FROM logbook
WHERE shipmaster = ?1
UNION
SELECT l.distance_in_km
FROM logbook l
INNER JOIN rower r ON r.logbook_id = l.id
WHERE r.rower_id = ?1
);",
self.id,
)
.fetch_one(db)
.await
.unwrap()
.rowed_km
.unwrap()
}
pub async fn find_by_id(db: &SqlitePool, id: i32) -> Option<Self> {
sqlx::query_as!(
User,