diff --git a/Dockerfile b/Dockerfile index 8f113c4..dd44c71 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,6 +3,6 @@ WORKDIR /usr/src/app COPY package*.json ./ RUN npm install COPY . . -RUN sed -i '1i\' ./public/index.html -EXPOSE 8081 +#RUN sed -i '1i\' ./public/index.html +EXPOSE 8080 CMD ["node", "index.js"] \ No newline at end of file diff --git a/database.js b/database.js new file mode 100644 index 0000000..1fdb3ed --- /dev/null +++ b/database.js @@ -0,0 +1,18 @@ +const mysql = require("mysql"); + +const connection = mysql.createConnection({ + host: process.env.DB_HOST || 'localhost', + user: process.env.DB_USER || 'vinz', + password: process.env.DB_PASSWORD || '19735', + database: process.env.DB_NAME || 'maettleship' +}); + +connection.connect((err) => { + if (err) { + console.error('Error connecting to the database:', err); + return; + } + console.log('Connected to the MySQL database'); +}); + +module.exports = connection; \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 9f5e786..5af5cb8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,9 +5,30 @@ services: context: . dockerfile: Dockerfile ports: - - "8081:8081" + - "8080:8080" volumes: - .:/usr/src/app - /usr/src/app/node_modules environment: - - NODE_ENV=production \ No newline at end of file + - NODE_ENV=production + - DB_HOST=db + - DB_USER=root + - DB_PASSWORD=password + - DB_NAME=myapp + depends_on: + - db + + db: + platform: linux/x86_64 + image: mysql:5.7 + restart: always + environment: + MYSQL_ROOT_PASSWORD: password + MYSQL_DATABASE: myapp + ports: + - "3306:3306" + volumes: + - db_data:/var/lib/mysql + +volumes: + db_data: \ No newline at end of file diff --git a/index.js b/index.js index a8c2edf..ca3e8c8 100644 --- a/index.js +++ b/index.js @@ -3,11 +3,42 @@ const app = express(); const http = require("http").Server(app); const io = require("socket.io")(http); const port = 8080; +const db = require("./database.js") -app.use(express.static("public")); +const bodyParser = require("body-parser"); +const path = require("path"); + +app.use(express.static("public")) +app.use(express.json()); const { Player } = require(`${__dirname}/businesses/Player.js`); +app.get('/', (req, res) => { + res.sendFile(path.join(__dirname, '/public/index.html')) +}) + +app.get('/register', (req, res) => { + res.sendFile(path.join(__dirname, '/public/pages/connectionView.html')) +}) + +app.post('/register', (req, res) => { + const { pseudo, password } = req.body; + + if (!pseudo || !password) { + return res.status(400).send('Email and password are required.'); + } + + const query = 'INSERT INTO users (pseudo, password) VALUES (?, ?)'; + db.execute(query, [pseudo, password], (err, results) => { + if (err) { + console.error('Error inserting user into the database:', err); + return res.status(500).send('Internal server error.'); + } + + res.status(201).send('User registered successfully.'); + }) +}); + let rooms = []; let players = []; @@ -240,7 +271,6 @@ class Room { } } - http.listen(port, () => { console.log(`Listening on http://localhost:${port}`); }); diff --git a/package-lock.json b/package-lock.json index 8098202..1847c6b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,9 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "body-parser": "^1.20.2", "express": "^4.19.2", + "mysql": "^2.18.1", "socket.io": "^4.7.5", "uuid": "^9.0.1" } @@ -65,6 +67,14 @@ "node": "^4.5.0 || >= 5.9" } }, + "node_modules/bignumber.js": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", + "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==", + "engines": { + "node": "*" + } + }, "node_modules/body-parser": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", @@ -146,6 +156,11 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, "node_modules/cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -495,6 +510,11 @@ "node": ">= 0.10" } }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -551,6 +571,25 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/mysql": { + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", + "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", + "dependencies": { + "bignumber.js": "9.0.0", + "readable-stream": "2.3.7", + "safe-buffer": "5.1.2", + "sqlstring": "2.3.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mysql/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/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -599,6 +638,11 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -647,6 +691,25 @@ "node": ">= 0.8" } }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/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/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -852,6 +915,14 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/sqlstring": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", + "integrity": "sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -860,6 +931,19 @@ "node": ">= 0.8" } }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/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/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -893,6 +977,11 @@ "node": ">= 0.8" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", diff --git a/package.json b/package.json index e8a0236..4cf596b 100644 --- a/package.json +++ b/package.json @@ -5,12 +5,14 @@ "main": "index.js", "scripts": { "dev": "nodemon app.js", - "start": "node app.js" + "start": "node index.js" }, "author": "Vincent Astolfi", "license": "ISC", "dependencies": { + "body-parser": "^1.20.2", "express": "^4.19.2", + "mysql": "^2.18.1", "socket.io": "^4.7.5", "uuid": "^9.0.1" } diff --git a/public/pages/connectionView.html b/public/pages/connectionView.html new file mode 100644 index 0000000..259f909 --- /dev/null +++ b/public/pages/connectionView.html @@ -0,0 +1,25 @@ + + + + + + Connection View + + +
+

Register

+
+ + + + + + + +
+
+
+ + + + \ No newline at end of file diff --git a/public/scripts/connection.js b/public/scripts/connection.js new file mode 100644 index 0000000..c972af8 --- /dev/null +++ b/public/scripts/connection.js @@ -0,0 +1,31 @@ +document.getElementById('registerForm').addEventListener('submit', async function (event) { + event.preventDefault(); // Prevent the default form submission + + const pseudo = document.getElementById('pseudo').value; + const password = document.getElementById('password').value; + const messageDiv = document.getElementById('message'); + + console.log("test") + + try { + const response = await fetch('/register', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ pseudo, password }), + }); + + if (response.ok) { + messageDiv.textContent = 'User registered successfully!'; + messageDiv.style.color = 'green'; + } else { + const errorText = await response.text(); + messageDiv.textContent = `Error: ${errorText}`; + messageDiv.style.color = 'red'; + } + } catch (error) { + messageDiv.textContent = `Error: ${error.message}`; + messageDiv.style.color = 'red'; + } +}); \ No newline at end of file diff --git a/public/scripts/index.js b/public/scripts/index.js index 0d3c985..c9ca81e 100644 --- a/public/scripts/index.js +++ b/public/scripts/index.js @@ -129,4 +129,4 @@ document.getElementById('closeModalButton').addEventListener('click', () => { drawGrid() }); -setTimeout(startConnection, 100); +setTimeout(startConnection, 100); \ No newline at end of file