From 0bac40a72fb3c24d796038b8e0ab5638d14e89ff Mon Sep 17 00:00:00 2001 From: Lukian LEIZOUR Date: Fri, 31 May 2024 16:03:24 +0200 Subject: [PATCH] commit --- api/hello.js | 7 --- api/v1/auth/login.js | 25 +++++++++ api/v1/auth/register.js | 25 +++++++++ api/v1/games/getall.js | 23 ++++++++ index.js | 3 +- libs/mysql.js | 63 +++++++++++++++++++++ package-lock.json | 120 ++++++++++++++++++++++++++++++++++++++-- package.json | 6 +- 8 files changed, 256 insertions(+), 16 deletions(-) create mode 100644 api/v1/auth/login.js create mode 100644 api/v1/auth/register.js create mode 100644 api/v1/games/getall.js create mode 100644 libs/mysql.js diff --git a/api/hello.js b/api/hello.js index 82d30ac..6ae2960 100644 --- a/api/hello.js +++ b/api/hello.js @@ -1,14 +1,7 @@ const express = require('express'); -const cookieParser = require('cookie-parser'); -const cors = require('cors'); -const jwt = require('jsonwebtoken'); const router = express.Router(); -router.use(express.json()); -router.use(cookieParser()); -router.use(cors()); - router.get('/', (req, res) => { res.send('Hello World!'); }); diff --git a/api/v1/auth/login.js b/api/v1/auth/login.js new file mode 100644 index 0000000..b1fd774 --- /dev/null +++ b/api/v1/auth/login.js @@ -0,0 +1,25 @@ +const express = require('express'); +const jwt = require('jsonwebtoken'); +const sha256 = require("sha256"); + +const { getUser } = require("../../../libs/mysql"); + +const router = express.Router(); + +router.post('/', async (req, res) => { + const {username, password} = req.body; + + const user = await getUser(username); + + if (!user[0]) { + return res.status(500).send({error: "wrong login informations"}); + } + + if (!(sha256(password) == user[0].password)) { + return res.status(500).send({error: "wrong login informations"}); + } + + res.status(200).send({message: "connection successful", token: jwt.sign({username: username, expiration: 20000}, process.env.JWTSecret)}); +}); + +module.exports = router; \ No newline at end of file diff --git a/api/v1/auth/register.js b/api/v1/auth/register.js new file mode 100644 index 0000000..82e45ea --- /dev/null +++ b/api/v1/auth/register.js @@ -0,0 +1,25 @@ +const express = require('express'); +const sha256 = require("sha256"); + +const { getUser, addUser } = require("../../../libs/mysql"); + +const router = express.Router(); + +router.post('/', async (req, res) => { + const {username, name, lastname, password} = req.body; + + if (!username || !name || !lastname || !password) { + return res.status(500).send({error: "invalid request"}); + } + + const user = await getUser(username); + + if (user[0]) { + return res.status(500).send({error: "user already exist"}); + } + + await addUser(username, name, lastname, sha256(password)); + res.status(200).send({message: "success"}); +}); + +module.exports = router; \ No newline at end of file diff --git a/api/v1/games/getall.js b/api/v1/games/getall.js new file mode 100644 index 0000000..fe45686 --- /dev/null +++ b/api/v1/games/getall.js @@ -0,0 +1,23 @@ +const express = require('express'); +const jwt = require('jsonwebtoken'); + +const {getGames} = require("../../../libs/mysql.js") + +const router = express.Router(); + +router.post('/', async (req, res) => { + const {token} = req.body; + + let user; + + try { + user = jwt.verify(token, process.env.JWTSecret); + } catch { + return res.status(500).send({error: "invalid token"}); + } + + const games = await getGames(); + res.status(200).send(games); +}); + +module.exports = router; \ No newline at end of file diff --git a/index.js b/index.js index e16b762..a1ab8aa 100644 --- a/index.js +++ b/index.js @@ -4,6 +4,7 @@ const path = require("path"); const config = require("./config"); const cookieParser = require("cookie-parser"); const cors = require("cors"); +require("dotenv").config(); const app = express(); const port = config.port || 3000; @@ -29,5 +30,5 @@ function loadRoutes(folderName) { loadRoutes("api"); app.listen(port, () => { - console.log(`Server listening on port ${port}`); + console.log(`Server listening on http://localhost:${port}/`); }); diff --git a/libs/mysql.js b/libs/mysql.js new file mode 100644 index 0000000..ed54637 --- /dev/null +++ b/libs/mysql.js @@ -0,0 +1,63 @@ +const mysql = require("mysql"); + +const con = mysql.createConnection({ + host: process.env.MysqlHost, + user: process.env.MysqlUser, + password: process.env.MysqlPassword, + database: process.env.MysqlDb, +}); + +// +-----------------------------------+ +// | GAMES | +// +-----------------------------------+ + +function getGames() { + return new Promise((resolve, reject) => { + con.query( + `SELECT * FROM games`, + (error, result) => { + if (error) { + reject(new Error(error)); + } + resolve(result); + } + ); + }); +} + +// +-----------------------------------+ +// | AUTH | +// +-----------------------------------+ + +function getUser(username) { + return new Promise((resolve, reject) => { + con.query( + `SELECT * FROM users WHERE username = "${username}"`, + (error, result) => { + if (error) { + reject(new Error(error)); + } + resolve(result); + }) + }) +} + +function addUser(username, name, lastname, password) { + return new Promise((resolve, reject) => { + con.query( + `INSERT INTO users(username, name, lastname, password) VALUES("${username}", "${name}", "${lastname}", "${password}")`, + (error, result) => { + if (error) { + reject(new Error(error)); + } + resolve(result); + }) + }) +} + +module.exports = { + getGames, + + getUser, + addUser, +}; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index d8817c6..1f4657b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,11 +12,13 @@ "axios": "^1.6.5", "cookie-parser": "^1.4.6", "cors": "^2.8.5", - "dotenv": "^16.3.1", + "dotenv": "^16.4.5", "express": "^4.18.2", "fs": "^0.0.1-security", "https": "^1.0.0", - "jsonwebtoken": "^9.0.2" + "jsonwebtoken": "^9.0.2", + "mysql": "^2.18.1", + "sha256": "^0.2.0" } }, "node_modules/accepts": { @@ -51,6 +53,14 @@ "proxy-from-env": "^1.1.0" } }, + "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.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", @@ -130,6 +140,16 @@ "node": ">= 0.6" } }, + "node_modules/convert-hex": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/convert-hex/-/convert-hex-0.1.0.tgz", + "integrity": "sha512-w20BOb1PiR/sEJdS6wNrUjF5CSfscZFUp7R9NSlXH8h2wynzXVEPFPJECAnkNylZ+cvf3p7TyRUHggDmrwXT9A==" + }, + "node_modules/convert-string": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/convert-string/-/convert-string-0.1.0.tgz", + "integrity": "sha512-1KX9ESmtl8xpT2LN2tFnKSbV4NiarbVi8DVb39ZriijvtTklyrT+4dT1wsGMHKD3CJUjXgvJzstm9qL9ICojGA==" + }, "node_modules/cookie": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", @@ -163,6 +183,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", @@ -222,14 +247,14 @@ } }, "node_modules/dotenv": { - "version": "16.3.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", - "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" + "url": "https://dotenvx.com" } }, "node_modules/ecdsa-sig-formatter": { @@ -498,6 +523,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/jsonwebtoken": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", @@ -645,6 +675,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", @@ -693,6 +742,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", @@ -746,6 +800,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", @@ -846,6 +919,15 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "node_modules/sha256": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/sha256/-/sha256-0.2.0.tgz", + "integrity": "sha512-kTWMJUaez5iiT9CcMv8jSq6kMhw3ST0uRdcIWl3D77s6AsLXNXRp3heeqqfu5+Dyfu4hwpQnMzhqHh8iNQxw0w==", + "dependencies": { + "convert-hex": "~0.1.0", + "convert-string": "~0.1.0" + } + }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -859,6 +941,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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", @@ -867,6 +957,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", @@ -895,6 +998,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 1b0d620..b6647d4 100644 --- a/package.json +++ b/package.json @@ -14,10 +14,12 @@ "axios": "^1.6.5", "cookie-parser": "^1.4.6", "cors": "^2.8.5", - "dotenv": "^16.3.1", + "dotenv": "^16.4.5", "express": "^4.18.2", "fs": "^0.0.1-security", "https": "^1.0.0", - "jsonwebtoken": "^9.0.2" + "jsonwebtoken": "^9.0.2", + "mysql": "^2.18.1", + "sha256": "^0.2.0" } }