@sap/xsodata
Version:
Expose data from a HANA database as OData V2 service with help of .xsodata files.
106 lines (88 loc) • 4.17 kB
JavaScript
'use strict';
const oDataUriParser = require('../../lib/uri/oDataUriParser');
const DBSegment = require('../db/dbSegment');
exports.URI0 = 0; // scheme serviceRoot
exports.URI1 = 1; // scheme serviceRoot "/" entitySet
exports.URI2 = 2; // scheme serviceRoot "/" entitySet "(" keyPredicate ")"
exports.URI3 = 3; // scheme serviceRoot "/" entitySet "(" keyPredicate ")/" entityComplexProperty
exports.URI4 = 4; // scheme serviceRoot "/" entitySet "(" keyPredicate ")/" entityComplexProperty "/" entityProperty
exports.URI5A = 51; // scheme serviceRoot "/" entitySet "(" keyPredicate ")/" entityProperty
exports.URI5B = 52; // scheme serviceRoot "/" entitySet "(" keyPredicate ")/" entityProperty value
exports.URI6A = 61; // scheme serviceRoot "/" entitySet "(" keyPredicate ")/" entityNavProperty
exports.URI6B = 62; // scheme serviceRoot "/" entitySet "(" keyPredicate ")/" collectionNavProperty
exports.URI7A = 71; // scheme serviceRoot "/" entitySet "(" keyPredicate ")/$links/" entityNavProperty
exports.URI7B = 72; // scheme serviceRoot "/" entitySet "(" keyPredicate ")/$links/" collectionNavProperty
exports.URI8 = 8; // scheme serviceRoot "/$metadata"
exports.URI9 = 9; // scheme serviceRoot "/$batch"
exports.URI10 = 10; // scheme serviceRoot "/" serviceOperation-et
exports.URI11 = 11; // scheme serviceRoot "/" serviceOperation-collCt
exports.URI12 = 12; // scheme serviceRoot "/" serviceOperation-ct
exports.URI13 = 13; // scheme serviceRoot "/" serviceOperation-collPrim
exports.URI14 = 14; // scheme serviceRoot "/" serviceOperation-prim
exports.URI15 = 15; // scheme serviceRoot "/" entitySet count
exports.URI16 = 16; // scheme serviceRoot "/" entitySet "(" keyPredicate ")" count
exports.URI17 = 17; // scheme serviceRoot "/" entitySet "(" keyPredicate ")" value
exports.UNKNOWN_URI = -1; // "fallback" uri type, which is used when uri type cannot be determined
function isSegmentValid(segmentKind, isCount, isValue, isLinks) {
return (
(segmentKind === DBSegment.DBS_Entity ||
segmentKind === DBSegment.DBS_ResourceNavigation) &&
isCount &&
!isValue &&
!isLinks
);
}
function isDBSEntitySegmentValid(segmentKind, dbSegmentLast, isLinks) {
return (
segmentKind === DBSegment.DBS_Entity &&
!dbSegmentLast.singleProperty &&
!isLinks
);
}
/**
* Determines and returns the OData URI type based on the information from the specified context.
*
* @param {object} context - OData context, which represents the current request.
* @returns {number} OData URI type (e.g. URI1 having number value of 1).
*/
exports.determineUriType = function determineUriType(context) {
const uriKind = context.oData.kind;
let dbSegmentLast, isCollection, isCount, isValue, segmentKind, isLinks;
if (uriKind === oDataUriParser.URI_KIND_Service) {
return exports.URI0;
}
if (uriKind === oDataUriParser.URI_KIND_MetaData) {
return exports.URI8;
}
if (uriKind === oDataUriParser.URI_KIND_Batch) {
return exports.URI9;
}
dbSegmentLast = context.oData.dbSegmentLast;
isCollection = dbSegmentLast.isCollection;
isCount = dbSegmentLast.restriction.onlyCount;
isValue = dbSegmentLast.restriction.onlyValue;
isLinks = context.oData.dbSegment && context.oData.dbSegment.isLinks;
segmentKind = dbSegmentLast.kind;
if (isSegmentValid(segmentKind, isCount, isValue, isLinks)) {
return isCollection ? exports.URI15 : exports.URI16;
}
if (isCount) {
return exports.UNKNOWN_URI;
}
if (isDBSEntitySegmentValid(segmentKind, dbSegmentLast, isLinks)) {
if (isCollection) {
return exports.URI1;
}
return isValue ? exports.URI17 : exports.URI2;
}
if (dbSegmentLast.singleProperty && !isCollection && !isLinks) {
return isValue ? exports.URI5B : exports.URI5A;
}
if (segmentKind === DBSegment.DBS_ResourceNavigation) {
if (isLinks) {
return isCollection ? exports.URI7B : exports.URI7A;
}
return isCollection ? exports.URI6B : exports.URI6A;
}
return exports.UNKNOWN_URI;
};