UNPKG

tachi

Version:

Node.js MVC framework for seriously rapid application development.

87 lines (68 loc) 2.28 kB
var authHandler = require('../Auth/authHandler'); module.exports = (function() { var getAction = function(request, response, data, classLoader) { var controller = classLoader.getController(data.controller || '', request, response); if (!controller) { return false; } var action = (data.action || 'index').toLowerCase(); if (data._method === 'POST' && controller[action + '_post']) { action = action + '_post'; } if (controller && controller[action]) { return { controller: controller, action: action }; } return false; }; var ControllerHandler = function ControllerHandler(defaultRoute, loginUrl, classLoader) { return function(request, response, data) { var deferred = new Deferred(); if (!data || !data.controller) { data = Utils.extend(data || {}, defaultRoute); } var controllerData = getAction(request, response, data, classLoader); if (!controllerData) { controllerData = getAction(request, response, defaultRoute, classLoader); } if (!controllerData) { // To prevent infinite redirects when the default route is mis-specified. deferred.complete(false); return deferred; } var controller = controllerData.controller; var action = controllerData.action; var authenticatedActions = controller._authenticate; if (authenticatedActions) { var requestedActionIsAuthenticated = false; for (var i = authenticatedActions.length; i--;) { var authenticatedActionName = authenticatedActions[i]; if (authenticatedActionName == action) { requestedActionIsAuthenticated = true; } } if (requestedActionIsAuthenticated && !authHandler.isAuthenticated(controller)) { deferred.complete({ _redirect: loginUrl }); return deferred; } } controller._promiseCallback = deferred.complete; var output = controller[action](data); if (output) { if (output instanceof Deferred) { output.onComplete(deferred.complete); } else { deferred.complete(output); } } return deferred; }; }; // Expose some methods for unit testing. ControllerHandler.getAction = getAction; return ControllerHandler; })();