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") %>