import fs from 'fs'; import _ from 'lodash'; import { getUserLanguage, } from '../middlewares/language'; // Wrapper function to handler `async` route handlers that return promises // It takes the async function, execute it and pass any error to next (args[2]) let _wrapAsyncFn = fn => (...args) => fn(...args).catch(args[2]); let noop = (req, res, next) => next(); module.exports.readController = function readController (router, controller, overrides = []) { _.each(controller, (action) => { let {method, url, middlewares = [], handler} = action; // Allow to specify a list of routes (METHOD + URL) to skip if (overrides.indexOf(`${method}-${url}`) !== -1) return; // If an authentication middleware is used run getUserLanguage after it, otherwise before // for cron instead use it only if an authentication middleware is present let authMiddlewareIndex = _.findIndex(middlewares, middleware => { if (middleware.name.indexOf('authWith') === 0) { // authWith{Headers|Session|Url|...} return true; } else { return false; } }); let middlewaresToAdd = [getUserLanguage]; if (action.noLanguage !== true) { if (authMiddlewareIndex !== -1) { // the user will be authenticated, getUserLanguage after authentication if (authMiddlewareIndex === middlewares.length - 1) { middlewares.push(...middlewaresToAdd); } else { middlewares.splice(authMiddlewareIndex + 1, 0, ...middlewaresToAdd); } } else { // no auth, getUserLanguage as the first middleware middlewares.unshift(...middlewaresToAdd); } } method = method.toLowerCase(); let fn = handler ? _wrapAsyncFn(handler) : noop; router[method](url, ...middlewares, fn); }); }; module.exports.walkControllers = function walkControllers (router, filePath, overrides) { fs .readdirSync(filePath) .forEach(fileName => { if (!fs.statSync(filePath + fileName).isFile()) { walkControllers(router, `${filePath}${fileName}/`, overrides); } else if (fileName.match(/\.js$/)) { let controller = require(filePath + fileName); // eslint-disable-line global-require module.exports.readController(router, controller, overrides); } }); };