diff --git a/migration.sql b/migration.sql index 6a15998..7da1feb 100644 --- a/migration.sql +++ b/migration.sql @@ -213,3 +213,9 @@ CREATE TABLE IF NOT EXISTS "trailer_reservation" ( "created_at" datetime not null default CURRENT_TIMESTAMP ); +CREATE TABLE IF NOT EXISTS "distance" ( + "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, + "destination" text NOT NULL, + "distance_in_km" integer NOT NULL +); + diff --git a/src/model/distance.rs b/src/model/distance.rs new file mode 100644 index 0000000..91e944f --- /dev/null +++ b/src/model/distance.rs @@ -0,0 +1,21 @@ +use serde::Serialize; +use sqlx::{FromRow, SqlitePool}; + +#[derive(FromRow, Serialize, Clone, Debug)] +pub struct Distance { + pub id: i64, + pub destination: String, + pub distance_in_km: i64, +} + +impl Distance { + pub async fn all(db: &SqlitePool) -> Vec { + sqlx::query_as!( + Self, + "SELECT id, destination, distance_in_km FROM distance;" + ) + .fetch_all(db) + .await + .unwrap() + } +} diff --git a/src/model/logbook.rs b/src/model/logbook.rs index 861c21f..cac3fdc 100644 --- a/src/model/logbook.rs +++ b/src/model/logbook.rs @@ -496,25 +496,6 @@ ORDER BY departure DESC Ok(()) } - pub async fn distances(db: &SqlitePool) -> Vec<(String, i64)> { - let result = sqlx::query!("SELECT destination, distance_in_km FROM logbook WHERE id IN (SELECT MIN(id) FROM logbook GROUP BY destination) AND destination IS NOT NULL AND distance_in_km IS NOT NULL;") - .fetch_all(db) - .await - .unwrap(); - - result - .into_iter() - .filter_map(|r| { - if let (Some(destination), Some(distance_in_km)) = (r.destination, r.distance_in_km) - { - Some((destination, distance_in_km)) - } else { - None - } - }) - .collect() - } - async fn remove_rowers(&self, db: &mut Transaction<'_, Sqlite>) { sqlx::query!("DELETE FROM rower WHERE logbook_id=?", self.id) .execute(db.deref_mut()) @@ -1071,21 +1052,6 @@ mod test { assert_eq!(res, Err(LogbookCreateError::TooManyRowers(1, 2))); } - #[sqlx::test] - fn test_distances() { - let pool = testdb!(); - - let res = Logbook::distances(&pool).await; - - assert_eq!( - res, - vec![ - ("Ottensheim".into(), 25 as i64), - ("Ottensheim + Regattastrecke".into(), 29 as i64), - ] - ); - } - #[sqlx::test] fn test_succ_home() { let pool = testdb!(); diff --git a/src/model/mod.rs b/src/model/mod.rs index e6d3349..2ab60e0 100644 --- a/src/model/mod.rs +++ b/src/model/mod.rs @@ -14,6 +14,7 @@ pub mod boat; pub mod boatdamage; pub mod boathouse; pub mod boatreservation; +pub mod distance; pub mod event; pub mod family; pub mod location; diff --git a/src/tera/log.rs b/src/tera/log.rs index 9244bbb..1939faa 100644 --- a/src/tera/log.rs +++ b/src/tera/log.rs @@ -18,6 +18,7 @@ use tera::Context; use crate::model::{ boat::Boat, boatreservation::BoatReservation, + distance::Distance, log::Log, logbook::{ LogToAdd, LogToFinalize, LogToUpdate, Logbook, LogbookAdminUpdateError, LogbookCreateError, @@ -75,7 +76,7 @@ async fn index( }); let logtypes = LogType::all(db).await; - let distances = Logbook::distances(db).await; + let distances = Distance::all(db).await; let on_water = Logbook::on_water(db).await; @@ -180,7 +181,7 @@ async fn kiosk( }); let logtypes = LogType::all(db).await; - let distances = Logbook::distances(db).await; + let distances = Distance::all(db).await; let on_water = Logbook::on_water(db).await; diff --git a/templates/includes/forms/log.html.tera b/templates/includes/forms/log.html.tera index e666945..beb5452 100644 --- a/templates/includes/forms/log.html.tera +++ b/templates/includes/forms/log.html.tera @@ -55,7 +55,7 @@ value="" data-relation="distance_in_km" /> - {% for distance in distances %}