diff --git a/api/Classes/Games.js b/api/Classes/Games.js index 52d8df1..46e20c6 100644 --- a/api/Classes/Games.js +++ b/api/Classes/Games.js @@ -47,9 +47,10 @@ class Game { const [rows] = await pool.execute( 'SELECT * FROM questions ORDER BY RAND() LIMIT 10 WHERE theme = ?', [themeId], ); - rows.forEach(row => { + rows.forEach(async row => { const question = new Question(row.id, row.question); this.questions.push(question); + await pool.execute('INSERT INTO games_questions (game, question) VALUES (?, ?)', [this.id, row.id]); }); return true; } @@ -67,6 +68,28 @@ class Question { this.answers = []; } + async get() { + try { + const [rows] = await pool.execute( + 'SELECT * FROM questions WHERE id = ? LIMIT 1', [this.id], + ); + if (!rows.length) return false; + this.question = rows[0].question; + const [answers] = await pool.execute( + 'SELECT * FROM answers WHERE question = ?', [this.id], + ); + answers.forEach(a => { + const answer = new Answer(a.id, a.answer, a.correct); + this.answers.push(answer); + }); + return true; + } + catch (error) { + console.error(error); + return false; + } + } + async fetchAnswers() { try { const [rows] = await pool.execute( @@ -107,4 +130,4 @@ class Answer { } } -export { Game }; \ No newline at end of file +export { Game, Question, Answer }; \ No newline at end of file diff --git a/api/database.sql b/api/database.sql index 6c0ab08..68667a8 100644 --- a/api/database.sql +++ b/api/database.sql @@ -23,13 +23,13 @@ CREATE TABLE games ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, player INT UNSIGNED NOT NULL, PRIMARY KEY (id), - INDEX g_player_idx (player), + INDEX g_player_idx (player) ) ENGINE=InnoDB; CREATE TABLE themes ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, theme VARCHAR(255) NOT NULL, - PRIMARY KEY (id), + PRIMARY KEY (id) ) ENGINE=InnoDB; CREATE TABLE questions ( @@ -37,7 +37,7 @@ CREATE TABLE questions ( theme INT UNSIGNED NOT NULL, question VARCHAR(255) NOT NULL, PRIMARY KEY (id), - INDEX q_theme_idx (theme), + INDEX q_theme_idx (theme) ) ENGINE=InnoDB; CREATE TABLE answers ( @@ -46,5 +46,15 @@ CREATE TABLE answers ( answer VARCHAR(255) NOT NULL, correct BOOLEAN NOT NULL DEFAULT FALSE, PRIMARY KEY (id), - INDEX a_question_idx (question), + INDEX a_question_idx (question) +) ENGINE=InnoDB; + +CREATE TABLE game_questions ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT, + game INT UNSIGNED NOT NULL, + question INT UNSIGNED NOT NULL, + score INT UNSIGNED, + PRIMARY KEY (id), + INDEX gq_game_idx (game), + INDEX gq_question_idx (question) ) ENGINE=InnoDB; \ No newline at end of file diff --git a/api/routes/games.js b/api/routes/games.js index 1db9f16..803d479 100644 --- a/api/routes/games.js +++ b/api/routes/games.js @@ -1,7 +1,8 @@ import express from 'express'; +import { pool } from '../modules/database.js'; import { verifyToken } from '../modules/token.js'; -import { respondWithStatusJSON } from '../modules/requestHandler.js'; -import { Game } from '../Classes/Games.js'; +import { respondWithStatus, respondWithStatusJSON } from '../modules/requestHandler.js'; +import { Game, Question } from '../Classes/Games.js'; const router = express.Router(); @@ -16,12 +17,18 @@ router.post('/create/:theme', verifyToken, async (req, res) => { }); router.post('/verify/:game', verifyToken, async (req, res) => { + const [rows] = await pool.execute( + 'SELECT * FROM games WHERE id = ? AND player = ? LIMIT 1', [req.params.game, req.userId], + ); + if (!rows.length) return await respondWithStatus(res, 404, 'Game not found'); const { question, answer } = req.body; - const game = new Game(req.params.game, req.userId); - await game.get(); - - const foundQuestion = game.questions.find(q => q.id === question); - if (foundQuestion && foundQuestion.verifyAnswer(answer)) { + if (![question, answer].every(Boolean)) return await respondWithStatus(res, 400, 'Missing fields'); + const q = new Question(question); + const [gameQuestions] = await pool.execute('SELECT * FROM game_questions WHERE game = ? AND question = ?', [req.params.game, question]); + if (!gameQuestions.length) return await respondWithStatus(res, 404, 'Question not found'); + if (gameQuestions[0].score) return await respondWithStatus(res, 400, 'Question already answered'); + if (q.verifyAnswer(answer)) { + await pool.execute('UPDATE game_questions SET score = 1 WHERE game = ? AND question = ?', [req.params.game, question]); res.status(200).json({ message: 'Answer is correct', });