1 | var plugin = require("../.././plugin/extend");
|
2 | var responseinterceptor=require('responseinterceptor');
|
3 | var async=require('async');
|
4 | var fs = require('fs');
|
5 |
|
6 | function LoadParams(params,req){
|
7 | var values={};
|
8 | params.forEach(function(element,index){
|
9 | values[element]=req[element];
|
10 | });
|
11 |
|
12 | return values;
|
13 | }
|
14 |
|
15 |
|
16 | function writeParams(params,req, beforeParams){
|
17 |
|
18 | if((typeof params) ==="object"){
|
19 | async.eachOf(params, function(value,key, callback) {
|
20 | if(beforeParams)
|
21 | beforeParams[key]=value;
|
22 | req[key]=value;
|
23 | });
|
24 | }else{
|
25 | req.before=params;
|
26 | }
|
27 | }
|
28 |
|
29 |
|
30 | function setErrorResponse(res,err){
|
31 | var errorString="";
|
32 | switch(err.error_code) {
|
33 | case 400:
|
34 | errorString="Bad Request";
|
35 | break;
|
36 |
|
37 | case 401:
|
38 | errorString="Unauthorized";
|
39 | break;
|
40 |
|
41 | case 403:
|
42 | errorString="Forbidden";
|
43 | break;
|
44 |
|
45 | case 404:
|
46 | errorString="Not Found";
|
47 | break;
|
48 |
|
49 | case 409:
|
50 | errorString="Conflict";
|
51 | break;
|
52 |
|
53 | case 500:
|
54 | errorString="Internal Server Error";
|
55 | break;
|
56 |
|
57 | case 504:
|
58 | errorString="Gateway Timeout";
|
59 | break;
|
60 |
|
61 | default:
|
62 | errorString=err.error_code;
|
63 | break;
|
64 | }
|
65 |
|
66 | if((typeof err.error_message) === 'object')
|
67 | err.error_message=JSON.stringify(err.error_message);
|
68 |
|
69 | res.status(err.error_code).send({error:errorString, error_message:err.error_message});
|
70 | }
|
71 |
|
72 |
|
73 |
|
74 | function extendGet(app,method,ext) {
|
75 | method=method.toLocaleLowerCase();
|
76 | app[method](ext.resource, function(req,res,next) {
|
77 | var params= LoadParams(ext.params,req);
|
78 |
|
79 | if(ext.mode=="override") {
|
80 | ext.extender(params,null,null,function (err, val) {
|
81 | if(!err) {
|
82 | res.send(val);
|
83 | }
|
84 | else{
|
85 | setErrorResponse(res,err);
|
86 | }
|
87 | });
|
88 | } else if(ext.mode=="before") {
|
89 | ext.extender(params,null,null,function (err, val) {
|
90 | if(!err){
|
91 | writeParams(val, req);
|
92 | next();
|
93 | }else{
|
94 | setErrorResponse(res,err);
|
95 | }
|
96 | });
|
97 | }else if(ext.mode=="after") {
|
98 | responseinterceptor.interceptOnFly(req,res,function(body,cType, request, clb){
|
99 | if(!(req.before_after_error==true)) {
|
100 | ext.extender(params, body, cType, function (err, val) {
|
101 | if (!err) {
|
102 | clb(val);
|
103 | } else {
|
104 | req.before_after_error = true;
|
105 | if((typeof err.error_message).indexOf("object")<0)
|
106 | res.setHeader('content-type', 'text/javascript');
|
107 | setErrorResponse(res,err);
|
108 | }
|
109 | });
|
110 | }else
|
111 | clb(body);
|
112 | });
|
113 | next();
|
114 | } else if(ext.mode=="before_after") {
|
115 |
|
116 | ext.extender.before(params,null,null,function (err, val) {
|
117 | if(!err) {
|
118 | writeParams(val, req, params);
|
119 | next();
|
120 | }else{
|
121 | req.before_after_error=true;
|
122 | setErrorResponse(res,err);
|
123 | }
|
124 | });
|
125 |
|
126 | responseinterceptor.interceptOnFly(req,res,function(body,cType, request, clb){
|
127 | if(!(req.before_after_error==true)) {
|
128 | ext.extender.after(params, body, cType, function (err, val) {
|
129 | if (!err) {
|
130 | clb(val);
|
131 | } else {
|
132 | req.before_after_error = true;
|
133 | if((typeof err.error_message).indexOf("object")<0)
|
134 | res.setHeader('content-type', 'text/javascript');
|
135 | setErrorResponse(res,err);
|
136 | }
|
137 | });
|
138 | }else
|
139 | clb(body);
|
140 | });
|
141 | }else next();
|
142 | });
|
143 | }
|
144 |
|
145 | exports.extend=function(app){
|
146 | async.eachSeries(plugin, function(ext, callback) {
|
147 | if( ext.enabled && (ext.enabled===true))
|
148 | extendGet(app,ext.method,ext);
|
149 | callback();
|
150 | });
|
151 | };
|
152 |
|
153 |
|
154 | function getErrorHandlers(app,error_map) {
|
155 | var route, stack;
|
156 |
|
157 | stack = app._router.stack;
|
158 |
|
159 |
|
160 | async.eachOfSeries(stack, function(layer,key, callback) {
|
161 | if (layer && layer.name == '<anonymous>' && layer.route == undefined)
|
162 | callback(key);
|
163 | else callback();
|
164 |
|
165 | }, function(err_map) {
|
166 | var error_handlers=null;
|
167 | if(err_map){
|
168 | error_handlers = stack.splice(err_map);
|
169 | app._router.stack=stack;
|
170 | }
|
171 | error_map(error_handlers);
|
172 | });
|
173 | }
|
174 |
|
175 |
|
176 | exports.install=function(app,extender,save){
|
177 | getErrorHandlers(app,function(error_handlers){
|
178 | extendGet(app,extender.method,extender);
|
179 |
|
180 | if(error_handlers)
|
181 | app._router.stack.push.apply(app._router.stack, error_handlers);
|
182 |
|
183 | if(save){
|
184 | plugin.push(extender);
|
185 | var functionToString="[\n";
|
186 | async.eachSeries(plugin,function(obj,callback){
|
187 | functionToString += " {\n";
|
188 | functionToString += (" \"resource\":\"") + obj.resource.toString() + "\",\n";
|
189 | functionToString += (" \"method\":\"") + obj.method.toString() + "\",\n";
|
190 | functionToString += (" \"mode\":\"") + obj.mode.toString() + "\",\n";
|
191 | functionToString += " \"params\":[" ;
|
192 | obj.params.forEach(function (value) {
|
193 | functionToString+="\"" + value.toString() + "\",";
|
194 | });
|
195 | if(obj.params.length>0) functionToString=functionToString.slice(0,-1);
|
196 | functionToString+="],\n";
|
197 |
|
198 | if(obj.extender && obj.extender.before) {
|
199 | functionToString += (" \"extender\":{\n");
|
200 | functionToString += (" \"before\":") + obj.extender.before.toString() + ",\n";
|
201 | functionToString += (" \"after\":") + obj.extender.after.toString() + "\n";
|
202 | functionToString += (" }\n");
|
203 | }else{
|
204 | functionToString += (" \"extender\":") + obj.extender.toString() + "\n";
|
205 | }
|
206 | functionToString += " },\n";
|
207 | callback();
|
208 | },function(err){
|
209 | functionToString=functionToString.slice(0,-2);
|
210 | functionToString+="\n]";
|
211 | var nfile='var express = require(\'express\');\n\r' +
|
212 | '\n\r' +
|
213 | 'var plugins=' + functionToString + ';\n\r' +
|
214 | 'module.exports = plugins;';
|
215 |
|
216 | fs.writeFile("./plugin/extend.js", nfile, function(err) {
|
217 | console.log("DONE:" + err);
|
218 | });
|
219 | });
|
220 | }
|
221 | });
|
222 | };
|
223 |
|
224 |
|
225 |
|
226 |
|
227 |
|
228 |
|
229 |
|
230 |
|
231 |
|
232 |
|