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 |
|
17 | var _ = 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 | **/
|
25 | var 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 |
|
116 | module.exports = Filter; |
\ | No newline at end of file |