nitrogen-core
Version:
Core services used across ingestion, registry, and consumption servers.
181 lines (145 loc) • 4.69 kB
JavaScript
var fs = require('fs')
, core = require('../../lib')
, mongoose = require('mongoose')
, ServiceError = require('./serviceError');
var authenticationError = function(msg) {
return new ServiceError({
statusCode: 401,
message: msg || "Authentication failed, please log in."
});
};
var authorizationError = function(msg) {
var msg = msg || "Principal is not authorized to perform the requested operation.";
return new ServiceError({
statusCode: 403,
message: msg
});
};
var badRequestError = function(msg) {
return new ServiceError({
statusCode: 400,
message: msg
});
};
var handleError = function(res, err) {
if (err instanceof ServiceError) {
var statusCode = err.statusCode || 400;
core.log.error(err.message);
return sendFailedResponse(res, statusCode, err);
}
if (err === 400) return sendFailedResponse(res, 400, err);
if (err === 401) return sendFailedResponse(res, 401, err);
if (err === 403) return sendFailedResponse(res, 403, err);
if (err === 404) return sendFailedResponse(res, 404, err);
if (err) return sendFailedResponse(res, 400, err);
};
var internalError = function(msg) {
return new ServiceError({
statusCode: 500,
message: msg
});
};
var ipFromRequest = function(req) {
if (!req || !req.ip) return;
var ipParts = req.ip.split(":");
if (ipParts.length)
return ipParts[0];
else
return req.ip;
};
var nop = function() {
var callback;
if (arguments) {
callback = arguments[arguments.length-1];
}
if (callback) return callback();
}
var notFoundError = function(msg) {
return new ServiceError({
statusCode: 404,
message: msg || "Requested resource not found."
});
};
var parseQuery = function(req) {
var query = {};
if (req.query.q) {
query = JSON.parse(req.query.q);
}
return query;
};
var parseOptions = function(req) {
var options = {};
if (req.query.options) {
options = JSON.parse(req.query.options);
}
if (!options.limit || options.limit > 10000) options.limit = 10000;
return options;
};
var pipeFile = function(filename) {
return function(req, res) {
fs.exists(filename, function(exists) {
if (!exists) return core.log.error('pipeFile: path ' + filename + ' not found.');
fs.createReadStream(filename).pipe(res);
});
};
};
var principalRequired = function() {
return new ServiceError({
statusCode: 400,
message: "Principal required to perform the requested operation."
});
};
var sendFailedResponse = function(res, statusCode, err) {
res.contentType('application/json');
res.send(statusCode, { error: err });
};
var stringEndsWith = function(s, suffix) {
return s.indexOf(suffix, s.length - suffix.length) !== -1;
};
var stringStartsWith = function(s, prefix) {
return s.substr(0, prefix.length) === prefix;
};
// convert dates to Date objects and string objectIds to objectIds
var translateQuery = function(obj, options) {
for (var prop in obj) {
if (typeof obj[prop] === "object")
// recursively handle subobjects
obj[prop] = translateQuery(obj[prop], options);
else if (options.objectIdFields && options.objectIdFields.indexOf(prop) != -1) {
if (Object.prototype.toString.call(obj[prop]) === '[object Array]') {
obj[prop] = obj[prop].map(mongoose.Types.ObjectId);
} else {
obj[prop] = new mongoose.Types.ObjectId(obj[prop]);
}
} else if (options.dateFields && options.dateFields.indexOf(prop) != -1) {
obj[prop] = new Date(Date.parse(obj[prop]));
}
}
return obj;
};
var uuid = function() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
return v.toString(16);
});
};
module.exports = {
authenticationError: authenticationError,
authorizationError: authorizationError,
badRequestError: badRequestError,
ipFromRequest: ipFromRequest,
internalError: internalError,
handleError: handleError,
nop: nop,
notFoundError: notFoundError,
parseQuery: parseQuery,
parseOptions: parseOptions,
pipeFile: pipeFile,
principalRequired: principalRequired,
sendFailedResponse: sendFailedResponse,
ServiceError: ServiceError,
stringEndsWith: stringEndsWith,
stringStartsWith: stringStartsWith,
translateQuery: translateQuery,
uuid: uuid
};