diff --git a/app.js b/app.js index 5324680..8e9dd77 100644 --- a/app.js +++ b/app.js @@ -3,8 +3,10 @@ const MongoStore = require("connect-mongo"); const session = require("express-session"); const express = require('express'); const path = require('path'); +const joi = require('joi'); require('dotenv').config(); + const app = express(); const port = process.env.PORT || 3000; @@ -18,7 +20,7 @@ app.use(session({ store: MongoStore.create({ mongoUrl: `${mongoURI}${database}`, crypto: { secret: secret } }), resave: true, saveUninitialized: false, - cookie: { maxAge: 60000 }, + cookie: { maxAge: 3600000 }, })); app.set('view engine', 'ejs'); @@ -75,7 +77,7 @@ initDatabase().then(() => { // Import middleware & apply to user routes const middleware = require("./src/auth/middleware")(users); - app.use(require('./src/router/user')(middleware)); + app.use(require('./src/router/user')(middleware, users)); // 404 handler app.get('/*splat', (req, res) => { diff --git a/src/auth/authentication.js b/src/auth/authentication.js index 068f789..b58977f 100644 --- a/src/auth/authentication.js +++ b/src/auth/authentication.js @@ -3,6 +3,9 @@ const bcrypt = require('bcrypt'); const joi = require("joi"); const salt = 12; +const middleware = require("./middleware"); + + module.exports = (users) => { const router = require("express").Router(); @@ -13,12 +16,7 @@ module.exports = (users) => { }); router.post("/login", async (req, res) => { - - if (req.session.authenticated) { - res.redirect("/home"); - return res.status(status.Ok); - } - + const credentialSchema = joi.object({ email: joi.string().email().required(), password: joi.string().max(20).required(), @@ -45,9 +43,10 @@ module.exports = (users) => { return res.redirect("/login"); } + console.log("User logged in successfully"); + console.log("User email: " + req.body.email); req.session.authenticated = true; req.session.email = req.body.email; - req.session.errMessage = ""; res.redirect("/home"); return res.status(status.Ok); diff --git a/src/auth/middleware.js b/src/auth/middleware.js index 7ca7afe..8eeaff2 100644 --- a/src/auth/middleware.js +++ b/src/auth/middleware.js @@ -1,4 +1,5 @@ const status = require("../util/statuses"); +const session = require("express-session"); /** * createMiddleware returns a middleware function for express. diff --git a/src/router/user.js b/src/router/user.js index 3187328..21ae127 100644 --- a/src/router/user.js +++ b/src/router/user.js @@ -1,6 +1,7 @@ const status = require("../util/statuses"); +const joi = require("joi"); -module.exports = (middleware) => { +module.exports = (middleware, users) => { const router = require("express").Router(); router.use(middleware); @@ -35,6 +36,78 @@ module.exports = (middleware) => { return res.status(status.Ok); }); + router.get('/questionnaire', (req, res) => { + const errMessage = req.session.errMessage; + req.session.errMessage = ""; + res.render('questionnaire', { user: req.user, errMessage: errMessage }); + }); + + router.post('/questionnaire', (req, res) => { + console.log("Questionnaire POST body:", req.body); + + const questionnaireSchema = joi.object({ + dob: joi.date().required(), + education: joi.string().valid('primary', 'secondary', 'tertiary', 'postgraduate').required(), + maritalStatus: joi.string().valid('single', 'married', 'divorced', 'widowed').required(), + income: joi.number().min(0).required(), + expenses: joi.number().min(0).required(), + assets: joi.number().min(0).required(), + liabilities: joi.number().min(0).required(), + retirementAge: joi.number().min(18).max(120).required(), + retirementExpenses: joi.number().min(0).required(), + retirementAssets: joi.number().min(0).required(), + retirementLiabilities: joi.number().min(0).required(), + }); + + const validationOptions = { convert: true, abortEarly: false }; + const { error, value } = questionnaireSchema.validate(req.body, validationOptions); + + if (error) { + console.error("Questionnaire validation error:", error.details); + req.session.errMessage = "Invalid input: " + error.details.map(d => d.message.replace(/"/g, '')).join(', '); + res.status(status.BadRequest).redirect("/questionnaire"); + return; + } + + users.updateOne( + { email: req.session.email }, + { + $set: { + financialData: true, + dob: value.dob, + education: value.education, + maritalStatus: value.maritalStatus, + income: value.income, + expenses: value.expenses, + assets: value.assets, + liabilities: value.liabilities, + retirementAge: value.retirementAge, + retirementExpenses: value.retirementExpenses, + retirementAssets: value.retirementAssets, + retirementLiabilities: value.retirementLiabilities, + } + } + ).then((result) => { + if (result.matchedCount === 0) { + console.log(`User not found during questionnaire update: ${req.session.email}`); + req.session.errMessage = "User session invalid. Please log in again."; + res.status(status.NotFound).redirect("/login"); + return; + } + if (result.modifiedCount === 0 && result.matchedCount === 1) { + console.log(`User questionnaire data unchanged (already up-to-date): ${req.session.email}`); + } + + req.session.errMessage = ""; + res.status(status.Ok).redirect("/home"); + + }).catch(err => { + console.error("Error updating questionnaire in database:", err); + req.session.errMessage = "An error occurred while saving your information. Please try again."; + res.status(status.InternalServerError).redirect("/questionnaire"); + }); + }); + router.get('/logout', (req, res) => { req.session.destroy(); return res.redirect('/login'); diff --git a/src/views/home.ejs b/src/views/home.ejs index 840dc07..3637163 100644 --- a/src/views/home.ejs +++ b/src/views/home.ejs @@ -2,9 +2,14 @@ <%- include("./partials/header") %>
+ <%- include("./partials/header") %> Welcome: <%= user.email %> The Dashboard Page + <% if(user.authenticated) { %> + <%= user.email %> + <%= user.errMessage %> + <% } %>
<%- include("./partials/navBar") %> -<%- include("./partials/footer") %> \ No newline at end of file +<%- include("./partials/footer") %> diff --git a/src/views/questionnaire.ejs b/src/views/questionnaire.ejs new file mode 100644 index 0000000..e1a76a2 --- /dev/null +++ b/src/views/questionnaire.ejs @@ -0,0 +1,108 @@ + + + + + + + + Document + + + + <%- include("./partials/header") %> +
+

Welcome: <%= user.email %>

+
+

Financial Questionnaire

+
+
+ + +
+
+ + +
+
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+
+
+
+ + + + \ No newline at end of file