/* ---------------------------------------------------------------------------- Question Server GitLab: <https://gitlab.com/MrFry/mrfrys-node-server> This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. ------------------------------------------------------------------------- */ import logger from '../utils/logger' import type { Response, NextFunction } from 'express' import type { Request } from '../types/basicTypes' interface Options { loggableKeywords: Array<string> loggableModules: Array<string> exceptions: Array<string> excludeFromStats: Array<string> } export default function (options: Options): any { const loggableKeywords = options ? options.loggableKeywords : undefined const loggableModules = options ? options.loggableModules : undefined const exceptions = options.exceptions || [] const excludeFromStats = options.excludeFromStats || [] return function (req: Request, res: Response, next: NextFunction) { res.on('finish', function () { // TODO: test this const isException = exceptions.some((ex) => { return req.url.includes(ex) }) if (isException) { return } let hostname = 'NOHOST' if (req.hostname) { hostname = req.hostname.replace('www.', '').split('.')[0] } else { logger.Log('Hostname is undefined!', logger.GetColor('redbg')) console.log(req.body) console.log(req.query) console.log(req.headers) } const hasLoggableKeyword = loggableKeywords && loggableKeywords.some((keyword) => { return req.url.includes(keyword) }) const hasLoggableModule = loggableModules && loggableModules.some((keyword) => { return hostname.includes(keyword) }) const toLog = hasLoggableModule || hasLoggableKeyword logger.LogReq(req, true, res.statusCode) if (toLog) { logger.LogReq(req) } const shouldLogStat = !excludeFromStats.some((ex) => { return req.url.includes(ex) }) if (res.statusCode !== 404 && shouldLogStat) { logger.LogStat( req.url, hostname, req.session && req.session.user ? req.session.user.id : 'NOUSER' ) } }) next() } }