From 2c06a2191777cd22f5c815cfbcd3f244beb079f7 Mon Sep 17 00:00:00 2001 From: Victor Camarena Ballester Date: Mon, 2 Sep 2019 22:22:27 +0200 Subject: [PATCH] done --- .eslintrc.json | 18 ++++++++++++++ app.js | 34 +++++++++++++++++++++++-- middlewares/index.js | 58 +++++++++++++++++++++++++++++++++++++++++++ models/User.js | 20 +++++++++++++++ package.json | 9 +++++++ routes/index.js | 43 ++++++++++++++++++++++++++++++-- routes/users.js | 22 ++++++++++++++++ views/create.hbs | 15 +++++++++++ views/index.hbs | 6 +++++ views/layout.hbs | 15 +++++++++-- views/login.hbs | 15 +++++++++++ views/users/admin.hbs | 2 ++ 12 files changed, 251 insertions(+), 6 deletions(-) create mode 100644 .eslintrc.json create mode 100644 middlewares/index.js create mode 100644 models/User.js create mode 100644 routes/users.js create mode 100644 views/create.hbs create mode 100644 views/login.hbs create mode 100644 views/users/admin.hbs diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000000..a2257c0630 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,18 @@ +{ + "env": { + "browser": true, + "commonjs": true, + "es6": true, + "node": true + }, + "extends": "airbnb-base", + "globals": { + "Atomics": "readonly", + "SharedArrayBuffer": "readonly" + }, + "parserOptions": { + "ecmaVersion": 2018 + }, + "rules": { + } +} \ No newline at end of file diff --git a/app.js b/app.js index 4c4fe56e37..d82177c3ae 100644 --- a/app.js +++ b/app.js @@ -1,30 +1,60 @@ -const createError = require('http-errors'); const express = require('express'); const path = require('path'); const cookieParser = require('cookie-parser'); const logger = require('morgan'); const mongoose = require('mongoose'); +const session = require('express-session'); +const MongoStore = require('connect-mongo')(session); +const flash = require('connect-flash'); +const { notifications } = require('./middlewares'); const indexRouter = require('./routes/index'); +const usersRouter = require('./routes/users'); const app = express(); mongoose.connect('mongodb://localhost/basic-auth', { keepAlive: true, useNewUrlParser: true, - reconnectTries: Number.MAX_VALUE + reconnectTries: Number.MAX_VALUE, }); + + // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'hbs'); + app.use(logger('dev')); app.use(express.json()); app.use(express.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); +app.use( + session({ + store: new MongoStore({ + mongooseConnection: mongoose.connection, + ttl: 24 * 60 * 60, // 1 day + }), + secret: 'basic-auth-phrase', + resave: true, + saveUninitialized: true, + cookie: { + maxAge: 24 * 60 * 60 * 1000, + }, + }), +); + +app.use(flash()); +app.use((req, res, next) => { + app.locals.currentUser = req.session.currentUser; + next(); +}); +app.use(notifications(app)); app.use('/', indexRouter); +app.use('/users', usersRouter); + // -- 404 and error handler diff --git a/middlewares/index.js b/middlewares/index.js new file mode 100644 index 0000000000..5e42bd8e1b --- /dev/null +++ b/middlewares/index.js @@ -0,0 +1,58 @@ +const bcrypt = require('bcrypt'); +const User = require('../models/User'); + +const checkFields = (req, res, next) => { + const { username, password } = req.body; + + if (username === '' || password === '') { + req.flash('error', 'UserName and Password can\'t be empty!'); + res.redirect('/create'); + } else { + next(); + } +}; + +const createUser = async (username, password) => { + bcrypt.hash(password, 10, async (err, hash) => { + return User.create({ username, hashedPassword: hash }); + }); +}; + +const LogIn = async (username, password, req, res) => { + const user = await User.findOne({ username }); + if (user) { + if (bcrypt.compareSync(password, user.hashedPassword)) { + req.session.currentUser = user; + res.redirect('/users/admin'); + } else { + req.flash('error', 'usuario o contraseƱa incorrectos'); + res.redirect('login'); + } + } else { + req.flash('error', 'usuario o contraseƱa incorrectos'); + res.redirect('login'); + } +}; + + +const checkLoggin = (req, res, next) => { + if (req.session.currentUser) { + next(); + } else { + req.flash('warning', 'Must be Logged to acces!'); + res.redirect('/login'); + } +}; + +const notifications = () => (req, res, next) => { + res.locals.errorMessages = req.flash('error'); + res.locals.infoMessages = req.flash('info'); + res.locals.dangerMessages = req.flash('danger'); + res.locals.successMessages = req.flash('success'); + res.locals.warningMessages = req.flash('warning'); + next(); +}; + +module.exports = { + checkFields, createUser, notifications, checkLoggin, LogIn, +}; diff --git a/models/User.js b/models/User.js new file mode 100644 index 0000000000..a6c67dcd7f --- /dev/null +++ b/models/User.js @@ -0,0 +1,20 @@ +const mongoose = require('mongoose'); + +const { Schema } = mongoose; + +const userSchema = new Schema( + { + username: { type: String, required: true, unique: true }, + hashedPassword: { type: String, required: true }, + }, + { + timestamps: { + createdAt: 'created_at', + updatedAt: 'updated_at', + }, + }, +); + +const User = mongoose.model('User', userSchema); + +module.exports = User; diff --git a/package.json b/package.json index 2109314f81..848d2deeae 100644 --- a/package.json +++ b/package.json @@ -7,13 +7,22 @@ "start-dev": "nodemon ./bin/www" }, "dependencies": { + "bcrypt": "^3.0.6", + "connect-flash": "^0.1.1", + "connect-mongo": "^3.0.0", "cookie-parser": "~1.4.3", "debug": "~2.6.9", "express": "~4.16.0", + "express-session": "^1.16.2", "hbs": "~4.0.1", "http-errors": "~1.6.2", "mongoose": "^5.4.12", "morgan": "~1.9.0", "nodemon": "^1.18.10" + }, + "devDependencies": { + "eslint": "^6.3.0", + "eslint-config-airbnb-base": "^14.0.0", + "eslint-plugin-import": "^2.18.2" } } diff --git a/routes/index.js b/routes/index.js index f2d4e52ad3..0246104aa5 100644 --- a/routes/index.js +++ b/routes/index.js @@ -1,9 +1,48 @@ const express = require('express'); +const User = require('../models/User'); +const { checkFields, createUser, LogIn } = require('../middlewares'); + const router = express.Router(); -/* GET home page. */ -router.get('/', (req, res, next) => { +router.get('/', (req, res) => { res.render('index', { title: 'Express' }); }); +router.get('/create', (req, res) => { + res.render('create'); +}); + +router.post('/create', checkFields, async (req, res) => { + const { username, password } = req.body; + try { + if (await User.findOne({ username })) { + // Ya exite, le devulevo un mensage + req.flash('info', 'User already exists'); + res.redirect('/create'); + } else { + // No existe. lo creo. + const user = await createUser(username, password); + req.session.currentUser = user; + req.flash('info', 'user created'); + res.redirect('/users/admin'); + } + } catch (error) { + req.flash('error', error.message); + res.redirect('/create'); + } +}); + +router.get('/login', (req, res) => { + res.render('login'); +}); +router.post('/login', checkFields, async (req, res) => { + const { username, password } = req.body; + try { + LogIn(username, password, req, res); + } catch (error) { + req.flash('error', error.message); + res.redirect('/login'); + } +}); + module.exports = router; diff --git a/routes/users.js b/routes/users.js new file mode 100644 index 0000000000..3188a2253c --- /dev/null +++ b/routes/users.js @@ -0,0 +1,22 @@ +const express = require('express'); + +const router = express.Router(); + +const { checkLoggin } = require('../middlewares'); + +router.use(checkLoggin); + +router.get('/admin', (req, res) => { + res.render('users/admin'); +}); + +router.get('/logout', (req, res, next) => { + req.session.destroy((err) => { + if (err) { + next(err); + } + res.redirect('/login'); + }); +}); + +module.exports = router; diff --git a/views/create.hbs b/views/create.hbs new file mode 100644 index 0000000000..129ad7f9cf --- /dev/null +++ b/views/create.hbs @@ -0,0 +1,15 @@ +

