aztec
Version:
Node Js Framework for creating API Services
98 lines (77 loc) • 2.65 kB
text/typescript
import { extend, isArray } from 'lodash';
import http = require('http');
import fs = require('fs');
const xml = require('xml');
const sendStatus = (data, res: http.ServerResponse): void => {
let {status} = data;
if (status) {
res.statusCode = status;
res.statusMessage = http.STATUS_CODES[status];
}
};
export const extendServerResponse = (svc, res: http.ServerResponse): http.ServerResponse => {
const extendedValues = {
status: (data: number): http.ServerResponse => {
res.statusCode = data;
res.statusMessage = http.STATUS_CODES[data];
return res;
},
send: (data): http.ServerResponse => {
sendStatus(data, res);
switch (svc.get('format')) {
case 'json': res.end(JSON.stringify(data)); break;
case 'xml': {
if (isArray(data)) {
let dataAsObject = { collection: {} };
data.forEach((item, i) => {
dataAsObject.collection[i] = item;
});
if (Object.keys(dataAsObject.collection).length === data.length) {
res.write(xml(dataAsObject), 'utf8'); res.end(); break;
}
} else {
res.write(xml(data), 'utf8'); res.end(); break;
}
}
}
return res;
},
cast: (data): http.ServerResponse => {
sendStatus(data, res);
switch (svc.get('format')) {
case 'json': res.write(JSON.stringify(data), 'utf-8'); break;
case 'xml': {
if (isArray(data)) {
let dataAsObject = { collection: {} };
data.forEach((item, i) => {
dataAsObject.collection[i] = item;
});
if (Object.keys(dataAsObject.collection).length === data.length) {
res.write(xml(dataAsObject), 'utf8'); break;
}
} else {
res.write(xml(data), 'utf8'); break;
}
}
}
return res;
},
render: (path: string, type: string = 'html'): http.ServerResponse => {
if (path.indexOf('.') === -1 || path.indexOf(`.${type}`) === -1) {
res.writeHead(200, { 'Content-Type': `text/${type}` });
res.write(fs.readFileSync(`${svc.get('public-path')}/${path}.${type}`, 'utf8'));
return res;
} else {
if (type === 'js') type = 'javascript';
res.writeHead(200, { 'Content-Type': `text/${type}` });
res.write(fs.readFileSync(path, 'utf8'));
return res;
}
},
redirect: (path: string, code = 302): void => {
res.writeHead(code, { 'Location': path });
res.end();
}
};
return extend(res, extendedValues);
};