From 9b2e713e7171c36a145b5d0af9461884b848e9af Mon Sep 17 00:00:00 2001 From: jarrodback Date: Tue, 1 Feb 2022 10:17:29 +0000 Subject: [PATCH 1/6] HT-6 Create auth route --- server/routers/auth.routes.js | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 server/routers/auth.routes.js diff --git a/server/routers/auth.routes.js b/server/routers/auth.routes.js new file mode 100644 index 0000000..7c3714b --- /dev/null +++ b/server/routers/auth.routes.js @@ -0,0 +1,2 @@ +var express = require("express"); +var router = express.Router(); From 1ac1997c7628a8ef5f0df18549091a6dcb841642 Mon Sep 17 00:00:00 2001 From: jarrodback Date: Tue, 1 Feb 2022 11:21:07 +0000 Subject: [PATCH 2/6] HT-6 Add auth endpoints and data layer --- server/business/user.business.js | 129 ++++++++++++++++++++++++++ server/controllers/auth.controller.js | 52 +++++++++++ server/datalayer/mongo.js | 22 +++++ server/middleware/auth/authJwt.js | 42 +++++++++ server/models/user.model.js | 31 +++++++ server/routers/auth.routes.js | 2 - server/routes/auth.routes.js | 16 ++++ 7 files changed, 292 insertions(+), 2 deletions(-) create mode 100644 server/business/user.business.js create mode 100644 server/controllers/auth.controller.js create mode 100644 server/datalayer/mongo.js create mode 100644 server/middleware/auth/authJwt.js create mode 100644 server/models/user.model.js delete mode 100644 server/routers/auth.routes.js create mode 100644 server/routes/auth.routes.js diff --git a/server/business/user.business.js b/server/business/user.business.js new file mode 100644 index 0000000..714b084 --- /dev/null +++ b/server/business/user.business.js @@ -0,0 +1,129 @@ +const DataLayer = require("../datalayer/mongo"); +const model = require("../database").getModel("user"); +const httpError = require("http-errors"); +const jwt = require("jsonwebtoken"); +const bcrypt = require("bcryptjs"); + +class UserBusiness { + constructor() { + // Create an instance of the data layer. + this.dataLayer = new DataLayer(model); + } + + /** + * Login a user. + */ + async login(email, password) { + return this.findUserByEmail(email) + .then((users) => { + // Email is unique so only 1 can be returned. + const user = users[0]; + + const passwordIsValid = bcrypt.compareSync( + password, + user.password + ); + // Invalid password, return 401 + if (!passwordIsValid) { + throw httpError( + 401, + "Your email or password is incorrect." + ); + } + // Create token and store in the session cookie + const token = jwt.sign( + { + id: user._id, + type: user.type, + email: user.email, + username: user.username, + }, + process.env.TOKEN_SECRET, + { + expiresIn: 3600, // 1 hour + } + ); + return { + token: token, + username: user.username, + type: user.type, + id: user._id, + }; + }) + .catch(() => { + throw httpError(400, "Your email or password is incorrect."); + }); + } + + /** + * Register a user. + */ + async register(user) { + return this.createUser({ + username: user.username, + email: user.email, + password: user.password, + type: user.type, + }).catch((error) => { + if (error.message.includes("username")) + throw httpError(400, "Username is already in use."); + if (error.message.includes("email")) + throw httpError(400, "Email is already in use."); + throw httpError(400, error.message); + }); + } + + /** + * Create a user and save it to the User collection. + */ + async createUser(userToCreate) { + if (!isUserDataValid(userToCreate)) { + throw httpError(400, "User data is invalid."); + } + const user = { + username: userToCreate.username, + email: userToCreate.email, + type: userToCreate.type, + password: bcrypt.hashSync(userToCreate.password, 8), + }; + + return this.dataLayer.create(user).catch((error) => { + if (error.message.includes("username")) + throw httpError(400, "Username is already in use."); + if (error.message.includes("email")) + throw httpError(400, "Email is already in use."); + throw httpError(404, error.message); + }); + } + + /** + * Find a user by email + */ + async findUserByEmail(email) { + return this.dataLayer + .findByProperty({ email: email }) + .catch((error) => { + throw httpError(404, error.message); + }); + } +} +module.exports = UserBusiness; + +/** + * Validates the data in a User. + * + * @returns {Boolean} True if the object maps correct to the User model. + */ +function isUserDataValid(user) { + if ( + !user || + !user.username || + !user.email || + !user.type || + !user.password + ) { + return false; + } else { + return true; + } +} diff --git a/server/controllers/auth.controller.js b/server/controllers/auth.controller.js new file mode 100644 index 0000000..63a6720 --- /dev/null +++ b/server/controllers/auth.controller.js @@ -0,0 +1,52 @@ +const UserBusiness = require("../business/user.business"); +const userBusiness = new UserBusiness(); + +/** + * Login the user + */ +exports.login = async (req, res) => { + userBusiness + .login(req.body.email, req.body.password) + .then((data) => { + req.session.token = data.token; + req.session.username = data.username; + req.session.role = data.role; + req.session.id = data.id; + + res.status(200).send({ + message: "Successfully logged in.", + username: data.username, + role: data.role, + id: data.id, + }); + }) + .catch((error) => { + res.status(error.status).send({ message: error.message }); + }); +}; + +/** + * Register the user + */ +exports.register = (req, res) => { + userBusiness + .register(req.body) + .then(() => { + res.status(200).send({ + message: "User was successfully created.", + }); + }) + .catch((error) => { + res.status(error.status).send({ message: error.message }); + }); +}; + +/** + * Logs the user out + */ +exports.logout = (req, res) => { + req.session = null; + res.status(200).send({ + message: "User was successfully logged out.", + }); +}; diff --git a/server/datalayer/mongo.js b/server/datalayer/mongo.js new file mode 100644 index 0000000..693ca84 --- /dev/null +++ b/server/datalayer/mongo.js @@ -0,0 +1,22 @@ +class DataLayer { + constructor(model) { + // Set the collections model to use. + this.model = model; + } + + /** + * Create and save the record to the database. + */ + async create(recordToCreate) { + return this.model.create(recordToCreate); + } + + /** + * Find a record by property in the database. + */ + async findByProperty(propertyToFind) { + return this.model.find(propertyToFind); + } +} + +module.exports = DataLayer; diff --git a/server/middleware/auth/authJwt.js b/server/middleware/auth/authJwt.js new file mode 100644 index 0000000..45f9f37 --- /dev/null +++ b/server/middleware/auth/authJwt.js @@ -0,0 +1,42 @@ +const jwt = require("jsonwebtoken"); + +// Check if token is valid +checkJwtToken = (req, res, next) => { + if (!req.session || !req.session.token) { + return res.status(401).send({ + message: "Unauthorized: No token provided.", + }); + } + const token = req.session.token; + + jwt.verify(token, process.env.TOKEN_SECRET, (err, decoded) => { + if (err) { + return res.status(401).send({ + message: "Unauthorized: Invalid token.", + }); + } + + req.userId = decoded.id; + req.username = decoded.username; + req.email = decoded.email; + req.type = decoded.type; + return next(); + }); +}; + +isOperator = (req, res, next) => { + const type = req.type; + + if (type != "Toll Operator") { + return res.status(403).send({ + message: + "Unauthorized: You not do have permission to view this page.", + }); + } + return next(); +}; + +module.exports = { + checkJwtToken, + isOperator, +}; diff --git a/server/models/user.model.js b/server/models/user.model.js new file mode 100644 index 0000000..46580af --- /dev/null +++ b/server/models/user.model.js @@ -0,0 +1,31 @@ +// Model for the User +module.exports = (mongoose) => { + var UserSchema = mongoose.Schema({ + username: { + type: String, + required: [true, "You must supply the user's username."], + minlength: [5, "Your username must be at least 5 letters."], + unique: [true, "The username must be unique."], + }, + email: { + type: String, + required: [true, "You must supply the user's email."], + unique: [true, "The email must be unique."], + }, + password: { + type: String, + required: [true, "You must supply the user's password"], + minlength: [5, "Your password must be at least 8 letters."], + }, + type: { + type: String, + required: [true, "You must supply the user's role."], + enum: { + values: ["Driver", "Toll Operator"], + message: "Type is not valid. Must be 'Driver'.", + }, + }, + }); + + return mongoose.model("user", UserSchema); +}; diff --git a/server/routers/auth.routes.js b/server/routers/auth.routes.js deleted file mode 100644 index 7c3714b..0000000 --- a/server/routers/auth.routes.js +++ /dev/null @@ -1,2 +0,0 @@ -var express = require("express"); -var router = express.Router(); diff --git a/server/routes/auth.routes.js b/server/routes/auth.routes.js new file mode 100644 index 0000000..a664b36 --- /dev/null +++ b/server/routes/auth.routes.js @@ -0,0 +1,16 @@ +var express = require("express"); +var router = express.Router(); + +// Get the Auth controller +var authController = require("../controllers/auth.controller"); + +// Log the user in +router.post("/login/", authController.login); + +// Register the user +router.post("/register/", authController.register); + +// Log the user out +router.post("/logout/", authController.logout); + +module.exports = router; From 06bdc67e9e007b3b4b9a66c7569751da016a47ab Mon Sep 17 00:00:00 2001 From: jarrodback Date: Tue, 1 Feb 2022 12:02:10 +0000 Subject: [PATCH 3/6] HT-6 Add integration tests for login and register --- .../ecd4285b-d9dc-4104-b850-fcf81a763c89.json | 1 + .../ecd4285b-d9dc-4104-b850-fcf81a763c89.json | 1 + server/.nyc_output/processinfo/index.json | 1 + server/app.js | 14 ++ server/business/user.business.js | 14 +- server/config/db.config.js | 7 +- server/database/index.js | 7 +- server/database/seed.js | 39 ++++++ server/package.json | 13 +- .../test/integration/auth.controller.test.js | 124 ++++++++++++++++++ 10 files changed, 212 insertions(+), 9 deletions(-) create mode 100644 server/.nyc_output/ecd4285b-d9dc-4104-b850-fcf81a763c89.json create mode 100644 server/.nyc_output/processinfo/ecd4285b-d9dc-4104-b850-fcf81a763c89.json create mode 100644 server/.nyc_output/processinfo/index.json create mode 100644 server/database/seed.js create mode 100644 server/test/integration/auth.controller.test.js diff --git a/server/.nyc_output/ecd4285b-d9dc-4104-b850-fcf81a763c89.json b/server/.nyc_output/ecd4285b-d9dc-4104-b850-fcf81a763c89.json new file mode 100644 index 0000000..f1f6770 --- /dev/null +++ b/server/.nyc_output/ecd4285b-d9dc-4104-b850-fcf81a763c89.json @@ -0,0 +1 @@ +{"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\app.js":{"path":"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\app.js","statementMap":{"0":{"start":{"line":1,"column":16},"end":{"line":1,"column":34}},"1":{"start":{"line":2,"column":13},"end":{"line":2,"column":28}},"2":{"start":{"line":3,"column":19},"end":{"line":3,"column":41}},"3":{"start":{"line":4,"column":13},"end":{"line":4,"column":28}},"4":{"start":{"line":5,"column":22},"end":{"line":5,"column":47}},"5":{"start":{"line":6,"column":21},"end":{"line":6,"column":45}},"6":{"start":{"line":8,"column":0},"end":{"line":8,"column":22}},"7":{"start":{"line":9,"column":0},"end":{"line":9,"column":27}},"8":{"start":{"line":11,"column":10},"end":{"line":11,"column":19}},"9":{"start":{"line":13,"column":0},"end":{"line":20,"column":2}},"10":{"start":{"line":22,"column":0},"end":{"line":22,"column":70}},"11":{"start":{"line":27,"column":17},"end":{"line":27,"column":48}},"12":{"start":{"line":32,"column":0},"end":{"line":32,"column":48}},"13":{"start":{"line":33,"column":0},"end":{"line":33,"column":26}},"14":{"start":{"line":34,"column":0},"end":{"line":34,"column":24}},"15":{"start":{"line":35,"column":0},"end":{"line":35,"column":49}},"16":{"start":{"line":36,"column":0},"end":{"line":36,"column":27}},"17":{"start":{"line":37,"column":0},"end":{"line":37,"column":51}},"18":{"start":{"line":38,"column":0},"end":{"line":38,"column":56}},"19":{"start":{"line":39,"column":0},"end":{"line":39,"column":24}},"20":{"start":{"line":42,"column":0},"end":{"line":42,"column":29}},"21":{"start":{"line":44,"column":0},"end":{"line":44,"column":21}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"11ccd35b25bc03399529e577dd05b66ec3260d7a","contentHash":"0636fb23e5ab827a538b867768125a4ec2efbef2d174cc4b87e301bfac380fe5"},"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\database\\index.js":{"path":"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\database\\index.js","statementMap":{"0":{"start":{"line":2,"column":17},"end":{"line":2,"column":36}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":34}},"2":{"start":{"line":4,"column":20},"end":{"line":4,"column":40}},"3":{"start":{"line":5,"column":17},"end":{"line":5,"column":63}},"4":{"start":{"line":8,"column":11},"end":{"line":8,"column":13}},"5":{"start":{"line":9,"column":0},"end":{"line":9,"column":23}},"6":{"start":{"line":10,"column":0},"end":{"line":10,"column":22}},"7":{"start":{"line":12,"column":0},"end":{"line":15,"column":3}},"8":{"start":{"line":13,"column":4},"end":{"line":13,"column":46}},"9":{"start":{"line":14,"column":4},"end":{"line":14,"column":54}},"10":{"start":{"line":17,"column":4},"end":{"line":17,"column":45}},"11":{"start":{"line":21,"column":0},"end":{"line":21,"column":56}},"12":{"start":{"line":24,"column":0},"end":{"line":35,"column":7}},"13":{"start":{"line":30,"column":8},"end":{"line":30,"column":71}},"14":{"start":{"line":33,"column":8},"end":{"line":33,"column":60}},"15":{"start":{"line":34,"column":8},"end":{"line":34,"column":23}},"16":{"start":{"line":37,"column":0},"end":{"line":37,"column":20}},"17":{"start":{"line":39,"column":0},"end":{"line":43,"column":2}},"18":{"start":{"line":41,"column":8},"end":{"line":41,"column":44}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":12,"column":19},"end":{"line":12,"column":20}},"loc":{"start":{"line":12,"column":31},"end":{"line":15,"column":1}},"line":12},"1":{"name":"setRunValidators","decl":{"start":{"line":16,"column":9},"end":{"line":16,"column":25}},"loc":{"start":{"line":16,"column":28},"end":{"line":18,"column":1}},"line":16},"2":{"name":"(anonymous_2)","decl":{"start":{"line":29,"column":10},"end":{"line":29,"column":11}},"loc":{"start":{"line":29,"column":16},"end":{"line":31,"column":5}},"line":29},"3":{"name":"(anonymous_3)","decl":{"start":{"line":32,"column":11},"end":{"line":32,"column":12}},"loc":{"start":{"line":32,"column":20},"end":{"line":35,"column":5}},"line":32},"4":{"name":"(anonymous_4)","decl":{"start":{"line":40,"column":14},"end":{"line":40,"column":15}},"loc":{"start":{"line":40,"column":29},"end":{"line":42,"column":5}},"line":40}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":0,"11":1,"12":1,"13":1,"14":0,"15":0,"16":1,"17":1,"18":1},"f":{"0":1,"1":0,"2":1,"3":0,"4":1},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"fae86148bf61f4a322fba8bbbb3b7a29d20fc5a6","contentHash":"5e08bb204df9b21ece3cb6d108c7ef4056f7aaaa99bf46f50a414e7857aba1df"},"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\config\\db.config.js":{"path":"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\config\\db.config.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":8,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"29ec18e9e0fd4b0136e4b343c92d26a51723487f","contentHash":"11e17e0e2a0410bae5adc9abc706b44a2d2d148049b4f6e1c5bb83b4b9a52526"},"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\models\\user.model.js":{"path":"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\models\\user.model.js","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":31,"column":2}},"1":{"start":{"line":3,"column":21},"end":{"line":28,"column":6}},"2":{"start":{"line":30,"column":4},"end":{"line":30,"column":46}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":2,"column":17},"end":{"line":2,"column":18}},"loc":{"start":{"line":2,"column":31},"end":{"line":31,"column":1}},"line":2}},"branchMap":{},"s":{"0":1,"1":1,"2":1},"f":{"0":1},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"0fe07b1ae721fca09401c7619103d4e7109621c0","contentHash":"5d48671eaf2af3cb6d49251f5cf8e325aeb82c49b954287ed4d7ac1e6f68b385"},"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\routes\\auth.routes.js":{"path":"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\routes\\auth.routes.js","statementMap":{"0":{"start":{"line":1,"column":14},"end":{"line":1,"column":32}},"1":{"start":{"line":2,"column":13},"end":{"line":2,"column":29}},"2":{"start":{"line":5,"column":21},"end":{"line":5,"column":62}},"3":{"start":{"line":8,"column":0},"end":{"line":8,"column":45}},"4":{"start":{"line":11,"column":0},"end":{"line":11,"column":51}},"5":{"start":{"line":14,"column":0},"end":{"line":14,"column":47}},"6":{"start":{"line":16,"column":0},"end":{"line":16,"column":24}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"2f03f9a2013dfc35743fcc86477c514581e2714e","contentHash":"861f9a3a5bcafa073d4fab99793c417f8844072a8885f53c46840440c5ceba9e"},"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\controllers\\auth.controller.js":{"path":"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\controllers\\auth.controller.js","statementMap":{"0":{"start":{"line":1,"column":21},"end":{"line":1,"column":57}},"1":{"start":{"line":2,"column":21},"end":{"line":2,"column":39}},"2":{"start":{"line":7,"column":0},"end":{"line":26,"column":2}},"3":{"start":{"line":8,"column":4},"end":{"line":25,"column":11}},"4":{"start":{"line":11,"column":12},"end":{"line":11,"column":43}},"5":{"start":{"line":12,"column":12},"end":{"line":12,"column":49}},"6":{"start":{"line":13,"column":12},"end":{"line":13,"column":41}},"7":{"start":{"line":14,"column":12},"end":{"line":14,"column":37}},"8":{"start":{"line":16,"column":12},"end":{"line":21,"column":15}},"9":{"start":{"line":24,"column":12},"end":{"line":24,"column":70}},"10":{"start":{"line":31,"column":0},"end":{"line":42,"column":2}},"11":{"start":{"line":32,"column":4},"end":{"line":41,"column":11}},"12":{"start":{"line":35,"column":12},"end":{"line":37,"column":15}},"13":{"start":{"line":40,"column":12},"end":{"line":40,"column":70}},"14":{"start":{"line":47,"column":0},"end":{"line":52,"column":2}},"15":{"start":{"line":48,"column":4},"end":{"line":48,"column":23}},"16":{"start":{"line":49,"column":4},"end":{"line":51,"column":7}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":7,"column":16},"end":{"line":7,"column":17}},"loc":{"start":{"line":7,"column":36},"end":{"line":26,"column":1}},"line":7},"1":{"name":"(anonymous_1)","decl":{"start":{"line":10,"column":14},"end":{"line":10,"column":15}},"loc":{"start":{"line":10,"column":24},"end":{"line":22,"column":9}},"line":10},"2":{"name":"(anonymous_2)","decl":{"start":{"line":23,"column":15},"end":{"line":23,"column":16}},"loc":{"start":{"line":23,"column":26},"end":{"line":25,"column":9}},"line":23},"3":{"name":"(anonymous_3)","decl":{"start":{"line":31,"column":19},"end":{"line":31,"column":20}},"loc":{"start":{"line":31,"column":33},"end":{"line":42,"column":1}},"line":31},"4":{"name":"(anonymous_4)","decl":{"start":{"line":34,"column":14},"end":{"line":34,"column":15}},"loc":{"start":{"line":34,"column":20},"end":{"line":38,"column":9}},"line":34},"5":{"name":"(anonymous_5)","decl":{"start":{"line":39,"column":15},"end":{"line":39,"column":16}},"loc":{"start":{"line":39,"column":26},"end":{"line":41,"column":9}},"line":39},"6":{"name":"(anonymous_6)","decl":{"start":{"line":47,"column":17},"end":{"line":47,"column":18}},"loc":{"start":{"line":47,"column":31},"end":{"line":52,"column":1}},"line":47}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":2,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":4,"12":1,"13":3,"14":1,"15":0,"16":0},"f":{"0":2,"1":1,"2":1,"3":4,"4":1,"5":3,"6":0},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"0ef843f2afd10703a57df7d8636bb043b448f61e","contentHash":"87ebbd8ca9f0d4a72cb5845b900e11feaa02e5229ed52faf31ae5ea9f0aed857"},"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\business\\user.business.js":{"path":"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\business\\user.business.js","statementMap":{"0":{"start":{"line":1,"column":18},"end":{"line":1,"column":47}},"1":{"start":{"line":2,"column":14},"end":{"line":2,"column":53}},"2":{"start":{"line":3,"column":18},"end":{"line":3,"column":40}},"3":{"start":{"line":4,"column":12},"end":{"line":4,"column":35}},"4":{"start":{"line":5,"column":15},"end":{"line":5,"column":34}},"5":{"start":{"line":10,"column":8},"end":{"line":10,"column":46}},"6":{"start":{"line":17,"column":8},"end":{"line":55,"column":15}},"7":{"start":{"line":20,"column":29},"end":{"line":20,"column":37}},"8":{"start":{"line":22,"column":40},"end":{"line":25,"column":17}},"9":{"start":{"line":27,"column":16},"end":{"line":32,"column":17}},"10":{"start":{"line":28,"column":20},"end":{"line":31,"column":22}},"11":{"start":{"line":34,"column":30},"end":{"line":45,"column":17}},"12":{"start":{"line":46,"column":16},"end":{"line":51,"column":18}},"13":{"start":{"line":54,"column":16},"end":{"line":54,"column":77}},"14":{"start":{"line":62,"column":8},"end":{"line":67,"column":9}},"15":{"start":{"line":63,"column":12},"end":{"line":66,"column":14}},"16":{"start":{"line":68,"column":8},"end":{"line":75,"column":11}},"17":{"start":{"line":74,"column":12},"end":{"line":74,"column":48}},"18":{"start":{"line":82,"column":8},"end":{"line":84,"column":9}},"19":{"start":{"line":83,"column":12},"end":{"line":83,"column":58}},"20":{"start":{"line":85,"column":21},"end":{"line":90,"column":9}},"21":{"start":{"line":92,"column":8},"end":{"line":98,"column":11}},"22":{"start":{"line":93,"column":12},"end":{"line":94,"column":68}},"23":{"start":{"line":94,"column":16},"end":{"line":94,"column":68}},"24":{"start":{"line":95,"column":12},"end":{"line":96,"column":65}},"25":{"start":{"line":96,"column":16},"end":{"line":96,"column":65}},"26":{"start":{"line":97,"column":12},"end":{"line":97,"column":48}},"27":{"start":{"line":105,"column":8},"end":{"line":109,"column":15}},"28":{"start":{"line":108,"column":16},"end":{"line":108,"column":52}},"29":{"start":{"line":112,"column":0},"end":{"line":112,"column":30}},"30":{"start":{"line":120,"column":4},"end":{"line":130,"column":5}},"31":{"start":{"line":127,"column":8},"end":{"line":127,"column":21}},"32":{"start":{"line":129,"column":8},"end":{"line":129,"column":20}},"33":{"start":{"line":134,"column":4},"end":{"line":134,"column":41}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":8,"column":4},"end":{"line":8,"column":5}},"loc":{"start":{"line":8,"column":18},"end":{"line":11,"column":5}},"line":8},"1":{"name":"(anonymous_1)","decl":{"start":{"line":16,"column":4},"end":{"line":16,"column":5}},"loc":{"start":{"line":16,"column":33},"end":{"line":56,"column":5}},"line":16},"2":{"name":"(anonymous_2)","decl":{"start":{"line":18,"column":18},"end":{"line":18,"column":19}},"loc":{"start":{"line":18,"column":29},"end":{"line":52,"column":13}},"line":18},"3":{"name":"(anonymous_3)","decl":{"start":{"line":53,"column":19},"end":{"line":53,"column":20}},"loc":{"start":{"line":53,"column":25},"end":{"line":55,"column":13}},"line":53},"4":{"name":"(anonymous_4)","decl":{"start":{"line":61,"column":4},"end":{"line":61,"column":5}},"loc":{"start":{"line":61,"column":25},"end":{"line":76,"column":5}},"line":61},"5":{"name":"(anonymous_5)","decl":{"start":{"line":73,"column":17},"end":{"line":73,"column":18}},"loc":{"start":{"line":73,"column":28},"end":{"line":75,"column":9}},"line":73},"6":{"name":"(anonymous_6)","decl":{"start":{"line":81,"column":4},"end":{"line":81,"column":5}},"loc":{"start":{"line":81,"column":35},"end":{"line":99,"column":5}},"line":81},"7":{"name":"(anonymous_7)","decl":{"start":{"line":92,"column":49},"end":{"line":92,"column":50}},"loc":{"start":{"line":92,"column":60},"end":{"line":98,"column":9}},"line":92},"8":{"name":"(anonymous_8)","decl":{"start":{"line":104,"column":4},"end":{"line":104,"column":5}},"loc":{"start":{"line":104,"column":33},"end":{"line":110,"column":5}},"line":104},"9":{"name":"(anonymous_9)","decl":{"start":{"line":107,"column":19},"end":{"line":107,"column":20}},"loc":{"start":{"line":107,"column":30},"end":{"line":109,"column":13}},"line":107},"10":{"name":"isUserDataValid","decl":{"start":{"line":119,"column":9},"end":{"line":119,"column":24}},"loc":{"start":{"line":119,"column":31},"end":{"line":131,"column":1}},"line":119},"11":{"name":"isUserADriver","decl":{"start":{"line":133,"column":9},"end":{"line":133,"column":22}},"loc":{"start":{"line":133,"column":29},"end":{"line":135,"column":1}},"line":133}},"branchMap":{"0":{"loc":{"start":{"line":27,"column":16},"end":{"line":32,"column":17}},"type":"if","locations":[{"start":{"line":27,"column":16},"end":{"line":32,"column":17}},{"start":{"line":27,"column":16},"end":{"line":32,"column":17}}],"line":27},"1":{"loc":{"start":{"line":62,"column":8},"end":{"line":67,"column":9}},"type":"if","locations":[{"start":{"line":62,"column":8},"end":{"line":67,"column":9}},{"start":{"line":62,"column":8},"end":{"line":67,"column":9}}],"line":62},"2":{"loc":{"start":{"line":82,"column":8},"end":{"line":84,"column":9}},"type":"if","locations":[{"start":{"line":82,"column":8},"end":{"line":84,"column":9}},{"start":{"line":82,"column":8},"end":{"line":84,"column":9}}],"line":82},"3":{"loc":{"start":{"line":93,"column":12},"end":{"line":94,"column":68}},"type":"if","locations":[{"start":{"line":93,"column":12},"end":{"line":94,"column":68}},{"start":{"line":93,"column":12},"end":{"line":94,"column":68}}],"line":93},"4":{"loc":{"start":{"line":95,"column":12},"end":{"line":96,"column":65}},"type":"if","locations":[{"start":{"line":95,"column":12},"end":{"line":96,"column":65}},{"start":{"line":95,"column":12},"end":{"line":96,"column":65}}],"line":95},"5":{"loc":{"start":{"line":120,"column":4},"end":{"line":130,"column":5}},"type":"if","locations":[{"start":{"line":120,"column":4},"end":{"line":130,"column":5}},{"start":{"line":120,"column":4},"end":{"line":130,"column":5}}],"line":120},"6":{"loc":{"start":{"line":121,"column":8},"end":{"line":125,"column":22}},"type":"binary-expr","locations":[{"start":{"line":121,"column":8},"end":{"line":121,"column":13}},{"start":{"line":122,"column":8},"end":{"line":122,"column":22}},{"start":{"line":123,"column":8},"end":{"line":123,"column":19}},{"start":{"line":124,"column":8},"end":{"line":124,"column":18}},{"start":{"line":125,"column":8},"end":{"line":125,"column":22}}],"line":121},"7":{"loc":{"start":{"line":134,"column":11},"end":{"line":134,"column":40}},"type":"binary-expr","locations":[{"start":{"line":134,"column":11},"end":{"line":134,"column":15}},{"start":{"line":134,"column":19},"end":{"line":134,"column":40}}],"line":134}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":2,"7":2,"8":2,"9":2,"10":1,"11":1,"12":1,"13":1,"14":4,"15":1,"16":3,"17":2,"18":3,"19":0,"20":3,"21":3,"22":2,"23":1,"24":1,"25":1,"26":0,"27":2,"28":0,"29":1,"30":3,"31":0,"32":3,"33":4},"f":{"0":1,"1":2,"2":2,"3":1,"4":4,"5":2,"6":3,"7":2,"8":2,"9":0,"10":3,"11":4},"b":{"0":[1,1],"1":[1,3],"2":[0,3],"3":[1,1],"4":[1,0],"5":[0,3],"6":[3,3,3,3,3],"7":[4,4]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"54e049c4ae4af4eb89389e3882c0e369f3336eeb","contentHash":"e8a98c787a554b023d6c52e47fd8a29bd9245a79eed44e4dfe10a88f84eda107"},"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\datalayer\\mongo.js":{"path":"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\datalayer\\mongo.js","statementMap":{"0":{"start":{"line":4,"column":8},"end":{"line":4,"column":27}},"1":{"start":{"line":11,"column":8},"end":{"line":11,"column":49}},"2":{"start":{"line":18,"column":8},"end":{"line":18,"column":47}},"3":{"start":{"line":22,"column":0},"end":{"line":22,"column":27}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":2,"column":4},"end":{"line":2,"column":5}},"loc":{"start":{"line":2,"column":23},"end":{"line":5,"column":5}},"line":2},"1":{"name":"(anonymous_1)","decl":{"start":{"line":10,"column":4},"end":{"line":10,"column":5}},"loc":{"start":{"line":10,"column":33},"end":{"line":12,"column":5}},"line":10},"2":{"name":"(anonymous_2)","decl":{"start":{"line":17,"column":4},"end":{"line":17,"column":5}},"loc":{"start":{"line":17,"column":41},"end":{"line":19,"column":5}},"line":17}},"branchMap":{},"s":{"0":1,"1":3,"2":2,"3":1},"f":{"0":1,"1":3,"2":2},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"c226779b2373c72053bcac747e240dd7e105ec7a","contentHash":"415fd02cf1824e83293dc861c7aaa18a41fc6f08b44aa9200cc83b7dc2639260"}} \ No newline at end of file diff --git a/server/.nyc_output/processinfo/ecd4285b-d9dc-4104-b850-fcf81a763c89.json b/server/.nyc_output/processinfo/ecd4285b-d9dc-4104-b850-fcf81a763c89.json new file mode 100644 index 0000000..4c1afdf --- /dev/null +++ b/server/.nyc_output/processinfo/ecd4285b-d9dc-4104-b850-fcf81a763c89.json @@ -0,0 +1 @@ +{"parent":null,"pid":7696,"argv":["C:\\Program Files\\nodejs\\node.exe","C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\node_modules\\mocha\\bin\\mocha","--recursive","--timeout","5000","--exit"],"execArgv":[],"cwd":"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server","time":1643716874833,"ppid":23016,"coverageFilename":"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\.nyc_output\\ecd4285b-d9dc-4104-b850-fcf81a763c89.json","externalId":"","uuid":"ecd4285b-d9dc-4104-b850-fcf81a763c89","files":["C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\app.js","C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\database\\index.js","C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\config\\db.config.js","C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\models\\user.model.js","C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\routes\\auth.routes.js","C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\controllers\\auth.controller.js","C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\business\\user.business.js","C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\datalayer\\mongo.js"]} \ No newline at end of file diff --git a/server/.nyc_output/processinfo/index.json b/server/.nyc_output/processinfo/index.json new file mode 100644 index 0000000..83b4e73 --- /dev/null +++ b/server/.nyc_output/processinfo/index.json @@ -0,0 +1 @@ +{"processes":{"ecd4285b-d9dc-4104-b850-fcf81a763c89":{"parent":null,"children":[]}},"files":{"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\app.js":["ecd4285b-d9dc-4104-b850-fcf81a763c89"],"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\database\\index.js":["ecd4285b-d9dc-4104-b850-fcf81a763c89"],"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\config\\db.config.js":["ecd4285b-d9dc-4104-b850-fcf81a763c89"],"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\models\\user.model.js":["ecd4285b-d9dc-4104-b850-fcf81a763c89"],"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\routes\\auth.routes.js":["ecd4285b-d9dc-4104-b850-fcf81a763c89"],"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\controllers\\auth.controller.js":["ecd4285b-d9dc-4104-b850-fcf81a763c89"],"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\business\\user.business.js":["ecd4285b-d9dc-4104-b850-fcf81a763c89"],"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\datalayer\\mongo.js":["ecd4285b-d9dc-4104-b850-fcf81a763c89"]},"externalIds":{}} \ No newline at end of file diff --git a/server/app.js b/server/app.js index c74e716..62aa31d 100644 --- a/server/app.js +++ b/server/app.js @@ -2,17 +2,29 @@ const express = require("express"); const path = require("path"); const bodyParser = require("body-parser"); const cors = require("cors"); +const cookieSession = require("cookie-session"); +const cookieParser = require("cookie-parser"); require("./database"); require("dotenv").config(); var app = express(); +app.use( + cookieSession({ + name: "readonline-token", + secret: process.env.TOKEN_SECRET, + httpOnly: true, + keys: [process.env.TOKEN_SECRET], + }) +); + app.use(cors({ origin: "http://localhost:8080", credentials: true })); /** * Router setup */ +var authRouter = require("./routes/auth.routes"); /** * View Engine setup @@ -24,7 +36,9 @@ app.use(express.urlencoded({ extended: false })); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); app.use(express.static(path.join(__dirname, "public"))); +app.use(cookieParser()); // Configuring the main routes +app.use("/auth", authRouter); module.exports = app; diff --git a/server/business/user.business.js b/server/business/user.business.js index 714b084..1ba329d 100644 --- a/server/business/user.business.js +++ b/server/business/user.business.js @@ -59,16 +59,18 @@ class UserBusiness { * Register a user. */ async register(user) { + if (!isUserADriver(user)) { + throw httpError( + 400, + "You cannot create a type of Toll Operator through this endpoint." + ); + } return this.createUser({ username: user.username, email: user.email, password: user.password, type: user.type, }).catch((error) => { - if (error.message.includes("username")) - throw httpError(400, "Username is already in use."); - if (error.message.includes("email")) - throw httpError(400, "Email is already in use."); throw httpError(400, error.message); }); } @@ -127,3 +129,7 @@ function isUserDataValid(user) { return true; } } + +function isUserADriver(user) { + return user && user.type == "Driver"; +} diff --git a/server/config/db.config.js b/server/config/db.config.js index 2520892..bddb744 100644 --- a/server/config/db.config.js +++ b/server/config/db.config.js @@ -1,3 +1,8 @@ module.exports = { - url: "mongodb://localhost:27017/highwaytrackerdb", + dev: { + url: "mongodb://localhost:27017/highwaytrackerdb", + }, + test: { + url: "mongodb://localhost:27017/highwaytrackerdb_testing", + }, }; diff --git a/server/database/index.js b/server/database/index.js index 8ffff98..65df153 100644 --- a/server/database/index.js +++ b/server/database/index.js @@ -1,8 +1,8 @@ // Get database config -const environment = process.env.NODE_ENV; const mongoose = require("mongoose"); mongoose.Promise = global.Promise; -const dbConfig = require("../config/db.config.js"); +const environment = process.env.NODE_ENV; +const dbConfig = require("../config/db.config.js")[environment]; // Create mongoose and read in config const db = {}; @@ -17,6 +17,9 @@ function setRunValidators() { this.setOptions({ runValidators: true }); } +// Add models to the database. +db.users = require("../models/user.model.js")(mongoose); + // Using the mongoose object, start the database db.mongoose .connect(db.url, { diff --git a/server/database/seed.js b/server/database/seed.js new file mode 100644 index 0000000..200149a --- /dev/null +++ b/server/database/seed.js @@ -0,0 +1,39 @@ +const mongoose = require("mongoose"); +mongoose.users = require("../models/user.model")(mongoose); +const bcrypt = require("bcryptjs"); + +mongoose + .connect("mongodb://localhost:27017/highwaytrackerdb_testing", { + useNewUrlParser: true, + useUnifiedTopology: true, + }) + .then(() => { + console.log("Connection to database successful."); + }) + .catch(() => { + console.log("Connection to database unsuccessful."); + }); + +const users = [ + { + username: "test_username", + email: "test@email.com", + password: bcrypt.hashSync("admin", 8), + type: "Driver", + }, +]; +const seedDB = async () => { + await mongoose.users.deleteMany(); + await mongoose.users.insertMany(users); +}; + +seedDB() + .then(() => { + console.log("Successfully seeded database."); + }) + .catch((error) => { + console.log("An error occurred while seeding databases: ", error); + }) + .finally(() => { + mongoose.connection.close(); + }); diff --git a/server/package.json b/server/package.json index 29e0bde..ec37fdd 100644 --- a/server/package.json +++ b/server/package.json @@ -1,17 +1,26 @@ { "scripts": { - "start": "set NODE_ENV=dev&& node ./bin/www" + "start": "set NODE_ENV=dev&& node ./bin/www", + "test": "set NODE_ENV=test&& node ./database/seed.js && nyc mocha --recursive --timeout 5000 --exit" }, "dependencies": { + "bcryptjs": "^2.4.3", "body-parser": "^1.19.1", + "chai": "^4.3.6", + "chai-http": "^4.3.0", + "cookie-parser": "^1.4.6", + "cookie-session": "^2.0.0", "cors": "^2.8.5", "dotenv": "^15.0.0", "eslint": "^8.8.0", "express": "^4.17.2", + "http-errors": "^2.0.0", "jshint": "^2.13.4", + "jsonwebtoken": "^8.5.1", "mocha": "^9.2.0", "mongodb": "^4.3.1", "mongoose": "^6.1.9", - "nodemon": "^2.0.15" + "nodemon": "^2.0.15", + "nyc": "^15.1.0" } } diff --git a/server/test/integration/auth.controller.test.js b/server/test/integration/auth.controller.test.js new file mode 100644 index 0000000..6be83d7 --- /dev/null +++ b/server/test/integration/auth.controller.test.js @@ -0,0 +1,124 @@ +let chai = require("chai"); +let chaiHttp = require("chai-http"); +let server = require("../../app"); +let should = chai.should(); +chai.use(chaiHttp); + +describe("Testing /auth paths", () => { + it("user should be able to register", (done) => { + chai.request(server) + .post("/auth/register") + .send({ + email: "test@test.com", + password: "test1", + username: "arealusername", + type: "Driver", + }) + .end((err, res) => { + res.should.have.status(200); + res.should.be.a("object"); + res.body.should.have.property("message"); + res.body.message.should.be.eql( + "User was successfully created." + ); + + done(); + }); + }); + + it("user should be able to login", (done) => { + chai.request(server) + .post("/auth/login") + .send({ + email: "test@test.com", + password: "test1", + }) + .end((err, res) => { + res.should.have.status(200); + res.should.be.a("object"); + res.body.should.have.property("message"); + res.body.message.should.be.eql("Successfully logged in."); + res.should.have.cookie("readonline-token"); + + done(); + }); + }); + + it("user shouldn't be able to login with invalid credentials", (done) => { + chai.request(server) + .post("/auth/login") + .send({ + email: "test@test.com", + password: "test2", + }) + .end((err, res) => { + res.should.have.status(400); + res.should.be.a("object"); + res.body.should.have.property("message"); + res.body.message.should.be.eql( + "Your email or password is incorrect." + ); + + done(); + }); + }); + + it("user shouldn't be able to register with duplicate username", (done) => { + chai.request(server) + .post("/auth/register") + .send({ + email: "test@realemail.com", + password: "test1", + username: "test_username", + type: "Driver", + }) + .end((err, res) => { + res.should.have.status(400); + res.should.be.a("object"); + res.body.should.have.property("message"); + res.body.message.should.be.eql("Username is already in use."); + + done(); + }); + }); + + it("user shouldn't be able to register with duplicate email", (done) => { + chai.request(server) + .post("/auth/register") + .send({ + email: "test@email.com", + password: "test1", + username: "a username", + type: "Driver", + }) + .end((err, res) => { + res.should.have.status(400); + res.should.be.a("object"); + res.body.should.have.property("message"); + res.body.message.should.be.eql("Email is already in use."); + + done(); + }); + }); + + it("user shouldn't be able to register a Toll Operator through the /register endpoint", (done) => { + chai.request(server) + .post("/auth/register") + .send({ + email: "tolloperator@email.com", + password: "test1", + username: "tolloperator", + type: "Toll Operator", + }) + .end((err, res) => { + res.should.have.status(400); + res.should.be.a("object"); + res.body.should.have.property("message"); + res.body.message.should.be.eql( + "You cannot create a type of Toll Operator through this endpoint." + ); + + done(); + }); + }); +}); From cf688f19ace402da223990d73f99c47fa261d108 Mon Sep 17 00:00:00 2001 From: jarrodback Date: Tue, 1 Feb 2022 12:44:17 +0000 Subject: [PATCH 4/6] HT-6 Review comments --- .gitignore | 3 +- .../ecd4285b-d9dc-4104-b850-fcf81a763c89.json | 1 - .../ecd4285b-d9dc-4104-b850-fcf81a763c89.json | 1 - server/app.js | 2 +- server/business/user.business.js | 31 ++---- server/database/index.js | 2 - server/models/user.model.js | 4 +- .../test/integration/auth.controller.test.js | 97 ++++++++++--------- 8 files changed, 61 insertions(+), 80 deletions(-) delete mode 100644 server/.nyc_output/ecd4285b-d9dc-4104-b850-fcf81a763c89.json delete mode 100644 server/.nyc_output/processinfo/ecd4285b-d9dc-4104-b850-fcf81a763c89.json diff --git a/.gitignore b/.gitignore index 0fc8187..bade184 100644 --- a/.gitignore +++ b/.gitignore @@ -2,8 +2,9 @@ .DS_Store node_modules /dist - package-lock.json +server/.nyc_output/*.json +server/.nyc_output/processinfo/*.json # local env files .env.local diff --git a/server/.nyc_output/ecd4285b-d9dc-4104-b850-fcf81a763c89.json b/server/.nyc_output/ecd4285b-d9dc-4104-b850-fcf81a763c89.json deleted file mode 100644 index f1f6770..0000000 --- a/server/.nyc_output/ecd4285b-d9dc-4104-b850-fcf81a763c89.json +++ /dev/null @@ -1 +0,0 @@ -{"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\app.js":{"path":"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\app.js","statementMap":{"0":{"start":{"line":1,"column":16},"end":{"line":1,"column":34}},"1":{"start":{"line":2,"column":13},"end":{"line":2,"column":28}},"2":{"start":{"line":3,"column":19},"end":{"line":3,"column":41}},"3":{"start":{"line":4,"column":13},"end":{"line":4,"column":28}},"4":{"start":{"line":5,"column":22},"end":{"line":5,"column":47}},"5":{"start":{"line":6,"column":21},"end":{"line":6,"column":45}},"6":{"start":{"line":8,"column":0},"end":{"line":8,"column":22}},"7":{"start":{"line":9,"column":0},"end":{"line":9,"column":27}},"8":{"start":{"line":11,"column":10},"end":{"line":11,"column":19}},"9":{"start":{"line":13,"column":0},"end":{"line":20,"column":2}},"10":{"start":{"line":22,"column":0},"end":{"line":22,"column":70}},"11":{"start":{"line":27,"column":17},"end":{"line":27,"column":48}},"12":{"start":{"line":32,"column":0},"end":{"line":32,"column":48}},"13":{"start":{"line":33,"column":0},"end":{"line":33,"column":26}},"14":{"start":{"line":34,"column":0},"end":{"line":34,"column":24}},"15":{"start":{"line":35,"column":0},"end":{"line":35,"column":49}},"16":{"start":{"line":36,"column":0},"end":{"line":36,"column":27}},"17":{"start":{"line":37,"column":0},"end":{"line":37,"column":51}},"18":{"start":{"line":38,"column":0},"end":{"line":38,"column":56}},"19":{"start":{"line":39,"column":0},"end":{"line":39,"column":24}},"20":{"start":{"line":42,"column":0},"end":{"line":42,"column":29}},"21":{"start":{"line":44,"column":0},"end":{"line":44,"column":21}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"11ccd35b25bc03399529e577dd05b66ec3260d7a","contentHash":"0636fb23e5ab827a538b867768125a4ec2efbef2d174cc4b87e301bfac380fe5"},"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\database\\index.js":{"path":"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\database\\index.js","statementMap":{"0":{"start":{"line":2,"column":17},"end":{"line":2,"column":36}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":34}},"2":{"start":{"line":4,"column":20},"end":{"line":4,"column":40}},"3":{"start":{"line":5,"column":17},"end":{"line":5,"column":63}},"4":{"start":{"line":8,"column":11},"end":{"line":8,"column":13}},"5":{"start":{"line":9,"column":0},"end":{"line":9,"column":23}},"6":{"start":{"line":10,"column":0},"end":{"line":10,"column":22}},"7":{"start":{"line":12,"column":0},"end":{"line":15,"column":3}},"8":{"start":{"line":13,"column":4},"end":{"line":13,"column":46}},"9":{"start":{"line":14,"column":4},"end":{"line":14,"column":54}},"10":{"start":{"line":17,"column":4},"end":{"line":17,"column":45}},"11":{"start":{"line":21,"column":0},"end":{"line":21,"column":56}},"12":{"start":{"line":24,"column":0},"end":{"line":35,"column":7}},"13":{"start":{"line":30,"column":8},"end":{"line":30,"column":71}},"14":{"start":{"line":33,"column":8},"end":{"line":33,"column":60}},"15":{"start":{"line":34,"column":8},"end":{"line":34,"column":23}},"16":{"start":{"line":37,"column":0},"end":{"line":37,"column":20}},"17":{"start":{"line":39,"column":0},"end":{"line":43,"column":2}},"18":{"start":{"line":41,"column":8},"end":{"line":41,"column":44}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":12,"column":19},"end":{"line":12,"column":20}},"loc":{"start":{"line":12,"column":31},"end":{"line":15,"column":1}},"line":12},"1":{"name":"setRunValidators","decl":{"start":{"line":16,"column":9},"end":{"line":16,"column":25}},"loc":{"start":{"line":16,"column":28},"end":{"line":18,"column":1}},"line":16},"2":{"name":"(anonymous_2)","decl":{"start":{"line":29,"column":10},"end":{"line":29,"column":11}},"loc":{"start":{"line":29,"column":16},"end":{"line":31,"column":5}},"line":29},"3":{"name":"(anonymous_3)","decl":{"start":{"line":32,"column":11},"end":{"line":32,"column":12}},"loc":{"start":{"line":32,"column":20},"end":{"line":35,"column":5}},"line":32},"4":{"name":"(anonymous_4)","decl":{"start":{"line":40,"column":14},"end":{"line":40,"column":15}},"loc":{"start":{"line":40,"column":29},"end":{"line":42,"column":5}},"line":40}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":0,"11":1,"12":1,"13":1,"14":0,"15":0,"16":1,"17":1,"18":1},"f":{"0":1,"1":0,"2":1,"3":0,"4":1},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"fae86148bf61f4a322fba8bbbb3b7a29d20fc5a6","contentHash":"5e08bb204df9b21ece3cb6d108c7ef4056f7aaaa99bf46f50a414e7857aba1df"},"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\config\\db.config.js":{"path":"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\config\\db.config.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":8,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"29ec18e9e0fd4b0136e4b343c92d26a51723487f","contentHash":"11e17e0e2a0410bae5adc9abc706b44a2d2d148049b4f6e1c5bb83b4b9a52526"},"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\models\\user.model.js":{"path":"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\models\\user.model.js","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":31,"column":2}},"1":{"start":{"line":3,"column":21},"end":{"line":28,"column":6}},"2":{"start":{"line":30,"column":4},"end":{"line":30,"column":46}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":2,"column":17},"end":{"line":2,"column":18}},"loc":{"start":{"line":2,"column":31},"end":{"line":31,"column":1}},"line":2}},"branchMap":{},"s":{"0":1,"1":1,"2":1},"f":{"0":1},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"0fe07b1ae721fca09401c7619103d4e7109621c0","contentHash":"5d48671eaf2af3cb6d49251f5cf8e325aeb82c49b954287ed4d7ac1e6f68b385"},"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\routes\\auth.routes.js":{"path":"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\routes\\auth.routes.js","statementMap":{"0":{"start":{"line":1,"column":14},"end":{"line":1,"column":32}},"1":{"start":{"line":2,"column":13},"end":{"line":2,"column":29}},"2":{"start":{"line":5,"column":21},"end":{"line":5,"column":62}},"3":{"start":{"line":8,"column":0},"end":{"line":8,"column":45}},"4":{"start":{"line":11,"column":0},"end":{"line":11,"column":51}},"5":{"start":{"line":14,"column":0},"end":{"line":14,"column":47}},"6":{"start":{"line":16,"column":0},"end":{"line":16,"column":24}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"2f03f9a2013dfc35743fcc86477c514581e2714e","contentHash":"861f9a3a5bcafa073d4fab99793c417f8844072a8885f53c46840440c5ceba9e"},"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\controllers\\auth.controller.js":{"path":"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\controllers\\auth.controller.js","statementMap":{"0":{"start":{"line":1,"column":21},"end":{"line":1,"column":57}},"1":{"start":{"line":2,"column":21},"end":{"line":2,"column":39}},"2":{"start":{"line":7,"column":0},"end":{"line":26,"column":2}},"3":{"start":{"line":8,"column":4},"end":{"line":25,"column":11}},"4":{"start":{"line":11,"column":12},"end":{"line":11,"column":43}},"5":{"start":{"line":12,"column":12},"end":{"line":12,"column":49}},"6":{"start":{"line":13,"column":12},"end":{"line":13,"column":41}},"7":{"start":{"line":14,"column":12},"end":{"line":14,"column":37}},"8":{"start":{"line":16,"column":12},"end":{"line":21,"column":15}},"9":{"start":{"line":24,"column":12},"end":{"line":24,"column":70}},"10":{"start":{"line":31,"column":0},"end":{"line":42,"column":2}},"11":{"start":{"line":32,"column":4},"end":{"line":41,"column":11}},"12":{"start":{"line":35,"column":12},"end":{"line":37,"column":15}},"13":{"start":{"line":40,"column":12},"end":{"line":40,"column":70}},"14":{"start":{"line":47,"column":0},"end":{"line":52,"column":2}},"15":{"start":{"line":48,"column":4},"end":{"line":48,"column":23}},"16":{"start":{"line":49,"column":4},"end":{"line":51,"column":7}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":7,"column":16},"end":{"line":7,"column":17}},"loc":{"start":{"line":7,"column":36},"end":{"line":26,"column":1}},"line":7},"1":{"name":"(anonymous_1)","decl":{"start":{"line":10,"column":14},"end":{"line":10,"column":15}},"loc":{"start":{"line":10,"column":24},"end":{"line":22,"column":9}},"line":10},"2":{"name":"(anonymous_2)","decl":{"start":{"line":23,"column":15},"end":{"line":23,"column":16}},"loc":{"start":{"line":23,"column":26},"end":{"line":25,"column":9}},"line":23},"3":{"name":"(anonymous_3)","decl":{"start":{"line":31,"column":19},"end":{"line":31,"column":20}},"loc":{"start":{"line":31,"column":33},"end":{"line":42,"column":1}},"line":31},"4":{"name":"(anonymous_4)","decl":{"start":{"line":34,"column":14},"end":{"line":34,"column":15}},"loc":{"start":{"line":34,"column":20},"end":{"line":38,"column":9}},"line":34},"5":{"name":"(anonymous_5)","decl":{"start":{"line":39,"column":15},"end":{"line":39,"column":16}},"loc":{"start":{"line":39,"column":26},"end":{"line":41,"column":9}},"line":39},"6":{"name":"(anonymous_6)","decl":{"start":{"line":47,"column":17},"end":{"line":47,"column":18}},"loc":{"start":{"line":47,"column":31},"end":{"line":52,"column":1}},"line":47}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":2,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":4,"12":1,"13":3,"14":1,"15":0,"16":0},"f":{"0":2,"1":1,"2":1,"3":4,"4":1,"5":3,"6":0},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"0ef843f2afd10703a57df7d8636bb043b448f61e","contentHash":"87ebbd8ca9f0d4a72cb5845b900e11feaa02e5229ed52faf31ae5ea9f0aed857"},"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\business\\user.business.js":{"path":"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\business\\user.business.js","statementMap":{"0":{"start":{"line":1,"column":18},"end":{"line":1,"column":47}},"1":{"start":{"line":2,"column":14},"end":{"line":2,"column":53}},"2":{"start":{"line":3,"column":18},"end":{"line":3,"column":40}},"3":{"start":{"line":4,"column":12},"end":{"line":4,"column":35}},"4":{"start":{"line":5,"column":15},"end":{"line":5,"column":34}},"5":{"start":{"line":10,"column":8},"end":{"line":10,"column":46}},"6":{"start":{"line":17,"column":8},"end":{"line":55,"column":15}},"7":{"start":{"line":20,"column":29},"end":{"line":20,"column":37}},"8":{"start":{"line":22,"column":40},"end":{"line":25,"column":17}},"9":{"start":{"line":27,"column":16},"end":{"line":32,"column":17}},"10":{"start":{"line":28,"column":20},"end":{"line":31,"column":22}},"11":{"start":{"line":34,"column":30},"end":{"line":45,"column":17}},"12":{"start":{"line":46,"column":16},"end":{"line":51,"column":18}},"13":{"start":{"line":54,"column":16},"end":{"line":54,"column":77}},"14":{"start":{"line":62,"column":8},"end":{"line":67,"column":9}},"15":{"start":{"line":63,"column":12},"end":{"line":66,"column":14}},"16":{"start":{"line":68,"column":8},"end":{"line":75,"column":11}},"17":{"start":{"line":74,"column":12},"end":{"line":74,"column":48}},"18":{"start":{"line":82,"column":8},"end":{"line":84,"column":9}},"19":{"start":{"line":83,"column":12},"end":{"line":83,"column":58}},"20":{"start":{"line":85,"column":21},"end":{"line":90,"column":9}},"21":{"start":{"line":92,"column":8},"end":{"line":98,"column":11}},"22":{"start":{"line":93,"column":12},"end":{"line":94,"column":68}},"23":{"start":{"line":94,"column":16},"end":{"line":94,"column":68}},"24":{"start":{"line":95,"column":12},"end":{"line":96,"column":65}},"25":{"start":{"line":96,"column":16},"end":{"line":96,"column":65}},"26":{"start":{"line":97,"column":12},"end":{"line":97,"column":48}},"27":{"start":{"line":105,"column":8},"end":{"line":109,"column":15}},"28":{"start":{"line":108,"column":16},"end":{"line":108,"column":52}},"29":{"start":{"line":112,"column":0},"end":{"line":112,"column":30}},"30":{"start":{"line":120,"column":4},"end":{"line":130,"column":5}},"31":{"start":{"line":127,"column":8},"end":{"line":127,"column":21}},"32":{"start":{"line":129,"column":8},"end":{"line":129,"column":20}},"33":{"start":{"line":134,"column":4},"end":{"line":134,"column":41}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":8,"column":4},"end":{"line":8,"column":5}},"loc":{"start":{"line":8,"column":18},"end":{"line":11,"column":5}},"line":8},"1":{"name":"(anonymous_1)","decl":{"start":{"line":16,"column":4},"end":{"line":16,"column":5}},"loc":{"start":{"line":16,"column":33},"end":{"line":56,"column":5}},"line":16},"2":{"name":"(anonymous_2)","decl":{"start":{"line":18,"column":18},"end":{"line":18,"column":19}},"loc":{"start":{"line":18,"column":29},"end":{"line":52,"column":13}},"line":18},"3":{"name":"(anonymous_3)","decl":{"start":{"line":53,"column":19},"end":{"line":53,"column":20}},"loc":{"start":{"line":53,"column":25},"end":{"line":55,"column":13}},"line":53},"4":{"name":"(anonymous_4)","decl":{"start":{"line":61,"column":4},"end":{"line":61,"column":5}},"loc":{"start":{"line":61,"column":25},"end":{"line":76,"column":5}},"line":61},"5":{"name":"(anonymous_5)","decl":{"start":{"line":73,"column":17},"end":{"line":73,"column":18}},"loc":{"start":{"line":73,"column":28},"end":{"line":75,"column":9}},"line":73},"6":{"name":"(anonymous_6)","decl":{"start":{"line":81,"column":4},"end":{"line":81,"column":5}},"loc":{"start":{"line":81,"column":35},"end":{"line":99,"column":5}},"line":81},"7":{"name":"(anonymous_7)","decl":{"start":{"line":92,"column":49},"end":{"line":92,"column":50}},"loc":{"start":{"line":92,"column":60},"end":{"line":98,"column":9}},"line":92},"8":{"name":"(anonymous_8)","decl":{"start":{"line":104,"column":4},"end":{"line":104,"column":5}},"loc":{"start":{"line":104,"column":33},"end":{"line":110,"column":5}},"line":104},"9":{"name":"(anonymous_9)","decl":{"start":{"line":107,"column":19},"end":{"line":107,"column":20}},"loc":{"start":{"line":107,"column":30},"end":{"line":109,"column":13}},"line":107},"10":{"name":"isUserDataValid","decl":{"start":{"line":119,"column":9},"end":{"line":119,"column":24}},"loc":{"start":{"line":119,"column":31},"end":{"line":131,"column":1}},"line":119},"11":{"name":"isUserADriver","decl":{"start":{"line":133,"column":9},"end":{"line":133,"column":22}},"loc":{"start":{"line":133,"column":29},"end":{"line":135,"column":1}},"line":133}},"branchMap":{"0":{"loc":{"start":{"line":27,"column":16},"end":{"line":32,"column":17}},"type":"if","locations":[{"start":{"line":27,"column":16},"end":{"line":32,"column":17}},{"start":{"line":27,"column":16},"end":{"line":32,"column":17}}],"line":27},"1":{"loc":{"start":{"line":62,"column":8},"end":{"line":67,"column":9}},"type":"if","locations":[{"start":{"line":62,"column":8},"end":{"line":67,"column":9}},{"start":{"line":62,"column":8},"end":{"line":67,"column":9}}],"line":62},"2":{"loc":{"start":{"line":82,"column":8},"end":{"line":84,"column":9}},"type":"if","locations":[{"start":{"line":82,"column":8},"end":{"line":84,"column":9}},{"start":{"line":82,"column":8},"end":{"line":84,"column":9}}],"line":82},"3":{"loc":{"start":{"line":93,"column":12},"end":{"line":94,"column":68}},"type":"if","locations":[{"start":{"line":93,"column":12},"end":{"line":94,"column":68}},{"start":{"line":93,"column":12},"end":{"line":94,"column":68}}],"line":93},"4":{"loc":{"start":{"line":95,"column":12},"end":{"line":96,"column":65}},"type":"if","locations":[{"start":{"line":95,"column":12},"end":{"line":96,"column":65}},{"start":{"line":95,"column":12},"end":{"line":96,"column":65}}],"line":95},"5":{"loc":{"start":{"line":120,"column":4},"end":{"line":130,"column":5}},"type":"if","locations":[{"start":{"line":120,"column":4},"end":{"line":130,"column":5}},{"start":{"line":120,"column":4},"end":{"line":130,"column":5}}],"line":120},"6":{"loc":{"start":{"line":121,"column":8},"end":{"line":125,"column":22}},"type":"binary-expr","locations":[{"start":{"line":121,"column":8},"end":{"line":121,"column":13}},{"start":{"line":122,"column":8},"end":{"line":122,"column":22}},{"start":{"line":123,"column":8},"end":{"line":123,"column":19}},{"start":{"line":124,"column":8},"end":{"line":124,"column":18}},{"start":{"line":125,"column":8},"end":{"line":125,"column":22}}],"line":121},"7":{"loc":{"start":{"line":134,"column":11},"end":{"line":134,"column":40}},"type":"binary-expr","locations":[{"start":{"line":134,"column":11},"end":{"line":134,"column":15}},{"start":{"line":134,"column":19},"end":{"line":134,"column":40}}],"line":134}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":2,"7":2,"8":2,"9":2,"10":1,"11":1,"12":1,"13":1,"14":4,"15":1,"16":3,"17":2,"18":3,"19":0,"20":3,"21":3,"22":2,"23":1,"24":1,"25":1,"26":0,"27":2,"28":0,"29":1,"30":3,"31":0,"32":3,"33":4},"f":{"0":1,"1":2,"2":2,"3":1,"4":4,"5":2,"6":3,"7":2,"8":2,"9":0,"10":3,"11":4},"b":{"0":[1,1],"1":[1,3],"2":[0,3],"3":[1,1],"4":[1,0],"5":[0,3],"6":[3,3,3,3,3],"7":[4,4]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"54e049c4ae4af4eb89389e3882c0e369f3336eeb","contentHash":"e8a98c787a554b023d6c52e47fd8a29bd9245a79eed44e4dfe10a88f84eda107"},"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\datalayer\\mongo.js":{"path":"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\datalayer\\mongo.js","statementMap":{"0":{"start":{"line":4,"column":8},"end":{"line":4,"column":27}},"1":{"start":{"line":11,"column":8},"end":{"line":11,"column":49}},"2":{"start":{"line":18,"column":8},"end":{"line":18,"column":47}},"3":{"start":{"line":22,"column":0},"end":{"line":22,"column":27}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":2,"column":4},"end":{"line":2,"column":5}},"loc":{"start":{"line":2,"column":23},"end":{"line":5,"column":5}},"line":2},"1":{"name":"(anonymous_1)","decl":{"start":{"line":10,"column":4},"end":{"line":10,"column":5}},"loc":{"start":{"line":10,"column":33},"end":{"line":12,"column":5}},"line":10},"2":{"name":"(anonymous_2)","decl":{"start":{"line":17,"column":4},"end":{"line":17,"column":5}},"loc":{"start":{"line":17,"column":41},"end":{"line":19,"column":5}},"line":17}},"branchMap":{},"s":{"0":1,"1":3,"2":2,"3":1},"f":{"0":1,"1":3,"2":2},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"c226779b2373c72053bcac747e240dd7e105ec7a","contentHash":"415fd02cf1824e83293dc861c7aaa18a41fc6f08b44aa9200cc83b7dc2639260"}} \ No newline at end of file diff --git a/server/.nyc_output/processinfo/ecd4285b-d9dc-4104-b850-fcf81a763c89.json b/server/.nyc_output/processinfo/ecd4285b-d9dc-4104-b850-fcf81a763c89.json deleted file mode 100644 index 4c1afdf..0000000 --- a/server/.nyc_output/processinfo/ecd4285b-d9dc-4104-b850-fcf81a763c89.json +++ /dev/null @@ -1 +0,0 @@ -{"parent":null,"pid":7696,"argv":["C:\\Program Files\\nodejs\\node.exe","C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\node_modules\\mocha\\bin\\mocha","--recursive","--timeout","5000","--exit"],"execArgv":[],"cwd":"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server","time":1643716874833,"ppid":23016,"coverageFilename":"C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\.nyc_output\\ecd4285b-d9dc-4104-b850-fcf81a763c89.json","externalId":"","uuid":"ecd4285b-d9dc-4104-b850-fcf81a763c89","files":["C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\app.js","C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\database\\index.js","C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\config\\db.config.js","C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\models\\user.model.js","C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\routes\\auth.routes.js","C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\controllers\\auth.controller.js","C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\business\\user.business.js","C:\\Users\\Jarrod\\Documents\\AAF\\CSSD\\server\\datalayer\\mongo.js"]} \ No newline at end of file diff --git a/server/app.js b/server/app.js index 62aa31d..a8ef318 100644 --- a/server/app.js +++ b/server/app.js @@ -12,7 +12,7 @@ var app = express(); app.use( cookieSession({ - name: "readonline-token", + name: "highwayTracker-token", secret: process.env.TOKEN_SECRET, httpOnly: true, keys: [process.env.TOKEN_SECRET], diff --git a/server/business/user.business.js b/server/business/user.business.js index 1ba329d..7111eaa 100644 --- a/server/business/user.business.js +++ b/server/business/user.business.js @@ -15,10 +15,7 @@ class UserBusiness { */ async login(email, password) { return this.findUserByEmail(email) - .then((users) => { - // Email is unique so only 1 can be returned. - const user = users[0]; - + .then((user) => { const passwordIsValid = bcrypt.compareSync( password, user.password @@ -59,17 +56,11 @@ class UserBusiness { * Register a user. */ async register(user) { - if (!isUserADriver(user)) { - throw httpError( - 400, - "You cannot create a type of Toll Operator through this endpoint." - ); - } return this.createUser({ username: user.username, email: user.email, password: user.password, - type: user.type, + type: "Driver", }).catch((error) => { throw httpError(400, error.message); }); @@ -104,6 +95,10 @@ class UserBusiness { async findUserByEmail(email) { return this.dataLayer .findByProperty({ email: email }) + .then((users) => { + // Email is unique so only 1 can be returned. + return users[0]; + }) .catch((error) => { throw httpError(404, error.message); }); @@ -113,23 +108,11 @@ module.exports = UserBusiness; /** * Validates the data in a User. - * - * @returns {Boolean} True if the object maps correct to the User model. */ function isUserDataValid(user) { - if ( - !user || - !user.username || - !user.email || - !user.type || - !user.password - ) { + if (!user || !user.username || !user.email || !user.password) { return false; } else { return true; } } - -function isUserADriver(user) { - return user && user.type == "Driver"; -} diff --git a/server/database/index.js b/server/database/index.js index e21aa0e..6f5e705 100644 --- a/server/database/index.js +++ b/server/database/index.js @@ -22,8 +22,6 @@ function setRunValidators() { this.setOptions({ runValidators: true }); } -// Add models to the database. - // Using the mongoose object, start the database db.mongoose .connect(db.url, { diff --git a/server/models/user.model.js b/server/models/user.model.js index 46580af..4f0b158 100644 --- a/server/models/user.model.js +++ b/server/models/user.model.js @@ -5,12 +5,12 @@ module.exports = (mongoose) => { type: String, required: [true, "You must supply the user's username."], minlength: [5, "Your username must be at least 5 letters."], - unique: [true, "The username must be unique."], + unique: true, }, email: { type: String, required: [true, "You must supply the user's email."], - unique: [true, "The email must be unique."], + unique: true, }, password: { type: String, diff --git a/server/test/integration/auth.controller.test.js b/server/test/integration/auth.controller.test.js index 6be83d7..fb907f4 100644 --- a/server/test/integration/auth.controller.test.js +++ b/server/test/integration/auth.controller.test.js @@ -6,15 +6,19 @@ chai.use(chaiHttp); describe("Testing /auth paths", () => { it("user should be able to register", (done) => { + // Arrange + const request = { + email: "test@test.com", + password: "test1", + username: "arealusername", + }; + + // Act chai.request(server) .post("/auth/register") - .send({ - email: "test@test.com", - password: "test1", - username: "arealusername", - type: "Driver", - }) + .send(request) .end((err, res) => { + // Assert res.should.have.status(200); res.should.be.a("object"); res.body.should.have.property("message"); @@ -27,31 +31,41 @@ describe("Testing /auth paths", () => { }); it("user should be able to login", (done) => { + // Arrange + const request = { + email: "test@test.com", + password: "test1", + }; + + // Act chai.request(server) .post("/auth/login") - .send({ - email: "test@test.com", - password: "test1", - }) + .send(request) .end((err, res) => { + // Assert res.should.have.status(200); res.should.be.a("object"); res.body.should.have.property("message"); res.body.message.should.be.eql("Successfully logged in."); - res.should.have.cookie("readonline-token"); + res.should.have.cookie("highwayTracker-token"); done(); }); }); it("user shouldn't be able to login with invalid credentials", (done) => { + // Act + const request = { + email: "test@test.com", + password: "test2", + }; + + // Arrange chai.request(server) .post("/auth/login") - .send({ - email: "test@test.com", - password: "test2", - }) + .send(request) .end((err, res) => { + // Assert res.should.have.status(400); res.should.be.a("object"); res.body.should.have.property("message"); @@ -64,15 +78,19 @@ describe("Testing /auth paths", () => { }); it("user shouldn't be able to register with duplicate username", (done) => { + // Act + const request = { + email: "test@realemail.com", + password: "test1", + username: "test_username", + }; + + // Arrange chai.request(server) .post("/auth/register") - .send({ - email: "test@realemail.com", - password: "test1", - username: "test_username", - type: "Driver", - }) + .send(request) .end((err, res) => { + // Assert res.should.have.status(400); res.should.be.a("object"); res.body.should.have.property("message"); @@ -83,40 +101,23 @@ describe("Testing /auth paths", () => { }); it("user shouldn't be able to register with duplicate email", (done) => { - chai.request(server) - .post("/auth/register") - .send({ - email: "test@email.com", - password: "test1", - username: "a username", - type: "Driver", - }) - .end((err, res) => { - res.should.have.status(400); - res.should.be.a("object"); - res.body.should.have.property("message"); - res.body.message.should.be.eql("Email is already in use."); + // Act + const request = { + email: "test@email.com", + password: "test1", + username: "a username", + }; - done(); - }); - }); - - it("user shouldn't be able to register a Toll Operator through the /register endpoint", (done) => { + // Arrange chai.request(server) .post("/auth/register") - .send({ - email: "tolloperator@email.com", - password: "test1", - username: "tolloperator", - type: "Toll Operator", - }) + .send(request) .end((err, res) => { + // Assert res.should.have.status(400); res.should.be.a("object"); res.body.should.have.property("message"); - res.body.message.should.be.eql( - "You cannot create a type of Toll Operator through this endpoint." - ); + res.body.message.should.be.eql("Email is already in use."); done(); }); From 55ea031d990094b4a67e7edb4260e42e074f8498 Mon Sep 17 00:00:00 2001 From: jarrodback Date: Tue, 1 Feb 2022 13:01:21 +0000 Subject: [PATCH 5/6] HT-6 Change 200 to 201 for request response --- server/controllers/auth.controller.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/controllers/auth.controller.js b/server/controllers/auth.controller.js index 63a6720..2a5b487 100644 --- a/server/controllers/auth.controller.js +++ b/server/controllers/auth.controller.js @@ -32,7 +32,7 @@ exports.register = (req, res) => { userBusiness .register(req.body) .then(() => { - res.status(200).send({ + res.status(201).send({ message: "User was successfully created.", }); }) From 8f50d4da94e68ecdc950ed2574b837104cc81d2a Mon Sep 17 00:00:00 2001 From: jarrodback Date: Tue, 1 Feb 2022 13:05:11 +0000 Subject: [PATCH 6/6] HT-6 Fix test failing --- server/test/integration/auth.controller.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/test/integration/auth.controller.test.js b/server/test/integration/auth.controller.test.js index fb907f4..1369ef4 100644 --- a/server/test/integration/auth.controller.test.js +++ b/server/test/integration/auth.controller.test.js @@ -19,7 +19,7 @@ describe("Testing /auth paths", () => { .send(request) .end((err, res) => { // Assert - res.should.have.status(200); + res.should.have.status(201); res.should.be.a("object"); res.body.should.have.property("message"); res.body.message.should.be.eql(