const express = require('express'); const router = express.Router(); const bcrypt = require('bcryptjs'); const passport = require('passport'); // Load User model const User = require('../models/User'); const { forwardAuthenticated } = require('../config/auth'); 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')); // Edit page router.get('/edit', (req, res) => res.render('edit')); // Edit router.post('/edit', (req, res) => { const { user, name, email, oldPassword, newPassword, newPassword2 } = req.body; let errors = []; if (!name || !email || !oldPassword || !newPassword || !newPassword2) { errors.push({ msg: 'Please enter all fields' }); } if (oldPassword != user.password) { errors.push({ msg: 'Password is incorrect' }); } if (newPassword != newPassword2) { errors.push({ msg: 'New password doesnt match' }); } if (oldPassword == newPassword) { errors.push({ msg: 'Cant use the same password' }) } if (newPassword.length < 6) { errors.push({ msg: 'Password must be at least 6 characters' }); } if (errors.length > 0) { res.render('register', { errors, name, email, oldPassword, newPassword2, newPassword2 }); } else { User.findOne({ email: email }).then(user => { if (user) { errors.push({ msg: 'Email already exists' }); res.render('register', { errors, name, email, oldPassword, newPassword, newPassword2 }); } else { bcrypt.genSalt(10, (err, salt) => { bcrypt.hash(newPassword, salt, (err, hash) => { if (err) throw err; user.password = hash; user.name = name; user.email = email; user .save() .then(user => { req.flash( 'success_msg', 'You are now registered and can log in' ); res.redirect('/users/login'); }) .catch(err => console.log(err)); }); }); } }); } }); // Register router.post('/register', upload.single('image'), (req, res, next) => { const { name, email, password, password2 } = req.body; let errors = []; if (!name || !email || !password || !password2) { errors.push({ msg: 'Please enter all fields' }); } if (password != password2) { errors.push({ msg: 'Passwords do not match' }); } if (password.length < 6) { errors.push({ msg: 'Password must be at least 6 characters' }); } if (errors.length > 0) { res.render('register', { errors, name, email, password, password2 }); } else { User.findOne({ email: email }).then(user => { if (user) { errors.push({ msg: 'Email already exists' }); res.render('register', { errors, name, email, password, password2 }); } else { const newUser = new User({ name, image: { data: fs.readFileSync(path.join(__dirname + '/uploads/' + req.file.filename)), contentType: 'image/png' }, email, 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' ); 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;