From e3ef30c10cbf9d064ac77c3880ae081c37da151d Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Wed, 3 Mar 2021 04:24:33 +1100 Subject: [PATCH] Implemented username reserve feature --- package-lock.json | 33 +++++++++++++++++++++++++++ package.json | 1 + server/chat/index.js | 7 ++---- server/chat/reserve.js | 34 ++++++++++++++++++++++++++++ server/database/models/index.js | 2 +- server/database/models/pseudonyms.js | 28 +++++++++++++++++++++++ server/server.js | 2 ++ 7 files changed, 101 insertions(+), 6 deletions(-) create mode 100644 server/chat/reserve.js create mode 100644 server/database/models/pseudonyms.js diff --git a/package-lock.json b/package-lock.json index 37bae72..0b5e61e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "cors": "^2.8.5", "dotenv": "^8.2.0", "express": "^4.17.1", + "express-formidable": "^1.2.0", "mariadb": "^2.5.2", "sequelize": "^6.5.0" }, @@ -666,6 +667,17 @@ "node": ">= 0.10.0" } }, + "node_modules/express-formidable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/express-formidable/-/express-formidable-1.2.0.tgz", + "integrity": "sha512-w1vXjF3gb50UKTNkFaW8/4rqY4dUrKfZ1sAZzwAF9YxCAgj/29QZsycf71di0GkskrZOAkubk9pvGYfxyAMYiw==", + "dependencies": { + "formidable": "^1.0.17" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -695,6 +707,14 @@ "node": ">= 0.8" } }, + "node_modules/formidable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", + "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==", + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, "node_modules/forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", @@ -2544,6 +2564,14 @@ "vary": "~1.1.2" } }, + "express-formidable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/express-formidable/-/express-formidable-1.2.0.tgz", + "integrity": "sha512-w1vXjF3gb50UKTNkFaW8/4rqY4dUrKfZ1sAZzwAF9YxCAgj/29QZsycf71di0GkskrZOAkubk9pvGYfxyAMYiw==", + "requires": { + "formidable": "^1.0.17" + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -2567,6 +2595,11 @@ "unpipe": "~1.0.0" } }, + "formidable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", + "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==" + }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", diff --git a/package.json b/package.json index 27fadcc..716e1bf 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "cors": "^2.8.5", "dotenv": "^8.2.0", "express": "^4.17.1", + "express-formidable": "^1.2.0", "mariadb": "^2.5.2", "sequelize": "^6.5.0" }, diff --git a/server/chat/index.js b/server/chat/index.js index 5922d4d..29a4e8c 100644 --- a/server/chat/index.js +++ b/server/chat/index.js @@ -1,10 +1,7 @@ const express = require('express'); const router = express.Router(); -//the routes -//TODO: import the routes here - -//basic route management -//TODO: define the routes here +//reserve the name using a pseudonym +router.post('/reserve', require('./reserve')); module.exports = router; diff --git a/server/chat/reserve.js b/server/chat/reserve.js new file mode 100644 index 0000000..bd9a965 --- /dev/null +++ b/server/chat/reserve.js @@ -0,0 +1,34 @@ +const crypto = require("crypto"); + +const Sequelize = require('sequelize'); +const Op = Sequelize.Op; +const { pseudonyms } = require('../database/models'); + +const route = async (req, res) => { + //generate a UUID to act as a pseudonym (starting with a period) + const pseudonym = `.${uuid()}`; + + //find or create the record (using the username) + const [instance, created] = await pseudonyms.findOrCreate({ + where: { + username: req.fields.username + } + }); + + //save the pseudonym (overwriting existing pseudonyms) + const result = await pseudonyms.update({ + pseudonym: pseudonym + },{ + where: { + username: req.fields.username + } + }); + + //OK + return res.status(200).send({ pseudonym: pseudonym }); +}; + +//lazy +const uuid = (bytes = 16) => crypto.randomBytes(bytes).toString("hex"); + +module.exports = route; \ No newline at end of file diff --git a/server/database/models/index.js b/server/database/models/index.js index aabbaee..f059559 100644 --- a/server/database/models/index.js +++ b/server/database/models/index.js @@ -1,3 +1,3 @@ module.exports = { - //TODO: models + pseudonyms: require('./pseudonyms') }; \ No newline at end of file diff --git a/server/database/models/pseudonyms.js b/server/database/models/pseudonyms.js new file mode 100644 index 0000000..ebd84e0 --- /dev/null +++ b/server/database/models/pseudonyms.js @@ -0,0 +1,28 @@ +const Sequelize = require('sequelize'); +const sequelize = require('..'); + +module.exports = sequelize.define('pseudonyms', { + id: { + type: Sequelize.INTEGER(11), + allowNull: false, + autoIncrement: true, + primaryKey: true, + unique: true + }, + + username: { + type: 'varchar(320)', + unique: true + }, + + pseudonym: { + type: 'varchar(320)', + unique: true + }, + + deletion: { + type: 'DATETIME', + allowNull: true, + defaultValue: null + } +}); diff --git a/server/server.js b/server/server.js index befc6ed..7c2ceaa 100644 --- a/server/server.js +++ b/server/server.js @@ -5,10 +5,12 @@ require('dotenv').config(); const express = require('express'); const app = express(); const server = require('http').Server(app); +const formidable = require('express-formidable'); const bodyParser = require('body-parser'); const cors = require('cors'); //config +app.use(formidable()); app.use(bodyParser.json()); app.use(cors());