From c07a304562513f551ac44eee3d13813d0137f4e8 Mon Sep 17 00:00:00 2001 From: AINDUSTRIES Date: Fri, 4 Oct 2024 22:49:51 +0200 Subject: [PATCH] Votes div remains to have date displayed per vote --- src/main.rs | 100 ++++++++++++++++++++++++++++++++++++++--- static/html/admin.html | 6 +++ static/js/admin.js | 48 ++++++++++++++++++++ 3 files changed, 147 insertions(+), 7 deletions(-) diff --git a/src/main.rs b/src/main.rs index a5b71f1..78b506e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -68,6 +68,7 @@ struct Player { #[derive(Serialize, Deserialize)] struct Vote { + id: i64, plus_player_id: i64, plus_nickname: String, plus_reason: String, @@ -282,6 +283,7 @@ async fn get_votes(req: &Request, db: Arc>) -> Vec { + let pool = db.clone().lock().unwrap().clone(); + let votes = sqlx::query!(r#"SELECT * FROM votes"#) + .fetch_all(&pool) + .await + .unwrap(); + let votes: Vec = votes + .iter() + .map(|x| Vote { + id: x.id, + plus_player_id: x.plus_player_id, + plus_nickname: x.plus_nickname.clone(), + plus_reason: x.plus_reason.clone(), + minus_player_id: x.minus_player_id, + minus_nickname: x.minus_nickname.clone(), + minus_reason: x.minus_reason.clone(), + }) + .collect(); + let stringed = serde_json::to_string(&votes).unwrap_or("".to_string()); + Ok(Response::builder().body(Body::new(stringed)).unwrap()) + } _ => not_found().await, } } @@ -382,7 +405,10 @@ async fn post_vote( ok().await } -async fn post_player(req: Request, db: Arc>) -> Result, Error> { +async fn post_player( + req: Request, + db: Arc>, +) -> Result, Error> { let data = req_json::(req).await; if data.is_none() { return bad_request().await; @@ -391,19 +417,37 @@ async fn post_player(req: Request, db: Arc>) -> Resu let name = data.get("name").unwrap().as_str().unwrap(); let pool = db.clone().lock().unwrap().clone(); let mut conn = pool.acquire().await.unwrap(); - if let Ok(Some(player)) = sqlx::query!(r#"SELECT * FROM players WHERE name = ?1"#, name).fetch_optional(&pool).await { - let player = Player{id: player.id, name: player.name}; - return Ok(Response::builder().body(Body::new(serde_json::to_string(&player).unwrap())).unwrap()); + if let Ok(Some(player)) = sqlx::query!(r#"SELECT * FROM players WHERE name = ?1"#, name) + .fetch_optional(&pool) + .await + { + let player = Player { + id: player.id, + name: player.name, + }; + return Ok(Response::builder() + .body(Body::new(serde_json::to_string(&player).unwrap())) + .unwrap()); } - let r = sqlx::query!(r#"INSERT INTO players (name) VALUES (?1) RETURNING id"#, name).fetch_one(&mut *conn).await; + let r = sqlx::query!( + r#"INSERT INTO players (name) VALUES (?1) RETURNING id"#, + name + ) + .fetch_one(&mut *conn) + .await; if r.is_err() { return Ok(Response::builder() .status(StatusCode::INTERNAL_SERVER_ERROR) .body(Body::Empty) .unwrap()); } - let player = Player{id: r.unwrap().id, name: name.to_string()}; - Ok(Response::builder().body(Body::new(serde_json::to_string(&player).unwrap())).unwrap()) + let player = Player { + id: r.unwrap().id, + name: name.to_string(), + }; + Ok(Response::builder() + .body(Body::new(serde_json::to_string(&player).unwrap())) + .unwrap()) } async fn post_admin( @@ -504,6 +548,48 @@ async fn post_admin( } _ => bad_request().await, }, + "/admin/edit/vote" => match req_json::(req).await { + Some(vote) => { + let pool = db.clone().lock().unwrap().clone(); + let _ = sqlx::query!( + r#"UPDATE votes + SET plus_player_id = ?1, + plus_nickname = ?2, + plus_reason = ?3, + minus_player_id = ?4, + minus_nickname = ?5, + minus_reason = ?6 + WHERE id = ?7"#, + vote.plus_player_id, + vote.plus_nickname, + vote.plus_reason, + vote.minus_player_id, + vote.minus_nickname, + vote.minus_reason, + vote.id + ) + .execute(&pool) + .await; + ok().await + } + _ => bad_request().await, + }, + "/admin/delete/vote" => match req_json::(req).await { + Some(Value::Object(vote)) => { + let id = vote.get("id"); + if id.is_none() { + return bad_request().await; + } + let pool = db.clone().lock().unwrap().clone(); + let mut conn = pool.acquire().await.unwrap(); + let id = id.unwrap().as_i64().unwrap(); + let _ = sqlx::query!(r#"DELETE FROM votes WHERE id = ?1"#, id) + .execute(&mut *conn) + .await; + ok().await + } + _ => bad_request().await, + } _ => bad_request().await, } } diff --git a/static/html/admin.html b/static/html/admin.html index 6cca1a8..0fc3176 100644 --- a/static/html/admin.html +++ b/static/html/admin.html @@ -20,5 +20,11 @@

id, name

+
+

Votes

+

+

id, plus_id, plus_nickname, plus_reason, minus_id, minus_nickname, minus_reason

+
+
\ No newline at end of file diff --git a/static/js/admin.js b/static/js/admin.js index bf8dbf1..6f72061 100644 --- a/static/js/admin.js +++ b/static/js/admin.js @@ -67,6 +67,54 @@ async function run() { }) }) playersDiv.parentNode.append(newPlayer); + + let votes = await fetch("/admin/votes").then(r => r.json()); + let today = document.getElementById("votes_number"); + let count = await fetch("/data/votes").then(r => r.json()); + today.textContent = `Aujourd'hui il y a ${count.length} votes`; + let votesDiv = document.getElementById("votes"); + + for (let i=0; i { + await fetch("/admin/edit/vote", {method: "POST", body: JSON.stringify({"id": votes[i]["id"], + "plus_player_id": parseInt(plus_id.value), + "plus_nickname": plus_nickname.value, + "plus_reason": plus_reason.value, + "minus_player_id": parseInt(minus_id.value), + "minus_nickname": minus_nickname.value, + "minus_reason": minus_reason.value})}); + window.location.reload(); + }) + del.addEventListener("click", async () => { + await fetch("/admin/delete/vote", {method:"POST", body: JSON.stringify({"id": votes[i]["id"]})}); + window.location.reload(); + }) + } } let _ = run(); \ No newline at end of file