diff --git a/src/model/logbook.rs b/src/model/logbook.rs index 21913c3..20eed20 100644 --- a/src/model/logbook.rs +++ b/src/model/logbook.rs @@ -1,4 +1,4 @@ -use chrono::NaiveDateTime; +use chrono::{Datelike, NaiveDateTime}; use rocket::FromForm; use serde::Serialize; use sqlx::{FromRow, Sqlite, SqlitePool, Transaction}; @@ -220,14 +220,14 @@ ORDER BY departure DESC } pub async fn completed(db: &SqlitePool) -> Vec { - let logs = sqlx::query_as!( - Logbook, - " + let year = chrono::Utc::now().year(); + let logs = sqlx::query_as( + &format!(" SELECT id, boat_id, shipmaster, steering_person, shipmaster_only_steering, departure, arrival, destination, distance_in_km, comments, logtype FROM logbook - WHERE arrival is not null + WHERE arrival is not null AND arrival LIKE '{}-%' ORDER BY departure DESC - " + ", year) ) .fetch_all(db) .await diff --git a/src/model/stat.rs b/src/model/stat.rs index f904ff7..51ecbe8 100644 --- a/src/model/stat.rs +++ b/src/model/stat.rs @@ -1,4 +1,5 @@ use crate::model::user::User; +use chrono::Datelike; use serde::Serialize; use sqlx::{FromRow, Row, SqlitePool}; @@ -9,15 +10,20 @@ pub struct Stat { } impl Stat { - pub async fn boats(db: &SqlitePool) -> Vec { + pub async fn boats(db: &SqlitePool, year: Option) -> Vec { + let year = match year { + Some(year) => year, + None => chrono::Utc::now().year(), + }; //TODO: switch to query! macro again (once upgraded to sqlite 3.42 on server) - sqlx::query( + sqlx::query(&format!( " SELECT (SELECT name FROM boat WHERE id=logbook.boat_id) as name, CAST(SUM(distance_in_km) AS INTEGER) AS rowed_km -FROM logbook +FROM logbook +WHERE arrival LIKE '{}-%' GROUP BY boat_id ORDER BY rowed_km DESC; -", +",year) ) .fetch_all(db) .await @@ -30,19 +36,24 @@ ORDER BY rowed_km DESC; .collect() } - pub async fn people(db: &SqlitePool) -> Vec { + pub async fn people(db: &SqlitePool, year: Option) -> Vec { + let year = match year { + Some(year) => year, + None => chrono::Utc::now().year(), + }; //TODO: switch to query! macro again (once upgraded to sqlite 3.42 on server) - sqlx::query( + sqlx::query(&format!( " SELECT u.name, CAST(SUM(l.distance_in_km) AS INTEGER) AS rowed_km FROM user u INNER JOIN rower r ON u.id = r.rower_id INNER JOIN logbook l ON r.logbook_id = l.id -WHERE u.is_guest = 0 AND l.distance_in_km IS NOT NULL +WHERE u.is_guest = 0 AND l.distance_in_km IS NOT NULL AND l.arrival LIKE '{}-%' GROUP BY u.name ORDER BY rowed_km DESC; ", - ) + year + )) .fetch_all(db) .await .unwrap() diff --git a/src/tera/stat.rs b/src/tera/stat.rs index 834870d..66bf2f5 100644 --- a/src/tera/stat.rs +++ b/src/tera/stat.rs @@ -9,9 +9,9 @@ use crate::model::{ use super::log::KioskCookie; -#[get("/boats", rank = 2)] -async fn index_boat(db: &State, user: NonGuestUser) -> Template { - let stat = Stat::boats(db).await; +#[get("/boats?", rank = 2)] +async fn index_boat(db: &State, user: NonGuestUser, year: Option) -> Template { + let stat = Stat::boats(db, year).await; let kiosk = false; Template::render( @@ -20,17 +20,21 @@ async fn index_boat(db: &State, user: NonGuestUser) -> Template { ) } -#[get("/boats")] -async fn index_boat_kiosk(db: &State, _kiosk: KioskCookie) -> Template { - let stat = Stat::boats(db).await; +#[get("/boats?")] +async fn index_boat_kiosk( + db: &State, + _kiosk: KioskCookie, + year: Option, +) -> Template { + let stat = Stat::boats(db, year).await; let kiosk = true; Template::render("stat.boats", context!(stat, kiosk, show_kiosk_header: true)) } -#[get("/", rank = 2)] -async fn index(db: &State, user: NonGuestUser) -> Template { - let stat = Stat::people(db).await; +#[get("/?", rank = 2)] +async fn index(db: &State, user: NonGuestUser, year: Option) -> Template { + let stat = Stat::people(db, year).await; let personal = stat::get_personal(db, &user.user).await; let kiosk = false; @@ -40,9 +44,9 @@ async fn index(db: &State, user: NonGuestUser) -> Template { ) } -#[get("/")] -async fn index_kiosk(db: &State, _kiosk: KioskCookie) -> Template { - let stat = Stat::people(db).await; +#[get("/?")] +async fn index_kiosk(db: &State, _kiosk: KioskCookie, year: Option) -> Template { + let stat = Stat::people(db, year).await; let kiosk = true; Template::render(