Create a register and join us!

+
+ + +
+
+
+ +
+ + + +
+ +
\ No newline at end of file diff --git a/views/index.hbs b/views/index.hbs index 1f308fdb35..ffe6953fce 100644 --- a/views/index.hbs +++ b/views/index.hbs @@ -1,2 +1,8 @@

{{title}}

Welcome to {{title}}

+
+
Create Account
+
Go to LogIn
+ +
Go to Admin
+
\ No newline at end of file diff --git a/views/layout.hbs b/views/layout.hbs index f503bd75f1..7905748263 100644 --- a/views/layout.hbs +++ b/views/layout.hbs @@ -1,5 +1,6 @@ + @@ -7,10 +8,20 @@ {{title}} - + + Home {{{body}}} - + {{#if infoMessages}} +

{{infoMessages}}

+ {{/if}} + {{#if errorMessages }} +

{{ errorMessages }}

+ {{/if }} + {{#if warningMessages }} +

{{ warningMessages }}

+ {{/if }} + \ No newline at end of file diff --git a/views/login.hbs b/views/login.hbs new file mode 100644 index 0000000000..bdeeb19740 --- /dev/null +++ b/views/login.hbs @@ -0,0 +1,15 @@ +

Log in and share!!!!

+
+ + +
+
+
+ +
+ + + +
+ +
\ No newline at end of file diff --git a/views/users/admin.hbs b/views/users/admin.hbs new file mode 100644 index 0000000000..3a57b8d1aa --- /dev/null +++ b/views/users/admin.hbs @@ -0,0 +1,2 @@ +

Welcome {{ currentUser.username }}

+Logout \ No newline at end of file