UNPKG

3.73 kBJavaScriptView Raw
1/**
2 * Copyright 2014 Skytap Inc.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 **/
16
17var _ = require('underscore'),
18 Promise = require('bluebird'),
19 Filesystem = require('./filesystem'),
20 Logger = require('./logger');
21
22/**
23 * Module to load and manage controller filters.
24 **/
25var Filter = {
26
27 filters : {},
28
29 //////////////////////////////////////////////////////////////////////////
30 // Public methods ///////////////////////////////////////////////////////
31 ////////////////////////////////////////////////////////////////////////
32
33 /**
34 * Filter.getFilters() -> Object
35 **/
36 getFilters : function() {
37 return this.filters;
38 },
39
40 /**
41 * Filter.load(path) -> Object
42 * - path (String): Path to the filters
43 **/
44 load : function (path) {
45 var self = this,
46 start = Date.now();
47
48 return Filesystem.requireFilesInDirectory(path, true)
49 .then(function(filters) {
50 self.filters = filters;
51 Logger.profile('Load filters', start);
52 });
53 },
54
55 /**
56 * Filter.run(filters, request, response, next) -> Boolean
57 * - filters (Array): All filters to run
58 * - request (Object): Express request object
59 * - response (Object): Express response object
60 * - next (Function): Express next callback
61 **/
62 run : function (filters, request, response, next) {
63 var self = this,
64 filterFunctions = [];
65
66 if (!filters) {
67 return Promise.resolve();
68 }
69
70 _.each(filters, function (filter, index) {
71 if (self.filters[filter] !== undefined) {
72 filterFunctions.push(
73 self._runFilter(filter, request, response, next)
74 );
75 }
76 });
77
78 // run each filter in sequence
79 return filterFunctions.reduce(
80 function (current, next) {
81 return current.then(next);
82 },
83 Promise.resolve()
84 );
85 },
86
87 //////////////////////////////////////////////////////////////////////////
88 // Psuedo-private methods ///////////////////////////////////////////////
89 ////////////////////////////////////////////////////////////////////////
90
91 /**
92 * Filter._runFilter(filter, request, response, next) -> Function
93 * - filter (String): Filter name
94 * - request (Object): Express request object
95 * - response (Object): Express response object
96 * - next (Function): Express next callback
97 **/
98 _runFilter : function (filter, request, response, next) {
99 var self = this;
100
101 return function () {
102 var result;
103
104 try {
105 Logger.debug("Running the " + self.filters[filter].moduleName + " filter", request);
106 result = self.filters[filter].process(request, response, next);
107 return result instanceof Promise ? result : Promise.resolve(result);
108 } catch (e) {
109 Logger.debug("Rejected " + self.filters[filter].moduleName + " filter", request);
110 return Promise.reject(e);
111 }
112 };
113 }
114};
115
116module.exports = Filter;
\No newline at end of file