From 7b1730a48e8e42f0cff8bcbad45fbf22b44a9041 Mon Sep 17 00:00:00 2001
From: "alec.schmidt" <alec.schmidt@etu.hesge.ch>
Date: Wed, 14 Jun 2023 16:45:28 +0200
Subject: [PATCH] refactor table names in db

---
 API/db/app.db                   | Bin 36864 -> 36864 bytes
 API/db/create_db.sql            |  22 ++++++----------
 API/src/database/Database.ts    |  44 ++++++++++++++++----------------
 API/src/socket.io/ServerIO.ts   |  14 ++++------
 Documentation/Documentation.md  |  25 ++++++++++++++++++
 Documentation/db_diagram.drawio |   0
 6 files changed, 60 insertions(+), 45 deletions(-)
 create mode 100644 Documentation/Documentation.md
 create mode 100644 Documentation/db_diagram.drawio

diff --git a/API/db/app.db b/API/db/app.db
index 5941a0ad986c88c613f7c0a0b6db12a51cf60954..7680fd1877fc4b7fcf94bea21b4a1d6b2bfed5da 100644
GIT binary patch
delta 686
zcmZozz|^pSX@WE(%S0JxSr!Jpw3od6KNvW8lo<F;_|Nh^;@!=+o>z^xjYnx?<1%ie
zCPof+acODB=E#!7q?}a8yyEiIqGBk;=^W(h7~-lB;^^e#ssI(7oWQd&I<PdgxFj<_
zuUI29MN`4wPr=32$2G)N!Pzm`+0n(7OEZp*U0hL-v5_5YtaD;XYI=TAW@<5l#g1Y)
zLVR)>uUe`xJDa$>A|pd)UP@|3abZqoNosszX-PhqACFKRZ-`)XG#0Y3i_6P1HXDL1
zg}V{XU`4SqaPnK;`CJJ7lc(@m^1#)`8wO6k$(JP=TAW%`3?`URbcark;qR9ROT-(3
zDP{%+1`Y-W1_oXR1_nm{j|}`DHwzk^<exY}Zt_QYVHQUI9}JrX6n61XoM0x#&MeBA
zn3I|eQp?PLn}Pou{|o-x5cL5p`rORS(u~jmXX0UEmgj^!jDwL`oD*yzNG~J*BL@CQ
zP<{LwGK?$?y0Xrx$(ahN#U%=*c?u<|#U&n@#U=TfMX6k1hrMCoe*@7lK~h1OS(g)C
zImlcl{-+H5U-+Lw6$+^HGBGK;A6}WCUX)mnk(tWH$RvwwEEE3|2L31fUm)rO_$NQ9
iSKwgc|G>cigZ~3WaDub|8xt!7KPRUV8zYG3Fa!YLAkUis

delta 1441
zcmZozz|^pSX@WH4>xnYXvacER(q8iN|6t(YF=XI3;Xljwh<7jFdR`;m9v;KZf&yE)
z^&9Ir*u^C!8JojP5|eUL6Z4A8Q;Q%Zr*n|2V~DFlh@+E_s{%x9ast2M<W`;r#=^;L
zyb2}}Z0zE)vW$()V9m*iC8_E8MU^m`9mN2c=;Q=mH8y>AHgRX!$vwOh&M@(KLl}#r
zF`tE9Twb2BSr=?>VQFe{NoIatF`U7QVshc+*Sz!jV7fI*GD~t&Ckyh5PF~L^#{<_B
zZ&*0_CSR6RX>n>%F_>UNF{QM4av+b%<ca)I>R{P;Lomh6z`(%4z`(%3%fP_E%D<X{
z|0Dl>{xkf0_*ZWh6zJd&H;@+<ElDjdaZJh0%ri7%VBnWzWsnr*aLy>o&rLNnGB)9p
zU}X>&<!~xWECcfe#aS6-MLEI~OHzx{@+&|}1o&AQq(wQyGV_vC^GZM>lRwG}^Re=u
zV&K2Ze~SMN|9$=+n*{}S@Vjs^OEN;tmgHm>X9Sxn!NV-e2s2Ndn^~F>Y7##?vnXd`
zPHHm9_00UY82G>PKjXi(Sy12%zZn-Zvm_%VUafeUnB^JaVWq^$$SlqX_P-=ZCkwv@
z1OHwAnf&?u8k+?LB>3xHl~@?66$49Ca}*Nu(sNQ3Qj1Fz@(!;|PAx7@%q&V(D9A4@
zQb;+xGB>fPD78qTG*7{)G`%<{GbL5QKBOoyIXgEoFEdd?k%hrq9Ar#RszP3VNvcBb
z;gv<1C8-L@sR{)}`B|wY3ickZ0iKRd3M>qzih-q>V4E^?QWdiDOH)gW6cC0f<fJMT
z<dhbJ%t%Sh%*i>tQo+9n**Zm876x5)=ltBH%+x%EwEVmh1w(B^-^7v(kV8u{3rkbE
z7#J8>_=6buU-Jj?_wjGqEGXc_UvJG^%?NTO8J<;AX7&c_#p6Ro3+7TrnBTB?%`p*|
z-xNfcbs5n;B+JWxgMpQQCj<W%{-^xM`FHZ)*(@lqoIjF>l}Qm1Ui>Uf>L`8(d7Yh&
zNgN#Dyi82W?uS?Arxzs_WMrmtF*3<|WEPj?XBMS$@n2(L<=@J{|AhY*{}=uv{988*
z3M}T==VMl6L>SL1$gIwYVm=GV0#Kp_TfjE?Nxg!aAio_0|9Ad({7?C>@t@$|!M~P&
z3IA;V3H+`6HT(tqDf|)q-u!l(1qDR->$$C18N?Ym3@r=}ZBXL2gm8>N94-r122n;%
zOEB9U#O5#sv(3P4LlB$Yl$C*>k;6oh(}a~ln32Oo&s34q7|b-)GgV|a0!y1JvKxXJ
zoMwug24Km6#AF3NeO3lpXGV_Tg2de1%+xFe9z9kDNk$IGw6x3+Uj<%WRt9NCPUpm;
d9Iqlh1$Ir42^=P}>>6N(u`Ihfh{0(j3jl2ipuzwE

diff --git a/API/db/create_db.sql b/API/db/create_db.sql
index 8b5fc2f..e75fd17 100644
--- a/API/db/create_db.sql
+++ b/API/db/create_db.sql
@@ -1,42 +1,36 @@
 PRAGMA foreign_keys = on;
 .mode json
 
-CREATE TABLE users (
+CREATE TABLE Users (
     id INTEGER PRIMARY KEY AUTOINCREMENT,
     username TEXT UNIQUE,
     password TEXT,
     admin BOOLEAN
 );
 
-CREATE TABLE questions (
+CREATE TABLE Questions (
     id INTEGER PRIMARY KEY AUTOINCREMENT,
     question TEXT UNIQUE,
     category TEXT,
-    CONSTRAINT FK_category FOREIGN KEY (category) REFERENCES category(title) ON DELETE CASCADE
+    CONSTRAINT FK_category FOREIGN KEY (category) REFERENCES Categories(title) ON DELETE CASCADE
 );
 
-CREATE TABLE category (
+CREATE TABLE Categories (
     title TEXT PRIMARY KEY UNIQUE
 );
 
-CREATE TABLE answer (
+CREATE TABLE Answers (
     id INTEGER PRIMARY KEY AUTOINCREMENT,
     text_answer TEXT,
     id_question INTEGER,
     correct BOOLEAN,
-    CONSTRAINT FK_question FOREIGN KEY (id_question) REFERENCES questions(id) ON DELETE CASCADE
+    CONSTRAINT FK_question FOREIGN KEY (id_question) REFERENCES Questions(id) ON DELETE CASCADE
 );
 
-CREATE TABLE room (
-    id INTEGER PRIMARY KEY AUTOINCREMENT,
-    name TEXT UNIQUE,
-    
-);
-
-INSERT INTO users (username, password, admin)
+INSERT INTO Users (username, password, admin)
 VALUES ('alec', 'alec', true);
 
-INSERT INTO category (title)
+INSERT INTO Categories (title)
 VALUES ('Histoire'), ('Géographie');
 
 
diff --git a/API/src/database/Database.ts b/API/src/database/Database.ts
index 7354ffe..3ae5e0a 100644
--- a/API/src/database/Database.ts
+++ b/API/src/database/Database.ts
@@ -46,13 +46,13 @@ class DBHandler {
         else
             throw JSON.stringify({message: "Username does not exists"});
         if (okay)
-            return await asyncdb.get("SELECT id, username, admin FROM users WHERE username='" + user.username + "'")
+            return await asyncdb.get("SELECT id, username, admin FROM Users WHERE username='" + user.username + "'")
         else
             throw JSON.stringify({message: "Incorrect Password"});
     }
 
     async verifyUsernameExistence(username:string) : Promise<boolean> {
-        const usernameInDB = await asyncdb.all<User_t>("SELECT username FROM users WHERE username='" + username + "'")
+        const usernameInDB = await asyncdb.all<User_t>("SELECT username FROM Users WHERE username='" + username + "'")
         if (usernameInDB.length == 0)
             return false;
         
@@ -68,19 +68,19 @@ class DBHandler {
     }
 
     async comparePassword(user: User_t) : Promise<boolean> {
-        const query = "SELECT password, admin FROM users WHERE username='"+ user.username + "'";
+        const query = "SELECT password, admin FROM Users WHERE username='"+ user.username + "'";
         const password = await asyncdb.all<User_t>(query)
         return (password[0].password == user.password);
     }
 
     async getUserById(id: number) : Promise<User_t> {
-        const query = "SELECT username, password, admin FROM users WHERE id="+id;
+        const query = "SELECT username, password, admin FROM Users WHERE id="+id;
         const user = await asyncdb.get<User_t>(query);
         return user;
     }
 
     async getUsers(res:express.Response) {
-        const query = "SELECT id, username, admin FROM users";
+        const query = "SELECT id, username, admin FROM Users";
         asyncdb.all(query)
             .then(result => {
                 res.status(StatusCodes.OK).json(result).end()}
@@ -94,7 +94,7 @@ class DBHandler {
         if (a.admin === undefined)
             a.admin = false;
 
-        const query = "INSERT INTO users (username, password, admin) \
+        const query = "INSERT INTO Users (username, password, admin) \
                         VALUES ('" + a.username + "','" + a.password + "'," + a.admin +")";
 
         asyncdb.all(query)
@@ -105,7 +105,7 @@ class DBHandler {
     async updateUser(req:express.Request, res:express.Response) {
         const a = req.body as User_t;
 
-        const request = "UPDATE users \
+        const request = "UPDATE Users \
                         SET username = '"+ a.username + "', admin =" + a.admin + " WHERE id = " + req.params.id;
 
         asyncdb.all(request)
@@ -114,7 +114,7 @@ class DBHandler {
     }
 
     async deleteUser(req:express.Request, res:express.Response) {
-        asyncdb.all("DELETE FROM users WHERE id = " + req.params.id)
+        asyncdb.all("DELETE FROM Users WHERE id = " + req.params.id)
         .then(() => res.status(StatusCodes.OK).end())
         .catch(err => console.log(err));
     }
@@ -122,7 +122,7 @@ class DBHandler {
     async postQuestion(req:express.Request, res:express.Response) {
         const a = req.body as Question_t;
 
-        const insert_question = "INSERT INTO questions (question, category) VALUES ('"+ a.question +"', '"+ a.category +"')";
+        const insert_question = "INSERT INTO Questions (question, category) VALUES ('"+ a.question +"', '"+ a.category +"')";
 
         asyncdb.all(insert_question)
         .then(() => res.status(StatusCodes.OK).end())
@@ -133,11 +133,11 @@ class DBHandler {
         const id = req.params.id;
         
         if (id === undefined) {
-            var query = "SELECT * FROM questions";
+            var query = "SELECT * FROM Questions";
             var questions = await asyncdb.all(query);
         }
         else {
-            query = "SELECT * FROM questions WHERE id =" + id;
+            query = "SELECT * FROM Questions WHERE id =" + id;
             questions = await asyncdb.get(query);
         }
         
@@ -146,7 +146,7 @@ class DBHandler {
 
     async updateQuestion(req:express.Request, res:express.Response){
         const a = req.body as Question_t;
-        const request = "UPDATE questions \
+        const request = "UPDATE Questions \
                         SET question='"+ a.question +"', category='"+ a.category +"' \
                         WHERE id=" + req.params.id;
         
@@ -158,20 +158,20 @@ class DBHandler {
     async deleteQuestion(req:express.Request, res:express.Response) {
         const a = req.body as Question_t;
 
-        asyncdb.all("DELETE FROM questions WHERE id =" + req.params.id)
+        asyncdb.all("DELETE FROM Questions WHERE id =" + req.params.id)
         .then(() => res.status(StatusCodes.OK).end())
         .catch(e => console.log(e));
     }
 
     async getCategories(req:express.Request, res:express.Response) {
-        asyncdb.all("SELECT * FROM category")
+        asyncdb.all("SELECT * FROM Categories")
         .then(result => res.status(StatusCodes.OK).json(result).end())
         .catch(e => console.log(e));
     }
 
     async postCategory(req:express.Request, res:express.Response) {
         const a = req.body as Category_t;
-        const request = "INSERT INTO Category VALUES ('" + a.category + "');"
+        const request = "INSERT INTO Categories VALUES ('" + a.category + "');"
 
         asyncdb.all(request)
         .then(() => res.status(StatusCodes.OK).end())
@@ -180,7 +180,7 @@ class DBHandler {
 
     async deleteCategory(req:express.Request, res:express.Response) {
         const category = req.params.category;
-        const request = "DELETE FROM category WHERE title = '" + category + "'";
+        const request = "DELETE FROM Categories WHERE title = '" + category + "'";
         asyncdb.all(request)
         .then(() => res.status(StatusCodes.OK).end())
         .catch(e => console.log(e));
@@ -189,7 +189,7 @@ class DBHandler {
     async getAnwsers(req:express.Request, res:express.Response) {
         const question_id = req.params.questionId;
 
-        const query = "SELECT * FROM answer WHERE id_question=" + question_id;
+        const query = "SELECT * FROM Answers WHERE id_question=" + question_id;
 
         asyncdb.all(query)
         .then(ans => res.status(StatusCodes.OK).json(ans))
@@ -198,7 +198,7 @@ class DBHandler {
     async postAnwsers(req:express.Request, res:express.Response) {
         const answer = req.body as Answer_t;
 
-        const query = "INSERT INTO answer (text_answer, id_question, correct) \
+        const query = "INSERT INTO Answers (text_answer, id_question, correct) \
                         VALUES ('" + answer.text_answer + "', " + answer.id_question + ", " + answer.correct + ")";
 
         asyncdb.all(query)
@@ -206,7 +206,7 @@ class DBHandler {
     }
 
     async deleteAnswer(req:express.Request, res:express.Response) {
-        const query = "DELETE from answer WHERE id=" + req.params.id;
+        const query = "DELETE from Answers WHERE id=" + req.params.id;
 
         asyncdb.all(query)
         .then(() => res.status(StatusCodes.OK).end())
@@ -214,7 +214,7 @@ class DBHandler {
 
     async updateAnswer(req:express.Request, res:express.Response) {
         const a = req.body as Answer_t;
-        const request = "UPDATE answer \
+        const request = "UPDATE Answers \
                         SET text_answer='"+ a.text_answer +"', correct="+ a.correct + " \
                         WHERE id=" + req.params.id;
         
@@ -225,13 +225,13 @@ class DBHandler {
     }
 
     async getQuestionsForGame() {
-        const query = "SELECT * FROM questions ORDER BY RANDOM() LIMIT 10;";
+        const query = "SELECT * FROM Questions ORDER BY RANDOM() LIMIT 10;";
         let questions = await asyncdb.all(query);
         return questions;
     }
 
     async getAnswersForGame(question_id: number) {
-        const query = "SELECT * FROM answer WHERE id_question= " + question_id + " ORDER BY RANDOM();";
+        const query = "SELECT * FROM Answers WHERE id_question= " + question_id + " ORDER BY RANDOM();";
 
         const answers = await asyncdb.all(query);
         console.log(answers);
diff --git a/API/src/socket.io/ServerIO.ts b/API/src/socket.io/ServerIO.ts
index 48e98e2..a2d874e 100644
--- a/API/src/socket.io/ServerIO.ts
+++ b/API/src/socket.io/ServerIO.ts
@@ -39,12 +39,10 @@ class ServerIO extends IO.Server {
             if (this.gameOngoing)
                 return socket.emit('Room Full');
 
-            const token = socket.handshake.query.Authorization as string; 
-
-            console.log(token);
+            const token = socket.handshake.query.Authorization as string;
 
             var user: User_t = this.decodeToken(token);
-            
+
             logger.info(user.username + ` joined the game`);
             this.playerList.push(user.username);
             
@@ -64,6 +62,7 @@ class ServerIO extends IO.Server {
 
             var index: number = this.playerList.indexOf(user.username, 0);
             
+            delete this.scoreboard[user.username]
             
             if (index != -1) {
                 this.playerList.splice(index, 1);
@@ -73,8 +72,7 @@ class ServerIO extends IO.Server {
             if (this.gameOngoing)
                 this.gameEnd();
 
-            socket.emit('Players Waiting', this.playerList.length)
-            socket.broadcast.emit('Players Waiting', this.playerList.length);
+            this.emit('Players Waiting', this.playerList.length);
         })
 
         socket.on('disconnect', _ => {
@@ -138,8 +136,6 @@ class ServerIO extends IO.Server {
 
         if (this.questions.length == 0)
             return this.gameEnd()
-
-        console.log(this.scoreboard)
         
         let currentQuestion = this.questions.pop()
 
@@ -161,7 +157,7 @@ class ServerIO extends IO.Server {
         this.playerList = [];
         this.scoreboard = {};
         
-        this.emit('Players Waiting', this.playerList.length)
+        this.emit('Players Waiting', this.playerList.length);
         this.gameOngoing = false;
     }
 
diff --git a/Documentation/Documentation.md b/Documentation/Documentation.md
new file mode 100644
index 0000000..511d11d
--- /dev/null
+++ b/Documentation/Documentation.md
@@ -0,0 +1,25 @@
+# Application Web style Question pour un Champion
+
+---
+
+### Introduction
+
+Dans le cadre des cours Architecture Web et Application Web, nous avons du créer un site web permettant à des joueurs de s'inscrire, puis de participer à des parties de jeu contre deux autres joueurs.
+
+Le projet se sépare donc en trois parties distinctes :
+- L'API REST du projet
+- Le visuel du site
+- Le système de jeu à l'aide de WebSockets.
+
+Cette documentation va se porter sur ces parties du projet, en détaillant les aspects techniques ainsi que des requis pour pouvoir les lancer.
+
+---
+
+### API REST
+
+L'API REST va être celle qui va faire le lien entre la base de données et les utilisateurs. Avec ses routes, on peut y effectuer toutes les actions du CRUD sur notre db.
+
+
+##### Database
+
+Pour ce projet, on avait commencé par garder les données "In Memory". Très vite, on a rencontré des problèmes majeurs, comme la persistence des données, ou simplement les actions sur celles-ci.
\ No newline at end of file
diff --git a/Documentation/db_diagram.drawio b/Documentation/db_diagram.drawio
new file mode 100644
index 0000000..e69de29
-- 
GitLab