express: ready for voting, but the /results display is not good

Signed-off-by: Vincent Batts <vbatts@hashbangbash.com>
This commit is contained in:
Vincent Batts 2023-09-15 09:37:35 -04:00
parent e3150bd53b
commit 5c4e28e2de
Signed by: vbatts
GPG key ID: E30EFAA812C6E5ED
4 changed files with 83 additions and 5 deletions

View file

@ -30,7 +30,10 @@ function getSessionId() {
}
function clearSessionId() {
document.cookie = ``;
const newSessionId = generateSessionId();
document.cookie = `sessionId=${newSessionId}`;
setSessionStartTime();
getSessionId();
}
// Function to set session start time
@ -58,6 +61,7 @@ document.getElementById('isNotCritterButton').addEventListener('click', () => {
document.getElementById('startOverButton').addEventListener('click', () => {
clearSessionId();
getNextAnimal();
});
// Function to record button clicks on the server
@ -68,12 +72,14 @@ async function recordButtonClick(buttonName, sessionId) {
const timeDifference = currentTime - lastButtonClickTime;
// Include the time difference in the POST request data
const animal = document.getElementById('animal-name').textContent;
const bodyData = JSON.stringify({ "animal": animal, "button": buttonName, "session": sessionId, "difference": timeDifference, "time": sessionStartTime });
console.log(bodyData);
await fetch('/recordButtonClick', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ "animal": animal, "button": buttonName, "session": sessionId, "difference": timeDifference, "time": sessionStartTime }),
body: bodyData,
});
}
lastButtonClickTime = currentTime; // Record the timestamp of the button click

View file

@ -11,6 +11,7 @@
"dependencies": {
"body-parser": "^1.20.2",
"express": "^4.18.2",
"morgan": "^1.10.0",
"sqlite3": "^5.1.6"
}
},
@ -181,6 +182,22 @@
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
},
"node_modules/basic-auth": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",
"integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==",
"dependencies": {
"safe-buffer": "5.1.2"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/basic-auth/node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
"node_modules/body-parser": {
"version": "1.20.2",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
@ -1066,6 +1083,32 @@
"node": ">=10"
}
},
"node_modules/morgan": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz",
"integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==",
"dependencies": {
"basic-auth": "~2.0.1",
"debug": "2.6.9",
"depd": "~2.0.0",
"on-finished": "~2.3.0",
"on-headers": "~1.0.2"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/morgan/node_modules/on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
"integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
"dependencies": {
"ee-first": "1.1.1"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
@ -1226,6 +1269,14 @@
"node": ">= 0.8"
}
},
"node_modules/on-headers": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
"integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",

View file

@ -16,6 +16,7 @@
"dependencies": {
"body-parser": "^1.20.2",
"express": "^4.18.2",
"morgan": "^1.10.0",
"sqlite3": "^5.1.6"
}
}

View file

@ -1,4 +1,6 @@
const express = require('express');
const fs = require('fs');
const morgan = require('morgan');
const bodyParser = require('body-parser');
const sqlite3 = require('sqlite3').verbose();
const app = express();
@ -24,6 +26,23 @@ const db = new sqlite3.Database('db/results.db', (err) => {
});
app.use(bodyParser.json());
app.use(morgan('combined'));
var animals;
// check and load animals into redis
try {
fs.readFile("./animals.json", function (err, data) {
if (err) {
throw err;
}
var jsondata = JSON.parse(data);
animals = jsondata.animals;
});
} catch (error) {
console.error('Error loading animals:', error);
animals = ['Dog', 'Cat', 'Elephant', 'Lion', 'Giraffe'];
}
// Serve the HTML file
app.get('/', (req, res) => {
@ -37,7 +56,6 @@ app.get('/asset/frontend.js', (req, res) => {
app.get('/getNextAnimal', async (req, res) => {
try {
// TODO this is currently random, and should have a bit of reasoning behind the next choice
const animals = ['Dog', 'Cat', 'Elephant', 'Lion', 'Giraffe'];
const randomIndex = Math.floor(Math.random() * animals.length);
const randomAnimal = animals[randomIndex];
res.json({ animalName: randomAnimal });
@ -50,9 +68,11 @@ app.get('/getNextAnimal', async (req, res) => {
// Route to record button clicks along with session IDs in SQLite
app.post('/recordButtonClick', (req, res) => {
try {
const { buttonName, sessionId } = req.body;
//const { buttonName, sessionId } = req.body;
const result = req.body;
console.error(result);
db.run('INSERT INTO button_clicks (session_id, button_name) VALUES (?, ?)', [sessionId, buttonName], (err) => {
db.run('INSERT INTO button_clicks (session_id, animal_name, button_name, timestamp, time_difference) VALUES (?, ?, ?, ?, ?)', [result.session, result.animal, result.button, result.time, result.difference], (err) => {
if (err) {
console.error('Error recording button click:', err.message);
res.status(500).json({ error: 'Internal server error' });