From 7a5a6615a5ad061f4caa2deaabcd8da76d450eb2 Mon Sep 17 00:00:00 2001 From: Ammar Hussein Date: Thu, 12 Nov 2026 15:47:04 -0800 Subject: [PATCH] admin panel has a new game button --- src/db.rs | 27 +++++++++++++++++++++++++++ src/main.rs | 14 ++++++++++++++ src/templates/admin.tera | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+) diff --git a/src/db.rs b/src/db.rs index d1133a7..1ee5f1f 100644 --- a/src/db.rs +++ b/src/db.rs @@ -73,6 +73,33 @@ pub async fn update_game( execute_stmt(pool, update_query).await } +pub async fn new_game(pool: &Pool, code: String) -> Result { + let insert_game = Query::insert() + .into_table("games") + .columns(["code", "team", "start_time", "end_time"]) + .values_panic([ + code.clone().into(), + "test".into(), + "2011-01-25T03:00:00".into(), + "2011-01-25T08:00:00".into(), + ]) + .take(); + let insert_game = &insert_game.to_string(SqliteQueryBuilder); + let insert_team = Query::insert() + .into_table("teams") + .columns(["game", "team", "color", "player"]) + .values_panic([ + code.into(), + "test".into(), + "#ffffffff".into(), + "test".into(), + ]) + .take(); + let insert_team = &insert_team.to_string(SqliteQueryBuilder); + let _ = execute_stmt(pool, insert_game).await; + execute_stmt(pool, insert_team).await +} + fn get_all_games(conn: Connection, all_teams: HashMap) -> GamesResult { let mut games_stmt = conn.prepare(GAMES_QUERY)?; games_stmt diff --git a/src/main.rs b/src/main.rs index c73cc6c..4b535c9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -69,6 +69,11 @@ struct UpdateGameForm { end_time: String, } +#[derive(Deserialize, Debug)] +struct NewGameForm { + code: String, +} + impl Actor for GamesActor { type Context = actix::Context; } @@ -215,6 +220,14 @@ async fn update_game(pool: web::Data, form: web::Form) -> } } +#[post("/admin/game/new")] +async fn new_game(pool: web::Data, form: web::Form) -> impl Responder { + match db::new_game(&pool, form.code.clone()).await { + Ok(_) => HttpResponse::Ok().body("{}"), + Err(err) => HttpResponse::InternalServerError().body(format!("{err:?}")), + } +} + #[post("/admin/query")] async fn admin_query(pool: web::Data, form: web::Form) -> impl Responder { let res: String; @@ -255,6 +268,7 @@ async fn main() -> std::io::Result<()> { .service(list_of_games) .service(get_territories) .service(update_game) + .service(new_game) }) .bind(("0.0.0.0", 8080))? .run() diff --git a/src/templates/admin.tera b/src/templates/admin.tera index a64c91c..5d7b35c 100644 --- a/src/templates/admin.tera +++ b/src/templates/admin.tera @@ -46,6 +46,10 @@ +
+ + +

@@ -82,10 +86,12 @@ const code_edit = document.getElementById("code_edit"); const query_form = document.getElementById("query_form"); const edit_form = document.getElementById("edit_form"); + const add_game_form = document.getElementById("add_game_form"); games_form.addEventListener("submit", refresh_games); query_form.addEventListener("submit", submit_query); edit_form.addEventListener("submit", submit_edit); + add_game_form.addEventListener("submit", add_game); function submit_query(event) { event.preventDefault(); @@ -109,6 +115,7 @@ console.error("Fetching data failed: ", error); }); } + function submit_edit(event) { event.preventDefault(); fetch("/admin/game/update", { @@ -134,6 +141,7 @@ }); console.log("should handle this"); } + function refresh_games(event) { event.preventDefault(); fetch("/admin/games") @@ -191,18 +199,42 @@ console.error("Fetching data failed:", error); }); } + function showPlayersModal(name, color, players) { td_name.textContent = name; td_color.textContent = color; td_players.textContent = players.map((e)=>e['username']); team_dialog.showModal(); } + function showEditModal(code, start_time, end_time) { code_edit.value = code; start_time_edit.value = start_time; end_time_edit.value = end_time; edit_dialog.showModal() } + + function add_game(event) { + event.preventDefault(); + fetch("/admin/game/new", { + method: "POST", + body: new URLSearchParams({ + 'code': document.getElementById("game_name").value, + }) + }) + .then(res => { + if (!res.ok) { + throw new Error(`Response status: ${res.status}`); + } + return res.json(); + }) + .then((data) => { + console.log(data); + }) + .catch(error => { + console.error("creating game failed: ", error); + }); + }