aboutsummaryrefslogtreecommitdiff
path: root/src/api/structures
diff options
context:
space:
mode:
authorZephyrrus <[email protected]>2020-07-08 03:15:27 +0300
committerZephyrrus <[email protected]>2020-07-08 03:15:27 +0300
commit49d3e3b203ee287a53beb2a04faa8bf38ace6834 (patch)
treee5dd7064edca3bb41b26d20368ec6c013b3b4c23 /src/api/structures
parentfeat: add new sidebar with mdi icons and active reactivity (diff)
downloadhost.fuwn.me-49d3e3b203ee287a53beb2a04faa8bf38ace6834.tar.xz
host.fuwn.me-49d3e3b203ee287a53beb2a04faa8bf38ace6834.zip
feat: add morgan for logging requests if env is not production
Diffstat (limited to 'src/api/structures')
-rw-r--r--src/api/structures/Route.js20
-rw-r--r--src/api/structures/Server.js40
2 files changed, 41 insertions, 19 deletions
diff --git a/src/api/structures/Route.js b/src/api/structures/Route.js
index 2402481..c2ad32e 100644
--- a/src/api/structures/Route.js
+++ b/src/api/structures/Route.js
@@ -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) {
diff --git a/src/api/structures/Server.js b/src/api/structures/Server.js
index a8eccd9..5d2290b 100644
--- a/src/api/structures/Server.js
+++ b/src/api/structures/Server.js
@@ -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' });
}