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