From 0347ed6467cba65e7e4702c08cab8ff7ac6a0632 Mon Sep 17 00:00:00 2001 From: Ahsan Ihsan Date: Tue, 20 Oct 2020 02:15:01 +0500 Subject: [PATCH 1/5] Added gitignore file with nodemon dev dependency --- .gitignore | 3 + project/controllers/employeeController.js | 172 +++++++++++----------- project/models/db.js | 19 ++- project/models/employee.model.js | 41 +++--- project/package.json | 7 +- 5 files changed, 128 insertions(+), 114 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..5c9b96a2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +project/node_modules +project/yarn.lock +project/package-lock.json diff --git a/project/controllers/employeeController.js b/project/controllers/employeeController.js index c7ab3c24..f17bdf65 100644 --- a/project/controllers/employeeController.js +++ b/project/controllers/employeeController.js @@ -1,110 +1,106 @@ -const express = require('express'); +const express = require("express"); var router = express.Router(); -const mongoose = require('mongoose'); -const Employee = mongoose.model('Employee'); +const mongoose = require("mongoose"); +const Employee = mongoose.model("Employee"); -router.get('/', (req, res) => { - res.render("employee/addOrEdit", { - viewTitle: "Insert Employee" - }); +router.get("/", (req, res) => { + res.render("employee/addOrEdit", { + viewTitle: "Insert Employee", + }); }); -router.post('/', (req, res) => { - if (req.body._id == '') - insertRecord(req, res); - else - updateRecord(req, res); +router.post("/", (req, res) => { + if (req.body._id == "") insertRecord(req, res); + else updateRecord(req, res); }); - function insertRecord(req, res) { - var employee = new Employee(); - employee.fullName = req.body.fullName; - employee.email = req.body.email; - employee.mobile = req.body.mobile; - employee.city = req.body.city; - employee.save((err, doc) => { - if (!err) - res.redirect('employee/list'); - else { - if (err.name == 'ValidationError') { - handleValidationError(err, req.body); - res.render("employee/addOrEdit", { - viewTitle: "Insert Employee", - employee: req.body - }); - } - else - console.log('Error during record insertion : ' + err); - } - }); + var employee = new Employee(); + employee.fullName = req.body.fullName; + employee.email = req.body.email; + employee.mobile = req.body.mobile; + employee.city = req.body.city; + employee.save((err, doc) => { + if (!err) res.redirect("employee/list"); + else { + if (err.name == "ValidationError") { + handleValidationError(err, req.body); + res.render("employee/addOrEdit", { + viewTitle: "Insert Employee", + employee: req.body, + }); + } else console.log("Error during record insertion : " + err); + } + }); } function updateRecord(req, res) { - Employee.findOneAndUpdate({ _id: req.body._id }, req.body, { new: true }, (err, doc) => { - if (!err) { res.redirect('employee/list'); } - else { - if (err.name == 'ValidationError') { - handleValidationError(err, req.body); - res.render("employee/addOrEdit", { - viewTitle: 'Update Employee', - employee: req.body - }); - } - else - console.log('Error during record update : ' + err); - } - }); + Employee.findOneAndUpdate( + { _id: req.body._id }, + req.body, + { new: true }, + (err, doc) => { + if (!err) { + res.redirect("employee/list"); + } else { + if (err.name == "ValidationError") { + handleValidationError(err, req.body); + res.render("employee/addOrEdit", { + viewTitle: "Update Employee", + employee: req.body, + }); + } else console.log("Error during record update : " + err); + } + } + ); } - -router.get('/list', (req, res) => { - Employee.find((err, docs) => { - if (!err) { - res.render("employee/list", { - list: docs - }); - } - else { - console.log('Error in retrieving employee list :' + err); - } - }); +router.get("/list", (req, res) => { + Employee.find((err, docs) => { + if (!err) { + res.render("employee/list", { + list: docs, + }); + } else { + console.log("Error in retrieving employee list :" + err); + } + }); }); - function handleValidationError(err, body) { - for (field in err.errors) { - switch (err.errors[field].path) { - case 'fullName': - body['fullNameError'] = err.errors[field].message; - break; - case 'email': - body['emailError'] = err.errors[field].message; - break; - default: - break; - } + for (field in err.errors) { + switch (err.errors[field].path) { + case "fullName": + body["fullNameError"] = err.errors[field].message; + break; + case "email": + body["emailError"] = err.errors[field].message; + break; + default: + break; } + } } -router.get('/:id', (req, res) => { - Employee.findById(req.params.id, (err, doc) => { - if (!err) { - res.render("employee/addOrEdit", { - viewTitle: "Update Employee", - employee: doc - }); - } - }); +router.get("/:id", (req, res) => { + Employee.findById(req.params.id, (err, doc) => { + if (!err) { + res.render("employee/addOrEdit", { + viewTitle: "Update Employee", + employee: doc, + }); + } + }); }); -router.get('/delete/:id', (req, res) => { - Employee.findByIdAndRemove(req.params.id, (err, doc) => { - if (!err) { - res.redirect('/employee/list'); - } - else { console.log('Error in employee delete :' + err); } - }); +router.get("/delete/:id", (req, res) => { + Employee.findByIdAndRemove(req.params.id, (err, doc) => { + if (!err) { + res.redirect("/employee/list"); + } else { + console.log("Error in employee delete :" + err); + } + }); }); -module.exports = router; \ No newline at end of file +module.exports = router; diff --git a/project/models/db.js b/project/models/db.js index 0c133dc3..eba18f9e 100644 --- a/project/models/db.js +++ b/project/models/db.js @@ -1,8 +1,15 @@ -const mongoose = require('mongoose'); +const mongoose = require("mongoose"); -mongoose.connect('mongodb://localhost:27017/EmployeeDB', { useNewUrlParser: true }, (err) => { - if (!err) { console.log('MongoDB Connection Succeeded.') } - else { console.log('Error in DB connection : ' + err) } -}); +mongoose.connect( + "mongodb://localhost:27017/EmployeeDB", + { useNewUrlParser: true }, + (err) => { + if (!err) { + console.log("MongoDB Connection Succeeded."); + } else { + console.log("Error in DB connection : " + err); + } + } +); -require('./employee.model'); \ No newline at end of file +require("./employee.model"); diff --git a/project/models/employee.model.js b/project/models/employee.model.js index 506d760e..8ba8e011 100644 --- a/project/models/employee.model.js +++ b/project/models/employee.model.js @@ -1,25 +1,28 @@ -const mongoose = require('mongoose'); +const mongoose = require("mongoose"); var employeeSchema = new mongoose.Schema({ - fullName: { - type: String, - required: 'This field is required.' - }, - email: { - type: String - }, - mobile: { - type: String - }, - city: { - type: String - } + fullName: { + type: String, + required: "This field is required.", + }, + email: { + type: String, + }, + mobile: { + type: String, + }, + city: { + type: String, + }, + password: { + type: String, + }, }); // Custom validation for email -employeeSchema.path('email').validate((val) => { - emailRegex = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; - return emailRegex.test(val); -}, 'Invalid e-mail.'); +employeeSchema.path("email").validate((val) => { + emailRegex = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; + return emailRegex.test(val); +}, "Invalid e-mail."); -mongoose.model('Employee', employeeSchema); \ No newline at end of file +mongoose.model("Employee", employeeSchema); diff --git a/project/package.json b/project/package.json index 595dcb8f..47d2a935 100644 --- a/project/package.json +++ b/project/package.json @@ -4,7 +4,8 @@ "description": "", "main": "server.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "echo \"Error: no test specified\" && exit 1", + "dev": "nodemon" }, "author": "", "license": "ISC", @@ -12,6 +13,10 @@ "body-parser": "^1.18.3", "express": "^4.16.4", "express-handlebars": "^3.0.0", + "jsonwebtoken": "^8.5.1", "mongoose": "^5.3.4" + }, + "devDependencies": { + "nodemon": "^2.0.6" } } From 8a0ee946604b661d1e9c11e634266f79f12932b5 Mon Sep 17 00:00:00 2001 From: Ahsan Ihsan Date: Tue, 20 Oct 2020 02:20:28 +0500 Subject: [PATCH 2/5] Added environment variable functionality --- project/package.json | 1 + project/server.js | 39 ++++++++++++++++++++++++--------------- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/project/package.json b/project/package.json index 47d2a935..f280cd3e 100644 --- a/project/package.json +++ b/project/package.json @@ -10,6 +10,7 @@ "author": "", "license": "ISC", "dependencies": { + "bcrypt": "^5.0.0", "body-parser": "^1.18.3", "express": "^4.16.4", "express-handlebars": "^3.0.0", diff --git a/project/server.js b/project/server.js index 2a78978b..3729c454 100644 --- a/project/server.js +++ b/project/server.js @@ -1,23 +1,32 @@ -require('./models/db'); +require("./models/db"); -const express = require('express'); -const path = require('path'); -const exphbs = require('express-handlebars'); -const bodyparser = require('body-parser'); +const express = require("express"); +const path = require("path"); +const exphbs = require("express-handlebars"); +const bodyparser = require("body-parser"); -const employeeController = require('./controllers/employeeController'); +const employeeController = require("./controllers/employeeController"); var app = express(); -app.use(bodyparser.urlencoded({ - extended: true -})); +app.use( + bodyparser.urlencoded({ + extended: true, + }) +); app.use(bodyparser.json()); -app.set('views', path.join(__dirname, '/views/')); -app.engine('hbs', exphbs({ extname: 'hbs', defaultLayout: 'mainLayout', layoutsDir: __dirname + '/views/layouts/' })); -app.set('view engine', 'hbs'); +app.set("views", path.join(__dirname, "/views/")); +app.engine( + "hbs", + exphbs({ + extname: "hbs", + defaultLayout: "mainLayout", + layoutsDir: __dirname + "/views/layouts/", + }) +); +app.set("view engine", "hbs"); -app.listen(3000, () => { - console.log('Express server started at port : 3000'); +app.listen(process.env.PORT || 3000, () => { + console.log("Express server started at port : 3000"); }); -app.use('/employee', employeeController); \ No newline at end of file +app.use("/employee", employeeController); From 8aa4a14cc6eb5b4303b355175da0202859ff904b Mon Sep 17 00:00:00 2001 From: Ahsan Ihsan Date: Tue, 20 Oct 2020 02:22:29 +0500 Subject: [PATCH 3/5] Fixed PORT number issue not rendering on console --- project/server.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/project/server.js b/project/server.js index 3729c454..457878d3 100644 --- a/project/server.js +++ b/project/server.js @@ -25,8 +25,9 @@ app.engine( ); app.set("view engine", "hbs"); -app.listen(process.env.PORT || 3000, () => { - console.log("Express server started at port : 3000"); +const PORT = process.env.PORT || 3000; +app.listen(PORT, () => { + console.log("Express server started at port : " + PORT); }); app.use("/employee", employeeController); From 345186c7be95b0976a2f93ed41845599a242cc0e Mon Sep 17 00:00:00 2001 From: Ahsan Ihsan Date: Tue, 20 Oct 2020 02:31:18 +0500 Subject: [PATCH 4/5] Allowed insecure prototype access to handle the problem with listing --- project/controllers/employeeController.js | 1 + project/package.json | 2 ++ project/server.js | 5 +++++ 3 files changed, 8 insertions(+) diff --git a/project/controllers/employeeController.js b/project/controllers/employeeController.js index f17bdf65..0bac06c5 100644 --- a/project/controllers/employeeController.js +++ b/project/controllers/employeeController.js @@ -20,6 +20,7 @@ function insertRecord(req, res) { employee.email = req.body.email; employee.mobile = req.body.mobile; employee.city = req.body.city; + console.log(req.body); employee.save((err, doc) => { if (!err) res.redirect("employee/list"); else { diff --git a/project/package.json b/project/package.json index f280cd3e..a5e3752b 100644 --- a/project/package.json +++ b/project/package.json @@ -10,6 +10,7 @@ "author": "", "license": "ISC", "dependencies": { + "@handlebars/allow-prototype-access": "^1.0.3", "bcrypt": "^5.0.0", "body-parser": "^1.18.3", "express": "^4.16.4", @@ -18,6 +19,7 @@ "mongoose": "^5.3.4" }, "devDependencies": { + "handlebars": "^4.7.6", "nodemon": "^2.0.6" } } diff --git a/project/server.js b/project/server.js index 457878d3..0cd02bc5 100644 --- a/project/server.js +++ b/project/server.js @@ -3,7 +3,11 @@ require("./models/db"); const express = require("express"); const path = require("path"); const exphbs = require("express-handlebars"); +const Handlebars = require("handlebars"); const bodyparser = require("body-parser"); +const { + allowInsecurePrototypeAccess, +} = require("@handlebars/allow-prototype-access"); const employeeController = require("./controllers/employeeController"); @@ -21,6 +25,7 @@ app.engine( extname: "hbs", defaultLayout: "mainLayout", layoutsDir: __dirname + "/views/layouts/", + handlebars: allowInsecurePrototypeAccess(Handlebars), }) ); app.set("view engine", "hbs"); From 6b80e2d213c239857fe6bab93eec46464e1d1f68 Mon Sep 17 00:00:00 2001 From: Ahsan Ihsan Date: Tue, 20 Oct 2020 02:34:32 +0500 Subject: [PATCH 5/5] Removed un necessary packages --- project/package.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/project/package.json b/project/package.json index a5e3752b..bfa29501 100644 --- a/project/package.json +++ b/project/package.json @@ -11,11 +11,9 @@ "license": "ISC", "dependencies": { "@handlebars/allow-prototype-access": "^1.0.3", - "bcrypt": "^5.0.0", "body-parser": "^1.18.3", "express": "^4.16.4", "express-handlebars": "^3.0.0", - "jsonwebtoken": "^8.5.1", "mongoose": "^5.3.4" }, "devDependencies": {