Skip to content

Commit

Permalink
Merge branch 'bugfix/KR-340-api-response' into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
Razvan Botea committed Sep 20, 2016
2 parents 0212dd0 + ee45dd8 commit b601d88
Showing 1 changed file with 80 additions and 72 deletions.
152 changes: 80 additions & 72 deletions app.js
Original file line number Diff line number Diff line change
Expand Up @@ -127,20 +127,84 @@ if(mainConfiguration.password_salt === undefined || mainConfiguration.password_s
Models.Application.logger.emergency('Please add salt configuration via TP_PW_SALT or config.json');
process.exit(3);
}
//app.set('password_salt', mainConfiguration.password_salt);

app.use(function(req, res, next) {
if (dbConnected) {
req._startAt = process.hrtime();
//used for timing request time
app.use(function TimeKeeping(req, res, next) {
req._startAt = process.hrtime();
res.on('finish', function() {
res._startAt = process.hrtime();
});

next();
});

app.use(bodyParser.json());
app.use(security.corsValidation);
app.use(security.contentTypeValidation);

app.use(function ServerNotAvailable(req, res, next) {
if (!dbConnected) {
next(new Models.TelepatError(Models.TelepatError.errors.ServerNotAvailable));
} else {
next();
}
});

app.use(function RequestLogging(err, req, res, next) {
var send = res.send;

res.send = function (string) {
var body = string instanceof Buffer ? string.toString() : string;
send.call(this, body);
res.on('finish', function() {
res._startAt = process.hrtime();
var requestLogMessage = req.method +' '+ req.baseUrl+req.url +' '+res.statusCode;

if (res._header && req._startAt && res._startAt) {
var ms = (res._startAt[0] - req._startAt[0]) * 1e3
+ (res._startAt[1] - req._startAt[1]) * 1e-6;

requestLogMessage += ' ' + ms.toFixed(3) + ' ms';
}

try {
var copyBody = JSON.parse(body);

if (res.statusCode >= 400) {
requestLogMessage += ' (['+copyBody.code+']: '+copyBody.message+')';
if (res.statusCode >= 500 && res._telepatError)
requestLogMessage += "\n"+res._telepatError.stack;
}
} catch (e) {}

requestLogMessage += ' ('+req.ip+')';

Models.Application.logger.info(requestLogMessage);
});
};
next(err);
});

return next();
function NotFoundMiddleware(req, res, next) {
next(new Models.TelepatError(Models.TelepatError.errors.NoRouteAvailable));
}

function FinalRouteMiddleware(err, req, res, next) {
var responseBody = {};

if (!(err instanceof Models.TelepatError)) {
err = new Models.TelepatError(Models.TelepatError.errors.ServerFailure, [err.message]);
}
res.type('application/json');
next(new Models.TelepatError(Models.TelepatError.errors.ServerNotAvailable));
});

res.status(err.status);
responseBody.code = err.code;
responseBody.message = err.message;
responseBody.status = err.status;
res._telepatError = err;
res.json(responseBody);
}

app.use(NotFoundMiddleware);
app.use(FinalRouteMiddleware);

var loadApplications = function(callback) {
Models.Application.loadAllApplications(null, null, function(err) {
Expand All @@ -154,43 +218,6 @@ var loadApplications = function(callback) {
};

var linkMiddlewaresAndRoutes = function(callback) {
app.use(bodyParser.json());
app.use(function(req, res, next) {
var send = res.send;

res.send = function (string) {
var body = string instanceof Buffer ? string.toString() : string;
send.call(this, body);
res.on('finish', function() {
var requestLogMessage = req.method +' '+ req.baseUrl+req.url +' '+res.statusCode;

if (res._header && req._startAt && res._startAt) {
var ms = (res._startAt[0] - req._startAt[0]) * 1e3
+ (res._startAt[1] - req._startAt[1]) * 1e-6;

requestLogMessage += ' ' + ms.toFixed(3) + ' ms';
}

try {
var copyBody = JSON.parse(body);

if (res.statusCode >= 400) {
requestLogMessage += ' (['+copyBody.code+']: '+copyBody.message+')';
if (res.statusCode >= 500 && res._telepatError)
requestLogMessage += "\n"+res._telepatError.stack;
}
} catch (e) {}

requestLogMessage += ' ('+req.ip+')';

Models.Application.logger.info(requestLogMessage);
});
};
next();
});
app.use(security.corsValidation);
app.use(security.contentTypeValidation);

app.use('/proxy', security.applicationIdValidation);
app.use('/proxy', security.apiKeyValidation);

Expand Down Expand Up @@ -358,36 +385,17 @@ var linkMiddlewaresAndRoutes = function(callback) {
callback();
};

var linkErrorHandlingMiddlewares = function(callback) {
// error handlers
// catch 404 and forward to error handler
app.use(function(req, res, next) {
next(new Models.TelepatError(Models.TelepatError.errors.NoRouteAvailable));
});

app.use(function(err, req, res, next) {
var responseBody = {};

if (!(err instanceof Models.TelepatError)) {
err = new Models.TelepatError(Models.TelepatError.errors.ServerFailure, [err.message]);
}

res.status(err.status);
responseBody.code = err.code;
responseBody.message = err.message;
responseBody.status = err.status;
res._telepatError = err;
res.json(responseBody);
});
callback();
};

var OnServicesConnect = function() {
//NotFoundMiddleware & FinalRouteMiddleware must always be the last ones so we need to remove & add them AFTER
//mounting the other routes
app._router.stack.splice(-2);

async.series([
loadApplications,
linkMiddlewaresAndRoutes,
linkErrorHandlingMiddlewares
linkMiddlewaresAndRoutes
], function() {
app.use(NotFoundMiddleware);
app.use(FinalRouteMiddleware);
dbConnected = true;
});
};
Expand Down

0 comments on commit b601d88

Please sign in to comment.