feat: add morgan for logging requests if env is not production

This commit is contained in:
Zephyrrus 2020-07-08 03:15:27 +03:00
parent 1526637881
commit 49d3e3b203
3 changed files with 46 additions and 20 deletions

View File

@ -31,6 +31,7 @@
"node": ">=8.0.0"
},
"dependencies": {
"@mdi/font": "^5.3.45",
"@nuxtjs/axios": "^5.4.1",
"adm-zip": "^0.4.13",
"bcrypt": "^4.0.1",
@ -58,6 +59,7 @@
"knex": "^0.16.3",
"masonry-layout": "^4.2.2",
"moment": "^2.24.0",
"morgan": "^1.10.0",
"multer": "^1.4.1",
"mysql": "^2.16.0",
"nuxt": "2.12.2",
@ -168,7 +170,9 @@
"error",
"tab"
],
"import/no-extraneous-dependencies": "off"
"import/no-extraneous-dependencies": "off",
"no-restricted-syntax": "off",
"no-continue": "off"
},
"settings": {
"import/resolver": {

View File

@ -7,9 +7,9 @@ const db = require('knex')({
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_DATABASE,
filename: nodePath.join(__dirname, '../../../database.sqlite')
filename: nodePath.join(__dirname, '../../../database.sqlite'),
},
postProcessResponse: result => {
postProcessResponse: (result) => {
/*
Fun fact: Depending on the database used by the user and given that I don't want
to force a specific database for everyone because of the nature of this project,
@ -18,8 +18,8 @@ const db = require('knex')({
*/
const booleanFields = ['enabled', 'enableDownload', 'isAdmin'];
const processResponse = row => {
Object.keys(row).forEach(key => {
const processResponse = (row) => {
Object.keys(row).forEach((key) => {
if (booleanFields.includes(key)) {
if (row[key] === 0) row[key] = false;
else if (row[key] === 1) row[key] = true;
@ -28,11 +28,11 @@ const db = require('knex')({
return row;
};
if (Array.isArray(result)) return result.map(row => processResponse(row));
if (Array.isArray(result)) return result.map((row) => processResponse(row));
if (typeof result === 'object') return processResponse(result);
return result;
},
useNullAsDefault: process.env.DB_CLIENT === 'sqlite3' ? true : false
useNullAsDefault: process.env.DB_CLIENT === 'sqlite3',
});
const moment = require('moment');
const log = require('../utils/Log');
@ -76,11 +76,9 @@ class Route {
.where({ id })
.first();
if (!user) return res.status(401).json({ message: 'Invalid authorization' });
if (iat && iat < moment(user.passwordEditedAt).format('x'))
return res.status(401).json({ message: 'Token expired' });
if (iat && iat < moment(user.passwordEditedAt).format('x')) { return res.status(401).json({ message: 'Token expired' }); }
if (!user.enabled) return res.status(401).json({ message: 'This account has been disabled' });
if (this.options.adminOnly && !user.isAdmin)
return res.status(401).json({ message: 'Invalid authorization' });
if (this.options.adminOnly && !user.isAdmin) { return res.status(401).json({ message: 'Invalid authorization' }); }
return this.run(req, res, db, user);
});
@ -100,7 +98,7 @@ class Route {
run(req, res, db) {
// eslint-disable-line no-unused-vars
return;
}
error(res, error) {

View File

@ -1,6 +1,5 @@
require('dotenv').config();
const log = require('../utils/Log');
const express = require('express');
const helmet = require('helmet');
const cors = require('cors');
@ -8,11 +7,14 @@ const RateLimit = require('express-rate-limit');
const bodyParser = require('body-parser');
const jetpack = require('fs-jetpack');
const path = require('path');
const morgan = require('morgan');
const log = require('../utils/Log');
const ThumbUtil = require('../utils/ThumbUtil');
const rateLimiter = new RateLimit({
windowMs: parseInt(process.env.RATE_LIMIT_WINDOW, 10),
max: parseInt(process.env.RATE_LIMIT_MAX, 10),
delayMs: 0
delayMs: 0,
});
class Server {
@ -32,16 +34,38 @@ class Server {
});
this.server.use(bodyParser.urlencoded({ extended: true }));
this.server.use(bodyParser.json());
if (process.env.NODE_ENV !== 'production') {
this.server.use(morgan('combined', {
skip(req) {
let ext = req.path.split('.').pop();
if (ext) { ext = `.${ext.toLowerCase()}`; }
if (
ThumbUtil.imageExtensions.indexOf(ext) > -1
|| ThumbUtil.videoExtensions.indexOf(ext) > -1
|| req.path.indexOf('_nuxt') > -1
|| req.path.indexOf('favicon.ico') > -1
) {
return true;
}
return false;
},
'stream': {
write(str) { log.debug(str); },
},
}));
}
// this.server.use(rateLimiter);
// Serve the uploads
this.server.use(express.static(path.join(__dirname, '..', '..', '..', 'uploads')));
this.routesFolder = path.join(__dirname, '..', 'routes');
this.server.use(express.static(path.join(__dirname, '../../../uploads')));
this.routesFolder = path.join(__dirname, '../routes');
}
registerAllTheRoutes() {
jetpack.find(this.routesFolder, { matching: '*.js' }).forEach(routeFile => {
const RouteClass = require(path.join('..', '..', '..', routeFile));
jetpack.find(this.routesFolder, { matching: '*.js' }).forEach((routeFile) => {
// eslint-disable-next-line import/no-dynamic-require, global-require
const RouteClass = require(path.join('../../../', routeFile));
let routes = [RouteClass];
if (Array.isArray(RouteClass)) routes = RouteClass;
for (const File of routes) {
@ -55,7 +79,7 @@ class Server {
serveNuxt() {
// Serve the frontend if we are in production mode
if (process.env.NODE_ENV === 'production') {
this.server.use(express.static(path.join(__dirname, '..', '..', '..', 'dist')));
this.server.use(express.static(path.join(__dirname, '../../../dist')));
}
/*
@ -66,7 +90,7 @@ class Server {
*/
this.server.all('*', (_req, res) => {
try {
res.sendFile(path.join(__dirname, '..', '..', '..', 'dist', 'index.html'));
res.sendFile(path.join(__dirname, '../../../dist/index.html'));
} catch (error) {
res.json({ success: false, message: 'Something went wrong' });
}