From 287250b9338b9f55128d13d9c0c3f251f288dae5 Mon Sep 17 00:00:00 2001 From: Hajar RAHMOUNI Date: Thu, 5 Oct 2023 21:46:43 +0200 Subject: [PATCH 1/2] setting layout and existing user validation --- app.js | 4 +- package-lock.json | 203 ++++++++++++++++++----------------- package.json | 1 + public/stylesheets/style.css | 18 ++++ routes/authentification.js | 66 ------------ routes/index.js | 101 ++++++++--------- routes/index_.js | 68 ++++++++++++ views/authentification.pug | 35 ------ views/dashboard.pug | 9 ++ views/deconnexion.pug | 28 ----- views/layout.pug | 22 +++- views/login.pug | 29 ++--- views/login_.pug | 15 +++ views/register.pug | 45 +++++--- 14 files changed, 335 insertions(+), 309 deletions(-) delete mode 100644 routes/authentification.js create mode 100644 routes/index_.js delete mode 100644 views/authentification.pug create mode 100644 views/dashboard.pug delete mode 100644 views/deconnexion.pug create mode 100644 views/login_.pug diff --git a/app.js b/app.js index b913d3e..c435e47 100644 --- a/app.js +++ b/app.js @@ -17,9 +17,9 @@ const session = require('express-session'); const passport = require('./passport-config'); const connectToDatabase = require('./database/connection'); -var indexRouter = require('./routes/index'); +var indexRouter = require('./routes/index_'); var usersRouter = require('./routes/users'); -var authentifcationRouter = require('./routes/authentification'); +var authentifcationRouter = require('./routes'); var app = express(); diff --git a/package-lock.json b/package-lock.json index 6b81571..0803f7b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "0.0.0", "dependencies": { "body-parser": "^1.20.2", + "bootstrap": "^5.3.2", "bulma": "^0.9.4", "connect-flash": "^0.1.1", "cookie-parser": "~1.4.4", @@ -37,6 +38,16 @@ "sparse-bitfield": "^3.0.3" } }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, "node_modules/@types/babel-types": { "version": "7.0.12", "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.12.tgz", @@ -82,9 +93,9 @@ } }, "node_modules/acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha512-OLUyIIZ7mF5oaAUT1w0TFqQS81q3saT46x8t7ukpPjMNk+nbs4ZHhs7ToV8EWnLYLepjETXd4XaCE4uxkMeqUw==", + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==", "bin": { "acorn": "bin/acorn" }, @@ -100,17 +111,6 @@ "acorn": "^4.0.4" } }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/align-text": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", @@ -248,12 +248,49 @@ "node": ">= 0.8" } }, - "node_modules/brace-expansion": { + "node_modules/body-parser/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/body-parser/node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/body-parser/node_modules/statuses": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bootstrap": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.2.tgz", + "integrity": "sha512-D32nmNWiQHo94BKHLmOrdjlL05q1c8oxbtBphQFb9Z5to6eGRDCm0QgeaZ4zFBHzfg2++rqa2JkqCcxDy0sH0g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/bson": { @@ -761,19 +798,6 @@ "node": ">= 0.8" } }, - "node_modules/express/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - }, - "node_modules/express/node_modules/statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/filelist": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", @@ -782,6 +806,14 @@ "minimatch": "^5.0.1" } }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/filelist/node_modules/minimatch": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", @@ -821,14 +853,6 @@ "node": ">= 0.8" } }, - "node_modules/finalhandler/node_modules/statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -948,24 +972,6 @@ "node": ">= 0.6" } }, - "node_modules/http-errors/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" - }, - "node_modules/http-errors/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - }, - "node_modules/http-errors/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -978,9 +984,9 @@ } }, "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" }, "node_modules/ip": { "version": "2.0.0", @@ -1020,17 +1026,6 @@ "object-assign": "^4.0.1" } }, - "node_modules/is-expression/node_modules/acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/is-promise": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", @@ -1191,15 +1186,6 @@ "node": "*" } }, - "node_modules/minimatch/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", @@ -1274,9 +1260,9 @@ } }, "node_modules/mongoose": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-7.5.3.tgz", - "integrity": "sha512-QyYzhZusux0wIJs+4rYyHvel0kJm0CT887trNd1WAB3iQnDuJow0xEnjETvuS/cTjHQUVPihOpN7OHLlpJc52w==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-7.5.4.tgz", + "integrity": "sha512-u97BOfBOoCxysnH5X0WeF/O39DO1di75dYU75xaSs9mL3Si0qmP0qLWvWpBRdVkiiRVw+eaqJyKwaq6RvKPVZw==", "dependencies": { "bson": "^5.4.0", "kareem": "2.5.1", @@ -1764,6 +1750,24 @@ "node": ">= 0.8" } }, + "node_modules/raw-body/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/raw-body/node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/raw-body/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -1880,14 +1884,6 @@ "node": ">= 0.8" } }, - "node_modules/send/node_modules/statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/serve-favicon": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz", @@ -1928,9 +1924,9 @@ } }, "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" }, "node_modules/side-channel": { "version": "1.0.4", @@ -1992,11 +1988,11 @@ } }, "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", "engines": { - "node": ">= 0.8" + "node": ">= 0.6" } }, "node_modules/streamsearch": { @@ -2203,6 +2199,17 @@ "acorn-globals": "^3.0.0" } }, + "node_modules/with/node_modules/acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha512-OLUyIIZ7mF5oaAUT1w0TFqQS81q3saT46x8t7ukpPjMNk+nbs4ZHhs7ToV8EWnLYLepjETXd4XaCE4uxkMeqUw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/wordwrap": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", diff --git a/package.json b/package.json index 04ffbb5..0e74a81 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ }, "dependencies": { "body-parser": "^1.20.2", + "bootstrap": "^5.3.2", "bulma": "^0.9.4", "connect-flash": "^0.1.1", "cookie-parser": "~1.4.4", diff --git a/public/stylesheets/style.css b/public/stylesheets/style.css index 9453385..516b534 100644 --- a/public/stylesheets/style.css +++ b/public/stylesheets/style.css @@ -6,3 +6,21 @@ body { a { color: #00B7FF; } +.container-custom { + padding-left: 0; + padding-right: 0; +} +.my-navbar { + margin-bottom: 0; +} + +.container { + margin-top: 20px; +} + +.username { + color: #00ccff; + font-weight: bold; + font-size: 25px; + margin: 10px; +} diff --git a/routes/authentification.js b/routes/authentification.js deleted file mode 100644 index 77c551a..0000000 --- a/routes/authentification.js +++ /dev/null @@ -1,66 +0,0 @@ -var express = require('express'); -var router = express.Router(); -const passport = require('../passport-config'); -const User = require('../schemas/models'); - -/* GET home page. */ -router.get('/', function(req, res, next) { - res.render('authentification'); -}); - -router.post('/authentification', passport.authenticate('local', { - successRedirect: '/dashboard', - failureRedirect: '/' -})); - -router.get('/dashboard', isAuthenticated, function(req, res, next) { - res.render('deconnexion'); -}); - -router.get('/register', function(req, res) { - res.render('register', { }); -}); - -router.post('/register', async function(req, res) { - try { - const { username, password, role } = req.body; - const existingUser = await User.findOne({ username }); - - if (existingUser) { - return res.render('register', { error: 'Cet utilisateur existe déjà.' }); - } - - const newUser = new User({ - username: username, - password: password, - isAgent: role === 'agent' - }); - - await newUser.save(); - - passport.authenticate('local')(req, res, function () { - res.redirect('/'); - }); - } catch (error) { - res.render('register', { error: error.message }); - } -}); - - -router.get('/logout', isAuthenticated, function(req, res, next) { - req.logout(function(err) { - if (err) { - return next(err); - } - res.redirect('/'); - }); -}); - -function isAuthenticated(req, res, next) { - if (req.isAuthenticated()) { - return next(); - } - res.redirect('/'); -} - -module.exports = router; \ No newline at end of file diff --git a/routes/index.js b/routes/index.js index 61e3b6a..86e9ed9 100644 --- a/routes/index.js +++ b/routes/index.js @@ -1,68 +1,73 @@ var express = require('express'); -var passport = require('passport'); -const User = require('../schemas/models'); var router = express.Router(); -const connectToDatabase = require('../database/connection'); +const passport = require('../passport-config'); +const User = require('../schemas/models'); + +/* GET home page. */ +router.get('/', function(req, res, next) { + res.render('login',{ user : req.user }); +}); + +router.get('/login', function(req, res, next) { + res.render('login',{ user : req.user }); +}); + +router.post('/login', function(req, res, next) { + passport.authenticate('local', { + successRedirect: '/dashboard', + failureRedirect: '/' + })(req, res, next); +}); -router.get('/', function (req, res) { - res.render('index', { user : req.user }); +router.get('/dashboard', isAuthenticated, function(req, res, next) { + res.render('dashboard', { user: req.user }); }); router.get('/register', function(req, res) { - res.render('register', { }); + res.render('register', { user : req.user }); }); router.post('/register', async function(req, res) { - /*User.register(new User({ username : req.body.username }), req.body.password, function(err, account) { - if (err) { - return res.render('register', { account : account }); - } - - passport.authenticate('local')(req, res, function () { - res.redirect('/'); - }); - });"*/ - try { - const { username, password } = req.body; - const existingUser = await User.findOne({ username }); + try { + const { username, password, role } = req.body; + const existingUser = await User.findOne({ username }); - if (existingUser) { - return res.render('register', { error: 'Cet utilisateur existe déjà.' }); - } + if (existingUser) { + return res.render('register', { error: ' This user already exists.' }); + } - const newUser = new User({ - username: username, - password: password - }); - await newUser.save(); + const newUser = new User({ + username: username, + password: password, + isAgent: role === 'agent' + }); - passport.authenticate('local')(req, res, function () { - res.redirect('/'); - }); - } catch (error) { - res.render('register', { error: error.message }); - } -}); + await newUser.save(); -router.get('/login', function(req, res) { - res.render('login', { user : req.user }); + passport.authenticate('local')(req, res, function () { + res.redirect('/'); + }); + } catch (error) { + res.render('register', { error: error.message }); + } }); -router.post('/login', passport.authenticate('local'), function(req, res) { - res.redirect('/'); + + +router.get('/logout', isAuthenticated, function(req, res, next) { + req.logout(function(err) { + if (err) { + return next(err); + } + res.redirect('/'); + }); }); -router.get('/logout', function(req, res) { - req.logout(function(err) { - if (err) { - return next(err); +function isAuthenticated(req, res, next) { + if (req.isAuthenticated()) { + return next(); } res.redirect('/'); - }); -}); - -router.get('/ping', function(req, res){ - res.status(200).send("pong!"); -}); +} -module.exports = router; +module.exports = router; \ No newline at end of file diff --git a/routes/index_.js b/routes/index_.js new file mode 100644 index 0000000..61e3b6a --- /dev/null +++ b/routes/index_.js @@ -0,0 +1,68 @@ +var express = require('express'); +var passport = require('passport'); +const User = require('../schemas/models'); +var router = express.Router(); +const connectToDatabase = require('../database/connection'); + +router.get('/', function (req, res) { + res.render('index', { user : req.user }); +}); + +router.get('/register', function(req, res) { + res.render('register', { }); +}); + +router.post('/register', async function(req, res) { + /*User.register(new User({ username : req.body.username }), req.body.password, function(err, account) { + if (err) { + return res.render('register', { account : account }); + } + + passport.authenticate('local')(req, res, function () { + res.redirect('/'); + }); + });"*/ + try { + const { username, password } = req.body; + const existingUser = await User.findOne({ username }); + + if (existingUser) { + return res.render('register', { error: 'Cet utilisateur existe déjà.' }); + } + + const newUser = new User({ + username: username, + password: password + }); + await newUser.save(); + + passport.authenticate('local')(req, res, function () { + res.redirect('/'); + }); + } catch (error) { + res.render('register', { error: error.message }); + } +}); + +router.get('/login', function(req, res) { + res.render('login', { user : req.user }); +}); + +router.post('/login', passport.authenticate('local'), function(req, res) { + res.redirect('/'); +}); + +router.get('/logout', function(req, res) { + req.logout(function(err) { + if (err) { + return next(err); + } + res.redirect('/'); + }); +}); + +router.get('/ping', function(req, res){ + res.status(200).send("pong!"); +}); + +module.exports = router; diff --git a/views/authentification.pug b/views/authentification.pug deleted file mode 100644 index 7192b44..0000000 --- a/views/authentification.pug +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - Page d'Authentification - - - - -
-
-
-
-
-

Connexion

-
-
-
- - -
-
- - -
- - Créer un compte -
-
-
-
-
- - diff --git a/views/dashboard.pug b/views/dashboard.pug new file mode 100644 index 0000000..24bc9ad --- /dev/null +++ b/views/dashboard.pug @@ -0,0 +1,9 @@ +extends layout + +block content + .row.justify-content-center.mt-5 + .col-md-6 + .card + .card-body + .card-title + h1 Authentification réussie ! diff --git a/views/deconnexion.pug b/views/deconnexion.pug deleted file mode 100644 index 8c07250..0000000 --- a/views/deconnexion.pug +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - Dashboard - - - - -
- -
-
-
-
-
-

Authentification réussie !

-
-
-
-
-
-
- - diff --git a/views/layout.pug b/views/layout.pug index 50b3cf2..87a7121 100644 --- a/views/layout.pug +++ b/views/layout.pug @@ -3,10 +3,26 @@ html head title= title meta(name='viewport', content='width=device-width, initial-scale=1.0') - link(href='http://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css', rel='stylesheet', media='screen') + link(href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css', rel='stylesheet', media='screen') link(rel='stylesheet', href='/stylesheets/style.css') body + nav.navbar.navbar-expand-lg.navbar-light.bg-light.my-navbar + .container.d-flex.justify-content-between + a.navbar-brand(href='\\') Real Estate Adverts Platform + ul.nav.navbar-nav + if (!user) + li.nav-item + a.btn.btn-primary(href='/login', style='margin-right: 8px;') Login + li.nav-item + a.btn.btn-secondary(href='/register', style='margin-right: 8px;') Register + if (user) + li.nav-item + p.username #{user.username} + li.nav-item + a.btn.btn-danger(href="/logout") Logout block content - script(src='http://code.jquery.com/jquery.js') - script(src='http://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js') \ No newline at end of file + script(src='https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.8/dist/umd/popper.min.js') + script(src='https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.min.js') + script(src='http://code.jquery.com/jquery.js') + script(src='https://cdn.jsdelivr.net/npm/bootstrap@') diff --git a/views/login.pug b/views/login.pug index 3862a26..10e654f 100644 --- a/views/login.pug +++ b/views/login.pug @@ -1,15 +1,20 @@ extends layout block content - .container - h1 Login Page - p.lead Connectez vous à votre compte - br - form(role='form', action="/login",method="post", style='max-width: 300px;') - .form-group - input.form-control(type='text', name="username", placeholder='Enter Username') - .form-group - input.form-control(type='password', name="password", placeholder='Password') - button.btn.btn-default(type='submit') Submit - a(href='/') - button.btn.btn-primary(type="button") Cancel \ No newline at end of file + .container + .row.justify-content-center.align-items-center(style='margin-top:10%;') + .col-md-6 + .card + .card-body + .card-title + h1 Connexion + form(action='/login', method='post', style='max-width: 300px;') + .form-group.mb-3 + label(for='username', style='padding: 0.5rem 0;') Nom d'utilisateur + input.form-control(type='text', id='username', name='username', required) + .form-group.mb-3 + label(for='password', style='padding: 0.5rem 0;') Mot de passe + input.form-control(type='password', id='password', name='password', required) + button.btn.btn-primary(type='submit', style='margin-right: 2rem;') Connexion + a(href='/register') + button.btn.btn-secondary(type="button") Créer un compte diff --git a/views/login_.pug b/views/login_.pug new file mode 100644 index 0000000..3862a26 --- /dev/null +++ b/views/login_.pug @@ -0,0 +1,15 @@ +extends layout + +block content + .container + h1 Login Page + p.lead Connectez vous à votre compte + br + form(role='form', action="/login",method="post", style='max-width: 300px;') + .form-group + input.form-control(type='text', name="username", placeholder='Enter Username') + .form-group + input.form-control(type='password', name="password", placeholder='Password') + button.btn.btn-default(type='submit') Submit + a(href='/') + button.btn.btn-primary(type="button") Cancel \ No newline at end of file diff --git a/views/register.pug b/views/register.pug index c7cd895..cd6e8f2 100644 --- a/views/register.pug +++ b/views/register.pug @@ -2,20 +2,31 @@ extends layout block content .container - h1 Register - p.lead Créez votre compte - br - form(role='form', action="/register", method="post", style='max-width: 300px;') - .form-group - input.form-control(type='text', name="username", placeholder='Enter Username') - .form-group - input.form-control(type='password', name="password", placeholder='Password') - - .form-group - select.form-control(name='role') - option(value='consultant') Consultant - option(value='agent') Agent - - button.btn.btn-default(type='submit') Submit - a(href='/') - button.btn.btn-primary(type="button") Cancel + .row.justify-content-center.align-items-center(style='margin-top:10%;') + .col-md-6 + .card + .card-body + .card-title + h1 Register + p.lead Créez votre compte + br + //- Display error message if it exists + if error + .alert.alert-danger + strong Error: + | #{error} + form(role='form', action="/register", method="post", style='max-width: 300px;') + .form-group.mb-3 + label(style='padding: 0.5rem 0;') Username + input.form-control(type='text', name="username", placeholder='Username') + .form-group.mb-3 + label(style='padding: 0.5rem 0;') Password + input.form-control(type='password', name="password", placeholder='Password') + .form-group.mb-3 + label(style='padding: 0.5rem 0;') Are you an agent or a consultant? + select.form-control(name='role') + option(value='consultant') Consultant + option(value='agent') Agent + button.btn.btn-primary(type='submit', style='margin-right: 2rem;') Créer un compte + a(href='/') + button.btn.btn-secondary(type="button") Annuler -- GitLab From 0b3b98720b676c259358c4c16de08942e4ca94aa Mon Sep 17 00:00:00 2001 From: Hajar RAHMOUNI Date: Thu, 5 Oct 2023 22:30:40 +0200 Subject: [PATCH 2/2] Small Refacto and some validation errors --- app.js | 78 ++---------------------------------------------- routes/index.js | 24 ++++++++++++--- routes/index_.js | 68 ----------------------------------------- views/index.pug | 10 ------- views/login.pug | 4 +++ views/login_.pug | 15 ---------- 6 files changed, 26 insertions(+), 173 deletions(-) delete mode 100644 routes/index_.js delete mode 100644 views/index.pug delete mode 100644 views/login_.pug diff --git a/app.js b/app.js index c435e47..deb9c41 100644 --- a/app.js +++ b/app.js @@ -1,23 +1,13 @@ -// dependencies var createError = require('http-errors'); var express = require('express'); var path = require('path'); var cookieParser = require('cookie-parser'); var logger = require('morgan'); - -//var favicon = require('serve-favicon'); -//var bodyParser = require('body-parser'); -//var mongoose = require('mongoose'); -//var LocalStrategy = require('passport-local').Strategy; - -//var routes = require('./routes/index'); -//var users = require('./routes/users'); - +const flash = require('connect-flash'); const session = require('express-session'); const passport = require('./passport-config'); const connectToDatabase = require('./database/connection'); -var indexRouter = require('./routes/index_'); var usersRouter = require('./routes/users'); var authentifcationRouter = require('./routes'); @@ -25,98 +15,34 @@ var app = express(); connectToDatabase(); -// view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'pug'); -// uncomment after placing your favicon in /public -//app.use(favicon(__dirname + '/public/favicon.ico')); app.use(logger('dev')); app.use(express.json()); app.use(express.urlencoded({ extended: false })); -//app.use(bodyParser.json()); -//app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); -/* -app.use(require('express-session')({ - secret: 'keyboard cat', - resave: false, - saveUninitialized: false -})); -*/ -//app.use(passport.initialize()); -//app.use(passport.session()); -//app.use(express.static(path.join(__dirname, 'public'))); - - -//app.use('/', routes); - -// passport config -//var Account = require('./models/account'); -//passport.use(new LocalStrategy(Account.authenticate())); -//passport.serializeUser(Account.serializeUser()); -//passport.deserializeUser(Account.deserializeUser()); - -// mongoose.Promise = global.Promise; -// mongoose -// mongoose.connect('mongodb://127.0.0.1:27017/AdsManagement'); app.use(session({ secret: 'fifiHajar', resave: true, saveUninitialized: true })); app.use(passport.initialize()); app.use(passport.session()); +app.use(flash()); -//app.use('/', indexRouter); app.use('/', authentifcationRouter); app.use('/users', usersRouter); -// catch 404 and forward to error handler app.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err); }); -// catch 404 and forward to error handler -app.use(function(req, res, next) { - next(createError(404)); -}); - -// error handler app.use(function(err, req, res, next) { - // set locals, only providing error in development res.locals.message = err.message; res.locals.error = req.app.get('env') === 'development' ? err : {}; - - // render the error page res.status(err.status || 500); res.render('error'); }); -/* -// error handlers - -// development error handler -// will print stacktrace -if (app.get('env') === 'development') { - app.use(function(err, req, res, next) { - res.status(err.status || 500); - res.render('error', { - message: err.message, - error: err - }); - }); -} - -// production error handler -// no stacktraces leaked to user -app.use(function(err, req, res, next) { - res.status(err.stats || 500); - res.render('error', { - message: err.message, - error: {} - }); -}); -*/ - module.exports = app; diff --git a/routes/index.js b/routes/index.js index 86e9ed9..54ca3d4 100644 --- a/routes/index.js +++ b/routes/index.js @@ -9,16 +9,32 @@ router.get('/', function(req, res, next) { }); router.get('/login', function(req, res, next) { - res.render('login',{ user : req.user }); + res.render('login', { user: req.user, messages: req.flash('error') }); }); + router.post('/login', function(req, res, next) { - passport.authenticate('local', { - successRedirect: '/dashboard', - failureRedirect: '/' + passport.authenticate('local', function(err, user, info) { + if (err) { // Handle unexpected errors + return next(err); + } + if (!user) { + console.log('invalid username or password'); + return res.render('login', { error: ' Invalid username or password' }); + } + req.logIn(user, function(err) { + if (err) { + return next(err); + } + // If authentication is successful, redirect to the dashboard + return res.redirect('/dashboard'); + }); })(req, res, next); }); + + + router.get('/dashboard', isAuthenticated, function(req, res, next) { res.render('dashboard', { user: req.user }); }); diff --git a/routes/index_.js b/routes/index_.js deleted file mode 100644 index 61e3b6a..0000000 --- a/routes/index_.js +++ /dev/null @@ -1,68 +0,0 @@ -var express = require('express'); -var passport = require('passport'); -const User = require('../schemas/models'); -var router = express.Router(); -const connectToDatabase = require('../database/connection'); - -router.get('/', function (req, res) { - res.render('index', { user : req.user }); -}); - -router.get('/register', function(req, res) { - res.render('register', { }); -}); - -router.post('/register', async function(req, res) { - /*User.register(new User({ username : req.body.username }), req.body.password, function(err, account) { - if (err) { - return res.render('register', { account : account }); - } - - passport.authenticate('local')(req, res, function () { - res.redirect('/'); - }); - });"*/ - try { - const { username, password } = req.body; - const existingUser = await User.findOne({ username }); - - if (existingUser) { - return res.render('register', { error: 'Cet utilisateur existe déjà.' }); - } - - const newUser = new User({ - username: username, - password: password - }); - await newUser.save(); - - passport.authenticate('local')(req, res, function () { - res.redirect('/'); - }); - } catch (error) { - res.render('register', { error: error.message }); - } -}); - -router.get('/login', function(req, res) { - res.render('login', { user : req.user }); -}); - -router.post('/login', passport.authenticate('local'), function(req, res) { - res.redirect('/'); -}); - -router.get('/logout', function(req, res) { - req.logout(function(err) { - if (err) { - return next(err); - } - res.redirect('/'); - }); -}); - -router.get('/ping', function(req, res){ - res.status(200).send("pong!"); -}); - -module.exports = router; diff --git a/views/index.pug b/views/index.pug deleted file mode 100644 index cb8f718..0000000 --- a/views/index.pug +++ /dev/null @@ -1,10 +0,0 @@ -extends layout - -block content - if (!user) - a(href="/login") Login - br - a(href="/register") Register - if (user) - p You are currently logged in as #{user.username} - a(href="/logout") Logout \ No newline at end of file diff --git a/views/login.pug b/views/login.pug index 10e654f..a427453 100644 --- a/views/login.pug +++ b/views/login.pug @@ -8,6 +8,10 @@ block content .card-body .card-title h1 Connexion + if error + .alert.alert-danger + strong Error: + | #{error} form(action='/login', method='post', style='max-width: 300px;') .form-group.mb-3 label(for='username', style='padding: 0.5rem 0;') Nom d'utilisateur diff --git a/views/login_.pug b/views/login_.pug deleted file mode 100644 index 3862a26..0000000 --- a/views/login_.pug +++ /dev/null @@ -1,15 +0,0 @@ -extends layout - -block content - .container - h1 Login Page - p.lead Connectez vous à votre compte - br - form(role='form', action="/login",method="post", style='max-width: 300px;') - .form-group - input.form-control(type='text', name="username", placeholder='Enter Username') - .form-group - input.form-control(type='password', name="password", placeholder='Password') - button.btn.btn-default(type='submit') Submit - a(href='/') - button.btn.btn-primary(type="button") Cancel \ No newline at end of file -- GitLab