From 8d97c34fbea2f1d298184294aa21f0d94a34d08c Mon Sep 17 00:00:00 2001 From: Julius de Jeu Date: Sat, 12 Nov 2022 22:19:27 +0100 Subject: [PATCH] Add coins to a ticket --- src/db.rs | 11 +++++++++-- src/main.rs | 19 +++++++++++++++---- templates/party.html | 36 +++++++++++++++++++++++++++++++++--- templates/party_goers.html | 2 ++ 4 files changed, 59 insertions(+), 9 deletions(-) diff --git a/src/db.rs b/src/db.rs index cda2358..cdb3e6f 100644 --- a/src/db.rs +++ b/src/db.rs @@ -19,6 +19,11 @@ pub async fn setup_db(pool: &Pool) { .await .unwrap(); + query("alter table tickets add column if not exists coins bool default false") + .execute(pool) + .await + .unwrap(); + query("create table if not exists users (id serial primary key, username text, password text)") .execute(pool) .await @@ -42,6 +47,7 @@ pub struct Ticket { party_id: i32, pub student: String, pub inside: bool, + pub coins: bool, } #[derive(sqlx::FromRow, Debug, Deserialize, Serialize)] @@ -161,11 +167,12 @@ impl Db { .unwrap(); } - pub async fn add_ticket(&self, party_id: i32, student: &str) -> Ticket { - query_as("insert into tickets (party_id, student, inside) values ($1, $2, $3) returning *") + pub async fn add_ticket(&self, party_id: i32, student: &str, coins: bool) -> Ticket { + query_as("insert into tickets (party_id, student, inside, coins) values ($1, $2, $3, $4) returning *") .bind(party_id) .bind(student) .bind(false) + .bind(coins) .fetch_one(&self.0) .await .unwrap() diff --git a/src/main.rs b/src/main.rs index 9dbaa0d..2f4394d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -120,6 +120,7 @@ async fn login( struct ScanRequest { code: String, check: bool, + coins: bool, party: i32, } @@ -129,6 +130,7 @@ enum ScanState { Found, Added, AlreadyScanned, + Coins, } #[derive(Debug, Clone, Serialize, Deserialize)] @@ -155,7 +157,11 @@ async fn scan_card( pool.update_ticket(&ticket).await; Json(ScanResponse { code: scan.code, - state: ScanState::Found, + state: if ticket.coins { + ScanState::Coins + } else { + ScanState::Found + }, }) } } else { @@ -171,7 +177,7 @@ async fn scan_card( state: ScanState::AlreadyScanned, }) } else { - pool.add_ticket(scan.party, &scan.code).await; + pool.add_ticket(scan.party, &scan.code, scan.coins).await; Json(ScanResponse { code: scan.code, state: ScanState::Added, @@ -253,9 +259,14 @@ async fn export_party( ) -> impl IntoResponse { let tickets = pool.get_all_tickets_for_party(party).await; let mut csv = String::new(); - csv.push_str("leerlingnummer,binnen\n"); + csv.push_str("leerlingnummer,binnen,muntjes\n"); for ticket in tickets { - csv.push_str(&format!("{},{}\n", ticket.student, ticket.inside)); + csv.push_str(&format!( + "{},{},{}\n", + ticket.student, + ticket.inside, + if ticket.coins { "COINS" } else { "" } + )); } let mut resp = Response::new(Body::from(csv)); resp.headers_mut().insert( diff --git a/templates/party.html b/templates/party.html index 156a330..de2487e 100644 --- a/templates/party.html +++ b/templates/party.html @@ -22,6 +22,11 @@

Nog geen gescand

Nog geen gescand

Binnen/Betaald: Laden...

+

+ +

@@ -53,6 +58,11 @@ setTimeout(function () { document.body.classList.remove("bg-success"); }, 1000); + } else if (state == "COINS") { + document.body.classList.add("bg-primary"); + setTimeout(function () { + document.body.classList.remove("bg-primary"); + }, 1000); } else if (state == "WARN") { document.body.classList.add("bg-warning"); setTimeout(function () { @@ -86,6 +96,11 @@ // alert("Leerlingnummer gevonden"); set_scan_status("Mag naar binnen"); set_colour("OK"); + } else if (state === "Coins") { + // leerlingnummer is gevonden en mag naar binnen + // alert("Leerlingnummer gevonden"); + set_scan_status("Mag naar binnen, heeft muntjes gekocht!"); + set_colour("COINS"); } else if (state === "Added") { // leerlingummer is toegevoegd aan de gastenlijst // alert("Leerlingnummer toegevoegd"); @@ -119,8 +134,13 @@ } function scan_ticket(code) { + if (code === "COINS" || code === "000000") { + document.getElementById("muntjes").checked = true; + return; + } let check = document.querySelector('input[name="mode"]:checked').value === "true"; let party_id = +document.getElementById("party_id").value; + fetch("/api/ticket", { method: "POST", headers: { @@ -130,18 +150,19 @@ party: party_id, code: code, check: check, + coins: document.getElementById("muntjes").checked, }) }).then(function (response) { return response.json(); }).then(function (data) { console.log(data) + document.getElementById("muntjes").checked = false; return data; }).then(set_state); } function return_handler(e) { e.preventDefault(); - console.log("wario"); let code = document.getElementById("student_number").value; console.log(code); scan_ticket(code); @@ -249,11 +270,20 @@ let result = evt.target.result; result = result.replace("\r\n", "\n").replace("\r", "\n"); for (let line of result.split("\n")) { + let llnr_a = ""; + let coins = false; for (let llnr of line.split(",")) { if (llnr.length === 6 && !isNaN(llnr)) { - scan_ticket(llnr); - num += 1; + llnr_a = llnr; } + if (llnr === "COINS") { + coins = true; + } + } + if (llnr_a !== "") { + num++; + scan_ticket("COINS"); + scan_ticket(llnr_a); } } document.getElementById("import-result").innerHTML = `${num} leerlingen geïmporteerd!` diff --git a/templates/party_goers.html b/templates/party_goers.html index bde8ce3..80333d7 100644 --- a/templates/party_goers.html +++ b/templates/party_goers.html @@ -11,6 +11,7 @@ Ticket Nummer Leerling Nummer Is binnen? + Heeft Muntjes @@ -20,6 +21,7 @@ {{guest.id}} {{guest.student}} {{guest.inside}} + {{guest.coins}}