diff --git a/app.js b/app.js index 8497609..4c83c00 100644 --- a/app.js +++ b/app.js @@ -1,13 +1,12 @@ -// Import required libraries const express = require('express'); const expressLayouts = require('express-ejs-layouts'); const mongoose = require('mongoose'); const passport = require('passport'); const flash = require('connect-flash'); const session = require('express-session'); -const fs = require('fs'); const bodyParser = require('body-parser'); -const path = require('path'); +var path = require('path'); +var fs = require('fs'); require('dotenv/config'); const app = express(); @@ -19,9 +18,10 @@ require('./config/passport')(passport); const db = require('./config/keys').mongoURI; // Connect to MongoDB -mongoose.connect( +mongoose + .connect( db, - { useNewUrlParser: true ,useUnifiedTopology: true} + { useNewUrlParser: true, useUnifiedTopology: true} ) .then(() => console.log('MongoDB Connected')) .catch(err => console.log(err)); @@ -30,7 +30,7 @@ mongoose.connect( app.use(expressLayouts); app.set('view engine', 'ejs'); -// Body parser +// Body Parser app.use(bodyParser.urlencoded({ extended: false })) app.use(bodyParser.json()) @@ -64,5 +64,4 @@ app.use('/users', require('./routes/users.js')); const PORT = process.env.PORT || 5000; -// Start Server app.listen(PORT, console.log(`Server started on port ${PORT}`)); diff --git a/models/defaultImage.js b/models/defaultImage.js new file mode 100644 index 0000000..f1050fa --- /dev/null +++ b/models/defaultImage.js @@ -0,0 +1,11 @@ +const fs = require('fs'); +const path = require('../routes/users.js').path; + +let image = { + data: fs.readFileSync(path), + contentType: "image/png" +} + +module.exports = { + defaultImage: image +} diff --git a/routes/uploads/image-1606947471396 b/routes/uploads/image-1606947471396 new file mode 100644 index 0000000..31dc931 Binary files /dev/null and b/routes/uploads/image-1606947471396 differ diff --git a/routes/uploads/image-1606948118708 b/routes/uploads/image-1606948118708 new file mode 100644 index 0000000..1795b5f Binary files /dev/null and b/routes/uploads/image-1606948118708 differ diff --git a/routes/uploads/image-1606948273415 b/routes/uploads/image-1606948273415 new file mode 100644 index 0000000..72e562e Binary files /dev/null and b/routes/uploads/image-1606948273415 differ diff --git a/routes/uploads/image-1607104527965 b/routes/uploads/image-1607104527965 new file mode 100644 index 0000000..72e562e Binary files /dev/null and b/routes/uploads/image-1607104527965 differ diff --git a/routes/users.js b/routes/users.js index b5e2ee8..742459a 100644 --- a/routes/users.js +++ b/routes/users.js @@ -3,23 +3,27 @@ const express = require('express'); const router = express.Router(); const bcrypt = require('bcryptjs'); const passport = require('passport'); -const ObjectID = require('mongodb').ObjectID; +const MongoClient = require('mongodb').MongoClient; +const ObjectId = require('mongodb').ObjectId; // Load User model const User = require('../models/User'); const { forwardAuthenticated } = require('../config/auth'); +// DB Config +const db = require('../config/keys').mongoURI; + // Loads libraries for uploading img functions -const fs = require('fs'); -const path = require('path'); -const multer = require('multer'); +let fs = require('fs'); +let path = require('path'); +let 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()) - } + destination: (req, file, cb) => { + cb(null, 'routes/uploads') + }, + filename: (req, file, cb) => { + cb(null, file.fieldname + '-' + Date.now()) + } }); let upload = multer({ storage: storage }); @@ -30,8 +34,211 @@ 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', upload.single('image'), (req, res, next) => { + // Passes image path to defaultImage Model + imagePath = __dirname + '/uploads/image-1606947471396'; + module.exports = { + path: imagePath + } + + // Gets inputs + const { _id, name, newPassword, newPassword2 } = req.body; + let errors = []; + let useName = true; + let useNewPassword = true; + + if (!name) { + useName = false; + } + + if (!newPassword) { + if (newPassword2.length > 0) { + errors.push({ msg: 'You need to enter your new password' }) + } + + if (!newPassword2) { + useNewPassword = false; + } + } + + if (newPassword.length > 0) { + if (!newPassword2) { + errors.push({ msg: 'Confirm new Password' }) + } + + // Checks if new password & new password confirm match + if (newPassword != newPassword2) { + errors.push({ msg: 'New Passwords do not match' }); + } + + // Validates new password is required lenght + if (newPassword.length < 6) { + errors.push({ msg: 'Password must be at least 6 characters' }); + } + } + + // Error Handling + if (errors.length > 0) { + // Redirects to edit page with errors + res.render('edit', { + errors, + name, + currPassword, + newPassword, + newPassword2 + }); + } else { + let hashPass; + let updated; + let defaultImage = require('../models/defaultImage').defaultImage; + + try { + if (useName && useNewPassword) { + // Encrypts password + bcrypt.genSalt(10, (err, salt) => { + bcrypt.hash(newPassword, salt, (err, hash) => { + if (err) throw err; + hashPass = hash; + }); + }); + + console.log(newPassword); + console.log(hashPass); + + //creates updated image object + updated = { + name: name, + image: { + data: fs.readFileSync(path.join(__dirname + '/uploads/' + req.file.filename)), + contentType: 'image/png' + }, + password: hashPass + } + } + + if (useName) { + //creates updated image object + updated = { + name: name, + image: { + data: fs.readFileSync(path.join(__dirname + '/uploads/' + req.file.filename)), + contentType: 'image/png' + } + } + } + + if (useNewPassword) { + //creates updated image object + updated = { + image: { + data: fs.readFileSync(path.join(__dirname + '/uploads/' + req.file.filename)), + contentType: 'image/png' + }, + password: hashPass + } + } + + if (!useName && !useNewPassword) { + //creates updated image object + updated = { + image: { + data: fs.readFileSync(path.join(__dirname + '/uploads/' + req.file.filename)), + contentType: 'image/png' + } + } + } + //Updates user and redirects to dashboard + MongoClient.connect(db, { + useUnifiedTopology: true, + useNewUrlParser: true}, function(err, db) { + if (err) throw err; + let dbo = db.db("XPmockDB"); + dbo.collection('users').updateOne({ _id: ObjectId(_id) }, { $set: updated }, { upsert: true }, function(err, res) { + if (err) throw err; + console.log('1 Document Updated'); + console.log('With customImage'); + db.close() + }); + res.redirect('/users/login'); + } + ); + } + catch(err) { + console.log(err); + if (useName && useNewPassword) { + // Encrypts password + bcrypt.genSalt(10, (err, salt) => { + bcrypt.hash(newPassword, salt, (err, hash) => { + if (err) throw err; + hashPass = hash; + }); + }); + + console.log(newPassword); + console.log(hashPass); + + //creates updated image object + updated = { + name: name, + image: defaultImage, + password: hashPass + } + } + + if (useName) { + //creates updated image object + updated = { + name: name, + image: defaultImage + } + } + + if (useNewPassword) { + //creates updated image object + updated = { + image: defaultImage, + password: hashPass + } + } + + if (!useName && !useNewPassword) { + //creates updated image object + updated = { + image: defaultImage + } + } + //Updates user and redirects to dashboard + MongoClient.connect(db, { + useUnifiedTopology: true, + useNewUrlParser: true}, function(err, db) { + if (err) throw err; + let dbo = db.db("XPmockDB"); + dbo.collection('users').updateOne({ _id: ObjectId(_id) }, { $set: updated }, { upsert: true }, function(err, res) { + if (err) throw err; + console.log('1 Document Updated'); + console.log('With defaultImage'); + db.close() + }); + res.flash('Success') + res.redirect('/users/login'); + } + ); + } + } +}); + // Register router.post('/register', upload.single('image'), (req, res, next) => { + // Passes image path to defaultImage Model + path = __dirname + '/uploads/image-1606947471396'; + module.exports = { + path: path + } + // Collects input const { name, email, password, password2 } = req.body; let errors = []; @@ -75,35 +282,67 @@ router.post('/register', upload.single('image'), (req, res, next) => { 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)); + try { + // Creates new User Object + const newUser = new User({ + name, + email, + password, + image: { + data: fs.readFileSync(path.join(__dirname + '/uploads/' + req.file.filename)), + contentType: 'image/png' + } }); - }); + + // 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)); + }); + }); + } + catch(err) { + const defaultImage = require('../models/defaultImage').defaultImage; + // Creates new User Object + const newUser = new User({ + name, + email, + password, + image: defaultImage + }); + + // 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)); + }); + }); + } } }); } diff --git a/views/edit.ejs b/views/edit.ejs new file mode 100644 index 0000000..5c9dfde --- /dev/null +++ b/views/edit.ejs @@ -0,0 +1,67 @@ +
+
+
+

+ Edit Account +

+ <% include ./partials/messages %> +
+ + + + +
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+
diff --git a/views/register.ejs b/views/register.ejs index 8a62adf..e888ec8 100644 --- a/views/register.ejs +++ b/views/register.ejs @@ -21,6 +21,10 @@ +
+ + +
Logout +
<% } %>