diff --git a/src/main.rs b/src/main.rs index 44512e6..9dbaa0d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -376,6 +376,23 @@ async fn remove_ticket( "OK" } +#[derive(Debug, Clone, Serialize, Deserialize)] +struct StatResponse { + total: i32, + inside: i32, +} + +async fn stats( + _: User, + Extension(pool): Extension, + Path(party): Path, +) -> Json { + let tickets = pool.get_all_tickets_for_party(party).await; + let total = tickets.len() as i32; + let inside = tickets.iter().filter(|t| t.inside).count() as i32; + Json(StatResponse { total, inside }) +} + #[tokio::main] async fn main() { let url = if let Some(url) = std::env::var("DATABASE_URL").ok() { @@ -383,10 +400,7 @@ async fn main() { } else { "postgres://tickets:verysecure@localhost:5432/tickets".to_string() }; - let pool = PgPoolOptions::new() - .connect(&url) - .await - .unwrap(); + let pool = PgPoolOptions::new().connect(&url).await.unwrap(); db::setup_db(&pool).await; let pool = Arc::new(Db::new(pool)); if let None = pool.get_user_by_username("admin").await { @@ -419,6 +433,7 @@ async fn main() { "/static", get_service(ServeDir::new("static")).handle_error(handle_error), ) + .route("/api/party/:id/stats", get(stats)) .layer(Extension(pool)); axum::Server::bind(&"0.0.0.0:8080".parse().unwrap()) diff --git a/templates/party.html b/templates/party.html index eb2838d..156a330 100644 --- a/templates/party.html +++ b/templates/party.html @@ -12,15 +12,16 @@ Controleren -

Camera

+

Informatie

-

Nog geen gescand

-

Nog geen gescand

+

Nog geen gescand

+

Nog geen gescand

+

Binnen/Betaald: Laden...

@@ -104,7 +105,19 @@ } else { alert("Error"); } + + fetch_stats() } + + function fetch_stats() { + let party_id = +document.getElementById("party_id").value; + fetch(`/api/party/${party_id}/stats`) + .then(response => response.json()) + .then(data => { + document.getElementById("stats").innerText = `${data.inside}/${data.total}`; + }); + } + function scan_ticket(code) { let check = document.querySelector('input[name="mode"]:checked').value === "true"; let party_id = +document.getElementById("party_id").value; @@ -256,6 +269,7 @@ let elem = document.getElementById("student_number"); elem.focus(); elem.select(); + fetch_stats(); {% endblock %} \ No newline at end of file