From 858ae28eb3b3080886b3a34cd526c077de4cba0e Mon Sep 17 00:00:00 2001 From: philipp Date: Wed, 17 Apr 2024 13:18:35 +0200 Subject: [PATCH] allow deletion of boat --- migration.sql | 3 ++- src/model/boat.rs | 18 +++++++++++------- src/tera/admin/boat.rs | 5 ++++- staging-diff.sql | 1 + 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/migration.sql b/migration.sql index 675c976..f19d5f8 100644 --- a/migration.sql +++ b/migration.sql @@ -101,7 +101,8 @@ CREATE TABLE IF NOT EXISTS "boat" ( "default_shipmaster_only_steering" boolean default false not null, "default_destination" text, "skull" boolean default true NOT NULL, -- false => riemen - "external" boolean default false NOT NULL -- false => owned by different club + "external" boolean default false NOT NULL, -- false => owned by different club + "deleted" boolean NOT NULL DEFAULT FALSE ); CREATE TABLE IF NOT EXISTS "logbook_type" ( diff --git a/src/model/boat.rs b/src/model/boat.rs index f110b19..05a2e1c 100644 --- a/src/model/boat.rs +++ b/src/model/boat.rs @@ -26,6 +26,7 @@ pub struct Boat { skull: bool, #[serde(default = "bool::default")] external: bool, + pub deleted: bool, } #[derive(Serialize, Deserialize, Debug)] @@ -188,8 +189,9 @@ AND date('now') BETWEEN start_date AND end_date;", let boats = sqlx::query_as!( Boat, " -SELECT id, name, amount_seats, location_id, owner, year_built, boatbuilder, default_shipmaster_only_steering, default_destination, skull, external +SELECT id, name, amount_seats, location_id, owner, year_built, boatbuilder, default_shipmaster_only_steering, default_destination, skull, external, deleted FROM boat +WHERE deleted=false ORDER BY amount_seats DESC " ) @@ -215,12 +217,14 @@ SELECT b.default_shipmaster_only_steering, b.default_destination, b.skull, - b.external + b.external, + b.deleted FROM boat AS b WHERE b.external = false AND b.location_id = (SELECT id FROM location WHERE name = 'Linz') + AND b.deleted = false ORDER BY b.name DESC; " @@ -240,7 +244,7 @@ ORDER BY sqlx::query_as!( Boat, " -SELECT id, name, amount_seats, location_id, owner, year_built, boatbuilder, default_shipmaster_only_steering, default_destination, skull, external +SELECT id, name, amount_seats, location_id, owner, year_built, boatbuilder, default_shipmaster_only_steering, default_destination, skull, external, deleted FROM boat WHERE owner is null or owner = ? ORDER BY amount_seats DESC @@ -254,7 +258,7 @@ ORDER BY amount_seats DESC sqlx::query_as!( Boat, " -SELECT id, name, amount_seats, location_id, owner, year_built, boatbuilder, default_shipmaster_only_steering, default_destination, skull, external +SELECT id, name, amount_seats, location_id, owner, year_built, boatbuilder, default_shipmaster_only_steering, default_destination, skull, external, deleted FROM boat WHERE owner = ? OR (owner is null and amount_seats = 1) ORDER BY amount_seats DESC @@ -272,7 +276,7 @@ ORDER BY amount_seats DESC .unwrap(); let boats_in_ottensheim = sqlx::query_as!( Boat, - "SELECT id, name, amount_seats, location_id, owner, year_built, boatbuilder, default_shipmaster_only_steering, default_destination, skull, external + "SELECT id, name, amount_seats, location_id, owner, year_built, boatbuilder, default_shipmaster_only_steering, default_destination, skull, external, deleted FROM boat WHERE owner is null and location_id = ? ORDER BY amount_seats DESC @@ -291,7 +295,7 @@ ORDER BY amount_seats DESC let boats = sqlx::query_as!( Boat, " -SELECT boat.id, boat.name, amount_seats, location_id, owner, year_built, boatbuilder, default_shipmaster_only_steering, default_destination, skull, external +SELECT boat.id, boat.name, amount_seats, location_id, owner, year_built, boatbuilder, default_shipmaster_only_steering, default_destination, skull, external, deleted FROM boat INNER JOIN location ON boat.location_id = location.id WHERE location.name=? @@ -354,7 +358,7 @@ ORDER BY amount_seats DESC } pub async fn delete(&self, db: &SqlitePool) { - sqlx::query!("DELETE FROM boat WHERE id=?", self.id) + sqlx::query!("UPDATE boat SET deleted=1 WHERE id=?", self.id) .execute(db) .await .unwrap(); //Okay, because we can only create a Boat of a valid id diff --git a/src/tera/admin/boat.rs b/src/tera/admin/boat.rs index d8776f6..e23d2e4 100644 --- a/src/tera/admin/boat.rs +++ b/src/tera/admin/boat.rs @@ -1,6 +1,7 @@ use crate::model::{ boat::{Boat, BoatToAdd, BoatToUpdate}, location::Location, + log::Log, user::{AdminUser, User, UserWithRoles}, }; use rocket::{ @@ -39,8 +40,10 @@ async fn index( } #[get("/boat//delete")] -async fn delete(db: &State, _admin: AdminUser, boat: i32) -> Flash { +async fn delete(db: &State, admin: AdminUser, boat: i32) -> Flash { let boat = Boat::find_by_id(db, boat).await; + Log::create(db, format!("{} deleted boat: {boat:?}", admin.user.name)).await; + match boat { Some(boat) => { boat.delete(db).await; diff --git a/staging-diff.sql b/staging-diff.sql index 05203dd..6fb21fc 100644 --- a/staging-diff.sql +++ b/staging-diff.sql @@ -1,3 +1,4 @@ +-- test user INSERT INTO user(name) VALUES('Marie'); INSERT INTO "user_role" (user_id, role_id) VALUES((SELECT id from user where name = 'Marie'),(SELECT id FROM role where name = 'Donau Linz')); INSERT INTO user(name) VALUES('Philipp');