UNPKG

@sap/xsodata

Version:

Expose data from a HANA database as OData V2 service with help of .xsodata files.

240 lines (211 loc) 4.59 kB
'use strict'; var Http404 = require('../../utils/errors/http/badRequest'); var Http501 = require('../../utils/errors/http/notImplemented'); var uriType = require('../uriType'); var sqoMap = {}; sqoMap[uriType.URI0] = { expand: false, filter: false, format: true, orderby: false, skip: false, top: false, skiptoken: false, inlinecount: false, select: false }; sqoMap[uriType.URI1] = { expand: true, filter: true, format: true, orderby: true, skip: true, top: true, skiptoken: false, inlinecount: true, select: true }; sqoMap[uriType.URI2] = { expand: true, filter: true, format: true, orderby: false, skip: false, top: false, skiptoken: false, inlinecount: false, select: true }; sqoMap[uriType.URI5A] = { expand: false, filter: false, format: true, orderby: false, skip: false, top: false, skiptoken: false, inlinecount: false, select: false }; sqoMap[uriType.URI5B] = { expand: false, filter: false, format: false, orderby: false, skip: false, top: false, skiptoken: false, inlinecount: false, select: false }; sqoMap[uriType.URI6A] = { expand: true, filter: true, format: true, orderby: false, skip: false, top: false, skiptoken: false, inlinecount: false, select: true }; sqoMap[uriType.URI6B] = { expand: true, filter: true, format: true, orderby: true, skip: true, top: true, skiptoken: false, inlinecount: true, select: true }; sqoMap[uriType.URI7A] = { expand: false, filter: true, format: true, orderby: false, skip: false, top: false, skiptoken: false, inlinecount: false, select: false }; sqoMap[uriType.URI7B] = { expand: false, filter: true, format: true, orderby: true, skip: true, top: true, skiptoken: false, inlinecount: true, select: false }; sqoMap[uriType.URI8] = { expand: false, filter: false, format: true, orderby: false, skip: false, top: false, skiptoken: false, inlinecount: false, select: false }; sqoMap[uriType.URI9] = { expand: false, filter: false, format: false, orderby: false, skip: false, top: false, skiptoken: false, inlinecount: false, select: false }; sqoMap[uriType.URI15] = { expand: false, filter: true, format: false, orderby: true, skip: true, top: true, skiptoken: false, inlinecount: false, select: false }; sqoMap[uriType.URI16] = { expand: false, filter: true, format: false, orderby: false, skip: false, top: false, skiptoken: false, inlinecount: false, select: false }; sqoMap[uriType.URI17] = { expand: false, filter: true, format: true, orderby: true, skip: false, top: false, skiptoken: false, inlinecount: false, select: false }; sqoMap[uriType.UNKNOWN_URI] = { expand: false, filter: false, format: false, orderby: false, skip: false, top: false, skiptoken: false, inlinecount: false, select: false }; module.exports = function checkSystemQueryOptions(context, callback) { var sysQueryParams = context.oData.systemQueryParameters; var odataUriType = uriType.determineUriType(context); setUriType(context, odataUriType); context.logger.debug('check system query options', 'uri type identified: URI' + odataUriType); var containsSkipToken = Object.keys(sysQueryParams).some(function(sqo){ return sqo === 'skiptoken'; }); if (containsSkipToken){ context.logger.debug('check system query options', '$skiptoken violation found'); return callback(new Http501('$skiptoken not supported'), context); } var notAllowedSqos = Object.keys(sysQueryParams).some(function(sqo){ return !sqoMap[odataUriType][sqo]; }); if (notAllowedSqos){ context.logger.debug('check system query options', 'violation found'); var message = createErrorMessage(sqoMap[odataUriType]); return callback(new Http404(message), context); } return callback(null, context); function createErrorMessage(sqoMap){ var allowedSqos = Object.keys(sqoMap).filter(function(sqo){ return sqoMap[sqo]; }).map(function (sqo){ return '$' + sqo; }); if (allowedSqos.length === 0) { return "No system query options are allowed in the requested URI"; } if (allowedSqos.length === 1) { return "Only system query option '" + allowedSqos.join(', ') + "' is allowed in the requested URI"; } return "Only system query options '" + allowedSqos.join(', ') + "' are allowed in the requested URI"; } }; function setUriType(context, odataUriType) { if(context.uriTree) { context.uriTree.uriType = odataUriType; } }