UNPKG

7.67 kBJavaScriptView Raw
1var plugin = require("../.././plugin/extend");
2var responseinterceptor=require('responseinterceptor');
3var async=require('async');
4var fs = require('fs');
5
6function 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
16function 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
30function 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
74function 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(); // do nothing
142 });
143}
144
145exports.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
154function 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
176exports.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); // remove , and \n
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* <table><tbody>
226 <tr><th align="left">Alessandro Romanino</th><td><a href="https://github.com/aromanino">GitHub/aromanino</a></td><td><a href="mailto:a.romanino@gmail.com">mailto:a.romanino@gmail.com</a></td></tr>
227 <tr><th align="left">Guido Porruvecchio</th><td><a href="https://github.com/gporruvecchio">GitHub/porruvecchio</a></td><td><a href="mailto:guido.porruvecchio@gmail.com">mailto:guido.porruvecchio@gmail.com</a></td></tr>
228 </tbody></table>
229
230
231
232 * */