@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
JavaScript
'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;
}
}