diff --git a/package-lock.json b/package-lock.json index 692151d..0ab2133 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "express-handlebars": "^4.0.4", "fs-extra": "^9.1.0", "ioredis": "^4.26.0", + "morgan": "^1.10.0", "redis-json": "^5.0.0", "trello": "^0.10.0" } @@ -52,6 +53,17 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", @@ -561,6 +573,29 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, + "node_modules/morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "dependencies": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/morgan/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -620,6 +655,14 @@ "node": ">= 0.8" } }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -995,6 +1038,14 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "requires": { + "safe-buffer": "5.1.2" + } + }, "body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", @@ -1391,6 +1442,25 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, + "morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "requires": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + } + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -1435,6 +1505,11 @@ "ee-first": "1.1.1" } }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", diff --git a/package.json b/package.json index 2c3b14c..1ccbbd2 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "express-handlebars": "^4.0.4", "fs-extra": "^9.1.0", "ioredis": "^4.26.0", + "morgan": "^1.10.0", "redis-json": "^5.0.0", "trello": "^0.10.0" } diff --git a/src/routers/faq.js b/src/routers/faq.js index f373388..f83c475 100644 --- a/src/routers/faq.js +++ b/src/routers/faq.js @@ -1,7 +1,7 @@ const { Router } = require('express'); const router = new Router(); -router.get('/', (_req, res) => { +router.get('/', (request, response) => { res.redirect('/#faq'); }); diff --git a/src/server.js b/src/server.js index 60ec43e..6bbe882 100644 --- a/src/server.js +++ b/src/server.js @@ -1,28 +1,40 @@ process.title = 'Pretendo - Website'; -const logger = require('./logger'); const express = require('express'); const handlebars = require('express-handlebars'); +const morgan = require('morgan'); +const logger = require('./logger'); +const util = require('./util'); const config = require('../config.json'); const { http: { port } } = config; const app = express(); +logger.info('Setting up Middleware'); +app.use(morgan('dev')); + +logger.info('Importing page routers'); const routers = { home: require('./routers/home'), faq: require('./routers/faq'), progress: require('./routers/progress') }; -app.use('*', (req, res, next) => { - logger.info(`${req.method.toUpperCase()} ${req.originalUrl}`); - next(); -}); - app.use('/', routers.home); app.use('/faq', routers.faq); app.use('/progress', routers.progress); +logger.info('Creating 404 status handler'); +// This works because it is the last router created +// Meaning the request could not find a valid router +app.use((request, response) => { + const fullUrl = util.fullUrl(request); + logger.warn(`HTTP 404 at ${fullUrl}`); + + response.sendStatus(404); // TODO: 404 page +}); + +logger.info('Setting up handlebars engine'); app.engine('handlebars', handlebars({ helpers: { doFaq(value, options) { @@ -51,8 +63,10 @@ app.engine('handlebars', handlebars({ })); app.set('view engine', 'handlebars'); +logger.info('Setting up static public folder'); app.use(express.static('public')); +logger.info('Starting server') app.listen(port, () => { logger.success(`Server listening on *:${port}`); }); \ No newline at end of file diff --git a/src/util.js b/src/util.js new file mode 100644 index 0000000..7835f06 --- /dev/null +++ b/src/util.js @@ -0,0 +1,7 @@ +function fullUrl(request) { + return `${request.protocol}://${request.hostname}${request.originalUrl}`; +} + +module.exports = { + fullUrl +} \ No newline at end of file