UNPKG

@sap/xsodata

Version:

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

255 lines (227 loc) 5.27 kB
'use strict'; const Http404 = require('../../utils/errors/http/badRequest'); const Http501 = require('../../utils/errors/http/notImplemented'); const uriType = require('../uriType'); const 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) { const sysQueryParams = context.oData.systemQueryParameters; const odataUriType = uriType.determineUriType(context); setUriType(context, odataUriType); context.logger.debug( 'check system query options', 'uri type identified: URI' + odataUriType ); const 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); } const notAllowedSqos = Object.keys(sysQueryParams).some(function (sqo) { return !sqoMap[odataUriType][sqo]; }); if (notAllowedSqos) { context.logger.debug('check system query options', 'violation found'); const message = createErrorMessage(sqoMap[odataUriType]); return callback(new Http404(message), context); } return callback(null, context); function createErrorMessage(sqoMap) { const 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; } }