diff --git a/src/auth/authentication.js b/src/auth/authentication.js index 21ba26a..a540751 100644 --- a/src/auth/authentication.js +++ b/src/auth/authentication.js @@ -1,4 +1,5 @@ const status = require("../util/statuses"); +const session = require("express-session"); const bcrypt = require('bcrypt'); const joi = require("joi"); const salt = 12; diff --git a/src/router/user.js b/src/router/user.js index 9948402..43cfe56 100644 --- a/src/router/user.js +++ b/src/router/user.js @@ -1,5 +1,6 @@ const status = require("../util/statuses"); const ObjectId = require('mongodb').ObjectId; +const session = require("express-session"); const bcrypt = require("bcrypt"); const joi = require("joi"); const salt = 12; @@ -16,7 +17,6 @@ const getAssetSchema = (type) => { switch (type) { case "other": assetSchema = joi.object({ - ownerId: joi.string().alphanum().required(), type: joi.string().valid("other", "stock", "saving").required(), name: joi.string().alphanum().min(3).max(30).required(), value: joi.number().min(0).required(), @@ -27,7 +27,6 @@ const getAssetSchema = (type) => { break; case "saving": assetSchema = joi.object({ - ownerId: joi.string().alphanum().required(), type: joi.string().valid("other", "stock", "saving").required(), name: joi.string().alphanum().min(3).max(30).required(), value: joi.number().min(0).required(), @@ -36,7 +35,6 @@ const getAssetSchema = (type) => { break; case "stock": assetSchema = joi.object({ - ownerId: joi.string().alphanum().required(), type: joi.string().valid("other", "stock", "saving").required(), ticker: joi.string().alphanum().min(3).max(5).required(), price: joi.number().min(0).required(), @@ -69,7 +67,7 @@ module.exports = (middleware, users, plans, assets) => { }); router.get('/assets', async (req, res) => { - let userAssets = await assets.find({ "ownerId": req.session.user._id }).toArray(); + let userAssets = await assets.find({ userId: new ObjectId(req.session.user._id) }).toArray(); res.render('assets', { user: req.session.user, errMessage: req.session.errMessage, assets: userAssets }); return res.status(status.Ok); }); @@ -323,6 +321,7 @@ module.exports = (middleware, users, plans, assets) => { } let newAsset = { + userId: new ObjectId(req.session.user._id), ...req.body, updatedAt: new Date(), }; @@ -365,7 +364,7 @@ module.exports = (middleware, users, plans, assets) => { return res.redirect("/assets"); } - if (req.body.ownerId != req.session.user._id) { + if (req.body.userId != req.session.user._id) { req.session.errMessage = "Cannot change asset owner", res.status(status.BadRequest); return res.redirect("/assets"); @@ -411,14 +410,14 @@ module.exports = (middleware, users, plans, assets) => { { "_id": id } ).then((result) => { if (result.deletedCount === 0) { - console.log(`Asset not found: ${req.body.id}`); - req.session.errMessage = "Unable to delete asset"; + console.error(`Asset not found: ${req.body.id}`); + req.session.errMessage = "Unable to delete asset. Please try again."; return res.status(status.NotFound).redirect("/assets"); } if (!result.acknowledged) { - console.error("Error updating asset: ", err); - req.session.errMessage = "An error occurred while saving your information. Please try again."; + console.error("Error deleting asset: ", err); + req.session.errMessage = "An error occurred while deleting an asset. Please try again."; return res.status(status.InternalServerError).redirect("/assets"); } @@ -426,11 +425,50 @@ module.exports = (middleware, users, plans, assets) => { return res.status(status.Ok).redirect("/assets"); }).catch((err) => { - console.error("Error updating asset: ", err); - req.session.errMessage = "An error occurred while saving your information. Please try again."; + console.error("Error deleting asset: ", err); + req.session.errMessage = "An error occurred while deleting an asset. Please try again."; return res.status(status.InternalServerError).redirect("/assets"); }); }); + router.post("/deleteUser", (req, res) => { + // not as critical if results aren't as expected only if crashing + assets.deleteMany({ userId: new ObjectId(req.session.user._id) }).catch((err) => { + console.error("Error deleting user assets: ", err); + req.session.errMessage = "An error occured while deleting your account. Please try again."; + return res.status(status.InternalServerError).redirect("/profile"); + }); + + plans.deleteMany({ userId: new ObjectId(req.session.user._id) }).catch((err) => { + console.error("Error deleting user assets: ", err); + req.session.errMessage = "An error occured while deleting your account. Please try again."; + return res.status(status.InternalServerError).redirect("/profile"); + }); + + users.deleteOne( + { _id: new ObjectId(req.session.user._id) }, + ).then((result) => { + if (result.deletedCount === 0) { + console.error(`User not found: ${req.body.id}`); + req.session.errMessage = "Unabled to delete account. Please try again."; + return res.status(status.NotFound).redirect("/profile"); + } + + if (!result.acknowledged) { + console.error("Error deleting user: ", err); + req.session.errMessage = "An error occured while deleting your account. Please try again."; + return res.status(status.InternalServerError).redirect("/profile"); + } + + // Direct to logout to destroy session + req.session.destroy(); + return res.status(status.Ok).redirect("/signup"); + }).catch((err) => { + console.error("Error deleting user: ", err); + req.session.errMessage = "An error occured while deleting your account. Please try again."; + return res.status(status.InternalServerError).redirect("/profile"); + }); + }); + return router; }; diff --git a/src/views/assets.ejs b/src/views/assets.ejs index 630cab2..cec34b0 100644 --- a/src/views/assets.ejs +++ b/src/views/assets.ejs @@ -38,7 +38,6 @@
-