diff --git a/README.md b/README.md index 38a2b8e..aa462a5 100755 --- a/README.md +++ b/README.md @@ -54,9 +54,12 @@ Example: retirementCalculator/ ├── src/ │ ├── views/ -| ├── css/ -| ├── images/ -| └── scripts/ +│ │ └── partials/ +│ ├── css/ +│ ├── images/ +│ ├── scripts/ +│ └── utils/ +│ ├── app.js ├── .env.example ├── .gitignore diff --git a/app.js b/app.js index f95b832..5324680 100644 --- a/app.js +++ b/app.js @@ -25,6 +25,7 @@ app.set('view engine', 'ejs'); app.set('views',path.join(__dirname, 'src/views')); app.use(express.urlencoded({ extended: true })); app.use("/static", express.static("./src/public")); +app.use("/images", express.static("./src/public/images")); /*** Database ***/ const { connectMongo, getCollection } = require("./src/database/connection"); @@ -37,26 +38,10 @@ async function initDatabase() { users = await getCollection(db, "users"); } -initDatabase().then(() => { - // Import authentication handler - app.use(require("./src/auth/authentication")(users)); - - // Import middleware - const middleware = require("./src/auth/middleware")(users); - - // Apply middleware to protected user routes - app.use(require("./src/router/user")(middleware)); -}); - /*** ROUTINGS ***/ app.get('/', (req, res) => { if (!req.session.errMessage) req.session.errMessage = ""; - res.render('index'); - return res.status(status.Ok); -}); - -app.get('/landing', (req, res) => { res.render('landing'); return res.status(status.Ok); }); @@ -80,11 +65,26 @@ app.get('/aboutUs', (req, res) => { return res.status(status.Ok); }); -app.get('/*splat', (req, res) => { - res.send('404 Not Found'); - return res.status(status.NotFound); -}); -app.listen(port, () => { - console.log(`Server listening on port ${port}`); +// Initialize database and start app +initDatabase().then(() => { + console.log("Successfully connected to MongoDB"); + + // Import authentication handler + app.use(require("./src/auth/authentication")(users)); + + // Import middleware & apply to user routes + const middleware = require("./src/auth/middleware")(users); + app.use(require('./src/router/user')(middleware)); + + // 404 handler + app.get('/*splat', (req, res) => { + res.send('404 Not Found'); + return res.status(status.NotFound); + }); + + // Start app + app.listen(port, () => { + console.log(`Server listening on port ${port}`); + }); }); diff --git a/src/auth/authentication.js b/src/auth/authentication.js index 2a2e9ed..068f789 100644 --- a/src/auth/authentication.js +++ b/src/auth/authentication.js @@ -5,8 +5,20 @@ const salt = 12; module.exports = (users) => { const router = require("express").Router(); + + router.get("/logout", (req, res) => { + req.session.destroy(); + // res.status(status.Unauthorized); + return res.redirect('/login'); + }); 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(), @@ -27,7 +39,7 @@ module.exports = (users) => { return res.redirect("/login"); } - if (!bcrypt.compare(req.body.password, user.password)) { + if (!bcrypt.compareSync(req.body.password, user.password)) { req.session.errMessage = "Incorrect password"; res.status(status.Unauthorized); return res.redirect("/login"); @@ -64,7 +76,7 @@ module.exports = (users) => { return res.redirect("/signup"); } - let hashedPassword = await bcrypt.hash(req.body.password, salt); + let hashedPassword = await bcrypt.hashSync(req.body.password, salt); users.insertOne({ email: req.body.email, @@ -86,11 +98,5 @@ module.exports = (users) => { }); }); - router.get("/logout", (req, res) => { - req.session.destroy(); - // res.status(status.Unauthorized); - return res.redirect('/login'); - }); - return router; } diff --git a/src/auth/middleware.js b/src/auth/middleware.js index 071a8a2..7ca7afe 100644 --- a/src/auth/middleware.js +++ b/src/auth/middleware.js @@ -1,6 +1,11 @@ const status = require("../util/statuses"); -module.exports = (users) => { +/** + * createMiddleware returns a middleware function for express. + * @param {MongoClient.collection} users + * @return {async function} + */ +const createMiddleware = (users) => { return async (req, res, next) => { if (!req.session.authenticated || !req.session.email) { req.session.errMessage = "Please login to view that resource"; @@ -18,5 +23,7 @@ module.exports = (users) => { req.user = user; next(); - } -}; + }; +} + +module.exports = createMiddleware; diff --git a/src/database/connection.js b/src/database/connection.js index a25d6ac..0f52263 100644 --- a/src/database/connection.js +++ b/src/database/connection.js @@ -3,7 +3,8 @@ const MongoClient = require("mongodb").MongoClient; /** * connectMongo returns a database connection to MongoDB * @param {string} mongoURI - * @param {string} databaseName + * @param {string} databaseName + * @return {MongoClient} */ const connectMongo = async (mongoURI, databaseName) => { const database = await MongoClient.connect(mongoURI, { connectTimeoutMS: 1000 }); diff --git a/src/router/user.js b/src/router/user.js index 5570874..3187328 100644 --- a/src/router/user.js +++ b/src/router/user.js @@ -1,35 +1,44 @@ +const status = require("../util/statuses"); + module.exports = (middleware) => { const router = require("express").Router(); + + router.use(middleware); - router.get('/home', middleware, async (req, res) => { + router.get('/home', async (req, res) => { res.render('home', { user: req.user }); return res.status(status.Ok); }); - router.get('/assets', middleware, (req, res) => { + router.get('/assets', (req, res) => { res.render('assets', { user: req.user }); return res.status(status.Ok); }); - router.get('/plans', middleware, (req, res) => { + router.get('/plans', (req, res) => { res.render('plans', { user: req.user }); return res.status(status.Ok); }); - router.get('/more', middleware, (req, res) => { + router.get('/more', (req, res) => { res.render('more', { user: req.user }); return res.status(status.Ok); }); - router.get('/profile', middleware, (req, res) => { + router.get('/profile', (req, res) => { res.render('profiles', { user: req.user }); return res.status(status.Ok); }); - router.get('/settings', middleware, (req, res) => { + router.get('/settings', (req, res) => { res.render('settings', { user: req.user }); return res.status(status.Ok); }); + router.get('/logout', (req, res) => { + req.session.destroy(); + return res.redirect('/login'); + }); + return router; }; diff --git a/src/views/home.ejs b/src/views/home.ejs index 40c82dd..e8219bc 100644 --- a/src/views/home.ejs +++ b/src/views/home.ejs @@ -1,8 +1,9 @@ <%- include("./partials/fileHeader", {title: "RCalculator"}) %>
- <%- include("./partials/header") %>