UNPKG

@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
'use strict'; //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'); }