129 lines
3.3 KiB
JavaScript
129 lines
3.3 KiB
JavaScript
// Imports libraries
|
|
const express = require('express');
|
|
const router = express.Router();
|
|
const bcrypt = require('bcryptjs');
|
|
const passport = require('passport');
|
|
const ObjectID = require('mongodb').ObjectID;
|
|
// Load User model
|
|
const User = require('../models/User');
|
|
const { forwardAuthenticated } = require('../config/auth');
|
|
|
|
// Loads libraries for uploading img functions
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
const multer = require('multer');
|
|
|
|
let storage = multer.diskStorage({
|
|
destination: (req, file, cb) => {
|
|
cb(null, 'routes/uploads')
|
|
},
|
|
filename: (req, file, cb) => {
|
|
cb(null, file.fieldname + '-' + Date.now())
|
|
}
|
|
});
|
|
|
|
let upload = multer({ storage: storage });
|
|
|
|
// Login Page
|
|
router.get('/login', forwardAuthenticated, (req, res) => res.render('login'));
|
|
|
|
// Register Page
|
|
router.get('/register', forwardAuthenticated, (req, res) => res.render('register'));
|
|
|
|
// Register
|
|
router.post('/register', upload.single('image'), (req, res, next) => {
|
|
// Collects input
|
|
const { name, email, password, password2 } = req.body;
|
|
let errors = [];
|
|
|
|
// Check for blanks
|
|
if (!name || !email || !password || !password2) {
|
|
errors.push({ msg: 'Please enter all fields' });
|
|
}
|
|
|
|
// Check if password is confirmed
|
|
if (password != password2) {
|
|
errors.push({ msg: 'Passwords do not match' });
|
|
}
|
|
|
|
// Validates password is to required length
|
|
if (password.length < 6) {
|
|
errors.push({ msg: 'Password must be at least 6 characters' });
|
|
}
|
|
|
|
// Error handling
|
|
if (errors.length > 0) {
|
|
// Redirects to register page with errors
|
|
res.render('register', {
|
|
errors,
|
|
name,
|
|
email,
|
|
password,
|
|
password2
|
|
});
|
|
} else {
|
|
// Verifies Email isnt taken
|
|
User.findOne({ email: email }).then(user => {
|
|
if (user) {
|
|
errors.push({ msg: 'Email already exists' });
|
|
// Redirect to register page with errors
|
|
res.render('register', {
|
|
errors,
|
|
name,
|
|
email,
|
|
password,
|
|
password2
|
|
});
|
|
} else {
|
|
// Creates new User Object
|
|
const newUser = new User({
|
|
name,
|
|
image: {
|
|
data: fs.readFileSync(path.join(__dirname + '/uploads/' + req.file.filename)),
|
|
contentType: 'image/png'
|
|
},
|
|
email,
|
|
password,
|
|
});
|
|
|
|
// Encrypts password
|
|
bcrypt.genSalt(10, (err, salt) => {
|
|
bcrypt.hash(newUser.password, salt, (err, hash) => {
|
|
if (err) throw err;
|
|
newUser.password = hash;
|
|
newUser
|
|
.save()
|
|
.then(user => {
|
|
req.flash(
|
|
'success_msg',
|
|
'You are now registered and can log in'
|
|
);
|
|
// Takes to login page on success
|
|
res.redirect('/users/login');
|
|
})
|
|
.catch(err => console.log(err));
|
|
});
|
|
});
|
|
}
|
|
});
|
|
}
|
|
});
|
|
|
|
// Login
|
|
router.post('/login', (req, res, next) => {
|
|
passport.authenticate('local', {
|
|
successRedirect: '/dashboard',
|
|
failureRedirect: '/users/login',
|
|
failureFlash: true
|
|
})(req, res, next);
|
|
});
|
|
|
|
// Logout
|
|
router.get('/logout', (req, res) => {
|
|
req.logout();
|
|
req.flash('success_msg', 'You are logged out');
|
|
res.redirect('/users/login');
|
|
});
|
|
|
|
module.exports = router;
|