@sap/xsodata
Version:
Expose data from a HANA database as OData V2 service with help of .xsodata files.
163 lines (131 loc) • 4.11 kB
JavaScript
;
//Includes
var filter_parser = require('../parsers/jison_filter_parser');
var orderBy_parser = require('../parsers/jison_orderby_parser');
var BadRequest = require('./../utils/errors/http/badRequest');
var NotSupported = require('./../utils/errors/http/notSupported');
var UnsupportedMediatype = require('./../utils/errors/http/unsupportedMediaType');
//API
exports.parseExpand = parseExpand;
exports.parseSelect = parseSelect;
exports.parseFilter = parseFilter;
exports.parseOrderBy = parseOrderBy;
exports.parseTop = parseTop;
exports.parseFormat = parseFormat;
exports.parseSkip = parseSkip;
exports.parseInlineCount = parseInlineCount;
exports.parseSkipToken = parseSkipToken;
//Code
var onlyIntRegexObj = /^\d+$/;
function parseTop(top) {
if (!onlyIntRegexObj.test(top)) {
throw new BadRequest('Invalid value for system query $top.');
}
var ret = parseInt(top);
if (ret > 2147483647) {
throw new BadRequest('Invalid value for system query $top.');
} else if (ret < 0) {
throw new BadRequest('Invalid value for system query $top.');
}
return ret;
}
function parseSkip(skip) {
if (!onlyIntRegexObj.test(skip)) {
throw new BadRequest('Invalid value for system query $skip.');
}
var ret = parseInt(skip);
if (ret > 2147483647) {
throw new BadRequest('Invalid value for system query $skip.');
} else if (ret < 0) {
throw new BadRequest('Invalid value for system query $skip.');
}
return ret;
}
function parseSkipToken() {
throw new NotSupported('$skipToken not supported');
}
function parseInlineCount(inlineCount) {
if (inlineCount === 'allpages') {
return true;
} else if (inlineCount === 'none') {
return false;
}
throw new BadRequest('Invalid value for system query inlinecount.');
}
function parseSelect(select) {
var selectclauses = [];
if (!select) {
return selectclauses;
}
var rawSelectClauses = select.split(',');
for (var i = 0; i < rawSelectClauses.length; i++) {
var rawSelectClause = rawSelectClauses[i];
var rawSelectItems = rawSelectClause.split('/');
var selectItems = [];
for (var ii = 0; ii < rawSelectItems.length; ii++) {
var rawSelectItem = rawSelectItems[ii];
selectItems.push(rawSelectItem);
}
selectclauses.push(selectItems);
}
return selectclauses;
}
function parseExpand(expand) {
var expandclauses = [];
if (!expand) {
return expandclauses;
}
var rawExpandClauses = expand.split(',');
for (var i = 0; i < rawExpandClauses.length; i++) {
var rawExpandClause = rawExpandClauses[i];
var rawExpandItems = rawExpandClause.split('/');
var expandList = [];
for (var ii = 0; ii < rawExpandItems.length; ii++) {
var rawExpandItem = rawExpandItems[ii];
expandList.push(rawExpandItem);
}
expandclauses.push(expandList);
}
return expandclauses;
}
function parseFilter(filter, done) {
var ast,
error;
try {
ast = filter_parser.parse(filter);
} catch (ex) {
error = new BadRequest("Provided $filter expression is not valid");
}
if (done !== undefined) {
done(error, ast);
} else {
if (error) {
throw error;
}
return ast;
}
}
function parseOrderBy(orderBy, done) {
if (done !== undefined) {
var ast;
try {
ast = orderBy_parser.parse(orderBy);
} catch (ex) {
return done(ex);
}
return done(undefined, ast); //don't catch any error from the cb
} else {
return orderBy_parser.parse(orderBy);
}
}
function parseFormat(format) {
//only lower case allowed!
if (format === 'json') {
return 'json';
} else if (format === 'atom') {
return 'atom';
} else if (format === 'xml') {
return 'xml';
}
throw new UnsupportedMediatype('Unsupported value for $format query option');
}