diff --git a/migrations/20240914120528_create_tables.sql b/migrations/20240914120528_create_tables.sql index 9faff80..bc3858a 100644 --- a/migrations/20240914120528_create_tables.sql +++ b/migrations/20240914120528_create_tables.sql @@ -7,8 +7,10 @@ CREATE TABLE IF NOT EXISTS votes ( id INTEGER PRIMARY KEY NOT NULL, submit_date TEXT NOT NULL, - player_id INTEGER NOT NULL, - nickname TEXT NOT NULL, - reason TEXT NOT NULL, - is_plus BOOLEAN NOT NULL DEFAULT 0 + plus_player_id INTEGER NOT NULL, + plus_nickname TEXT NOT NULL, + plus_reason TEXT NOT NULL, + minus_player_id INTEGER NOT NULL, + minus_nickname TEXT NOT NULL, + minus_reason TEXT NOT NULL ) \ No newline at end of file diff --git a/routes.json b/routes.json index 53057cb..f6b9bdc 100644 --- a/routes.json +++ b/routes.json @@ -1,5 +1,6 @@ { "/": "static/html/index.html", "/results": "static/html/results.html", - "/archives": "static/html/archives.html" + "/archives": "static/html/archives.html", + "/favicon.ico": "static/img/favicon.ico" } \ No newline at end of file diff --git a/settings.json b/settings.json index 5b6203f..0670620 100644 --- a/settings.json +++ b/settings.json @@ -1,4 +1,4 @@ { "database_url": "sqlite:vote.db", - "bind_address": "127.0.0.1:8080" + "bind_address": "127.0.0.1:8000" } \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 1662545..4ade1f6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -31,10 +31,12 @@ struct Player { #[derive(Serialize, Deserialize, Debug)] struct Vote { - player_id: i64, - nickname: String, - reason: String, - is_plus: bool, + plus_player_id: i64, + plus_nickname: String, + plus_reason: String, + minus_player_id: i64, + minus_nickname: String, + minus_reason: String, } #[derive(Serialize, Deserialize)] @@ -109,25 +111,23 @@ async fn get_data(path: &str, req: &Request, db: Arc } "/data/results" => { let votes = get_votes(req, db).await; - let ids: Vec<(i64, bool)> = votes.iter().map(|x| (x.player_id, x.is_plus)).collect(); + let ids: Vec<(i64, i64)> = votes.iter().map(|x| (x.plus_player_id, x.minus_player_id)).collect(); let mut plus_results: HashMap = HashMap::new(); let mut minus_results: HashMap = HashMap::new(); - let _ = ids.iter().filter(|x| x.1).for_each(|x| { - let id = x.0; - if plus_results.contains_key(&id) { - plus_results.insert(id, 0); + let _ = ids.iter().for_each(|x| { + let plus_id = x.0; + if !plus_results.contains_key(&plus_id) { + plus_results.insert(plus_id, 0); } - *plus_results.get_mut(&id).unwrap() += 1; - }); + *plus_results.get_mut(&plus_id).unwrap() += 1; - let _ = ids.iter().filter(|x| !x.1).for_each(|x| { - let id = x.0; - if minus_results.contains_key(&id) { - minus_results.insert(id, 0); + let minus_id = x.1; + if !minus_results.contains_key(&minus_id) { + minus_results.insert(minus_id, 0); } - *minus_results.get_mut(&id).unwrap() += 1; + *minus_results.get_mut(&minus_id).unwrap() += 1; }); let mut plus_results: Vec<(i64, i64)> = plus_results.into_iter().collect(); @@ -164,13 +164,15 @@ async fn get_votes(req: &Request, db: Arc>) -> Vec, db: Arc>) -> Result { const player_option = document.createElement("option"); player_option.value = player["id"]; player_option.innerText = player["name"]; - vote_id_select.appendChild(player_option); + id_select.appendChild(player_option); }) if (id) { - vote_id_select.value = Vote.vote_moins_id; - vote_nickname_input.value = Vote.vote_moins_nickname; - vote_reason_input.value = Vote.vote_moins_reason; + id_select.value = Vote.minus_player_id; + nickname_input.value = Vote.minus_nickname; + reason_input.value = Vote.minus_reason; header.textContent = "Vote -"; let previous = document.createElement("button"); previous.textContent = "Précédent"; previous.addEventListener("click", () => { - Vote.vote_moins_id = vote_id_select.value; - Vote.vote_moins_nickname = vote_nickname_input.value; - Vote.vote_moins_reason = vote_reason_input.value; + Vote.minus_player_id = id_select.value; + Vote.minus_nickname = nickname_input.value; + Vote.minus_reason = reason_input.value; load_page(0) }); let submit = document.createElement("button"); submit.textContent = "A Voté"; submit.addEventListener("click", async () => { - if (vote.vote_plus_id === null || vote.vote_moins_id === null) { + if (Vote.plus_id === null || id_select.value === "") { const popUp = document.createElement("div"); popUp.className = "popup"; const message = document.createElement("h2"); @@ -65,9 +65,9 @@ async function load_page(id) { popUp.append(message); page.append(popUp); } else { - Vote.vote_moins_id = vote_id_select.value; - Vote.vote_moins_nickname = vote_nickname_input.value; - Vote.vote_moins_reason = vote_reason_input.value; + Vote.minus_player_id = id_select.value; + Vote.minus_nickname = nickname_input.value; + Vote.minus_reason = reason_input.value; if (await send_vote(Vote)) { confirm_popup(); save_state(); @@ -78,16 +78,16 @@ async function load_page(id) { previous.className = "left"; buttons.append(previous, submit); } else { - vote_id_select.value = Vote.vote_plus_id; - vote_nickname_input.value = Vote.vote_plus_nickname; - vote_reason_input.value = Vote.vote_plus_reason; + id_select.value = Vote.plus_player_id; + nickname_input.value = Vote.plus_nickname; + reason_input.value = Vote.plus_reason; header.textContent = "Vote +"; let next = document.createElement("button"); next.innerText = "Suivant"; next.addEventListener("click", () => { - Vote.vote_plus_id = vote_id_select.value; - Vote.vote_plus_nickname = vote_nickname_input.value; - Vote.vote_plus_reason = vote_reason_input.value; + Vote.plus_player_id = id_select.value; + Vote.plus_nickname = nickname_input.value; + Vote.plus_reason = reason_input.value; load_page(1) }); next.className = "right"; @@ -97,7 +97,7 @@ async function load_page(id) { const div = document.getElementById("app"); div.innerHTML = ""; - div.append(header, vote_id, vote_id_select, vote_nickname, vote_nickname_input, vote_reason, vote_reason_input, buttons); + div.append(header, idlbl, id_select, nickname, nickname_input, reason, reason_input, buttons); } function confirm_popup() { @@ -124,8 +124,8 @@ function get_state() { return cookie.includes("hasvoted=true"); } async function send_vote(vote) { - vote.vote_plus_id = parseInt(vote.vote_plus_id, 10); - vote.vote_moins_id = parseInt(vote.vote_moins_id, 10); + vote.plus_player_id = parseInt(vote.plus_player_id, 10); + vote.minus_player_id = parseInt(vote.minus_player_id, 10); let body = JSON.stringify(vote); let result = await fetch(window.location.href + "post", {method: "POST", body: body}).then(r => r.status); return result === 200; diff --git a/static/js/results.js b/static/js/results.js index 08077b4..1ba4192 100644 --- a/static/js/results.js +++ b/static/js/results.js @@ -23,42 +23,42 @@ function show_plus(id, votes, players) { const app = document.getElementById("app"); app.innerHTML = ""; let vote = votes[id]; - let player = players[vote["vote_plus_id"] - 1]["name"]; - let nickname = vote["vote_plus_nickname"]; - let reason = vote["vote_plus_reason"]; - let moins = document.createElement("button"); - moins.textContent = "Et en moins..." - moins.addEventListener("click", () => {show_moins(id, votes, players)}) - moins.className = "right"; + let player = players[vote["plus_player_id"] - 1]["name"]; + let nickname = vote["plus_nickname"]; + let reason = vote["plus_reason"]; + let minus = document.createElement("button"); + minus.textContent = "Et en moins..." + minus.addEventListener("click", () => {show_minus(id, votes, players)}) + minus.className = "right"; - const vote_p = document.createElement("h2"); + const p = document.createElement("h2"); if (nickname === "") { - vote_p.innerHTML = `${player}`; + p.innerHTML = `${player}`; } else { - vote_p.innerHTML = `${nickname} (${player})` + p.innerHTML = `${nickname} (${player})` } - const vote_r = document.createElement("p"); - vote_r.textContent = reason; + const r = document.createElement("p"); + r.textContent = reason; const head = document.createElement("h1"); head.innerText = "EN PLUS"; const buttons = document.createElement("div"); buttons.className = "buttons"; - buttons.append(moins) + buttons.append(minus) - app.append(head, vote_p, vote_r, buttons); + app.append(head, p, r, buttons); } -function show_moins(id, votes, players) { +function show_minus(id, votes, players) { const app = document.getElementById("app"); app.innerHTML = ""; let vote = votes[id]; - let nickname = vote["vote_moins_nickname"]; - let reason = vote["vote_moins_reason"]; - let player = players[vote["vote_moins_id"] - 1]["name"]; + let nickname = vote["minus_nickname"]; + let reason = vote["minus_reason"]; + let player = players[vote["minus_player_id"] - 1]["name"]; let next = document.createElement("button"); if (id === votes.length - 1) { next.textContent = "Résultats"; @@ -74,16 +74,16 @@ function show_moins(id, votes, players) { }) next.className = "right"; - const vote_p = document.createElement("h2"); + const p = document.createElement("h2"); if (nickname === "") { - vote_p.innerHTML = `${player}`; + p.innerHTML = `${player}`; } else { - vote_p.innerHTML = `${nickname} (${player})` + p.innerHTML = `${nickname} (${player})` } - const vote_r = document.createElement("p"); - vote_r.textContent = reason; + const r = document.createElement("p"); + r.textContent = reason; const head = document.createElement("h1"); head.innerText = "EN MOINS"; @@ -92,7 +92,7 @@ function show_moins(id, votes, players) { buttons.className = "buttons"; buttons.append(next) - app.append(head, vote_p, vote_r, buttons); + app.append(head, p, r, buttons); } async function show_results(players) { @@ -107,7 +107,7 @@ async function show_results(players) { app.append(vp); let results = await fetch("data/results").then(r => r.json()); let plus = results[0]; - let moins = results[1]; + let minus = results[1]; let prev_score = null; let counter = 0; for (let i = 0; i < plus.length; i++) { @@ -132,8 +132,8 @@ async function show_results(players) { app.append(vm); prev_score = null; counter = 0; - for (let i = 0; i < moins.length; i++) { - let p = moins[i]; + for (let i = 0; i < minus.length; i++) { + let p = minus[i]; let player = players[p[0] - 1]["name"]; let score = p[1]; if (prev_score == null || score < prev_score) {