UNPKG

breeze2-odata4

Version:

Library to allow OData 4 support for breezejs 2

194 lines 8.33 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var breeze_client_1 = require("breeze-client"); var breeze_odata4_predicateVisitor_1 = require("./breeze-odata4-predicateVisitor"); var OData4UriBuilder = (function () { function OData4UriBuilder() { this.name = 'OData4'; } OData4UriBuilder.register = function () { breeze_client_1.config.registerAdapter('uriBuilder', OData4UriBuilder); }; OData4UriBuilder.prototype.initialize = function () { breeze_odata4_predicateVisitor_1.OData4PredicateVisitor.register(); }; OData4UriBuilder.prototype.buildUri = function (entityQuery, metadataStore) { var queryOptions = { expand: [] }; var entityType = entityQuery._getFromEntityType(metadataStore, false); if (!entityType) { entityType = new breeze_client_1.EntityType(metadataStore); } if (entityQuery.inlineCountEnabled) { queryOptions.count = true; } if (entityQuery.skipCount) { queryOptions.skip = entityQuery.skipCount; } if (entityQuery.takeCount != null) { queryOptions.top = entityQuery.takeCount; } this.addExpandOption(entityType, queryOptions, entityQuery.expandClause); this.addSelectOption(entityType, queryOptions, entityQuery.selectClause); queryOptions.filter = this.toWhereODataFragment(entityType, entityQuery.wherePredicate); queryOptions.orderby = this.toOrderByODataFragment(entityType, entityQuery.orderByClause); var qoText = this.toQueryOptionsString(queryOptions); entityQuery.resourceName = this.getResource(entityQuery); return entityQuery.resourceName + qoText; }; OData4UriBuilder.prototype.getResource = function (entityQuery) { var resource = entityQuery.resourceName; if (!breeze_client_1.core.isEmpty(entityQuery.parameters)) { resource = this.formatString(resource, entityQuery.parameters); } return resource; }; OData4UriBuilder.prototype.getQueryOptions = function (rootOptions, propertyPath) { var path = [].concat(propertyPath); var rootProperty = path.shift().nameOnServer; if (!path.length) { return rootOptions; } var nextExpand = rootOptions.expand.find(function (e) { return e.name === rootProperty; }); if (!nextExpand) { nextExpand = { name: rootProperty, expand: [] }; rootOptions.expand.push(nextExpand); } return this.getQueryOptions(nextExpand, path); }; OData4UriBuilder.prototype.addExpandOption = function (entityType, queryOptions, expandClause) { var _this = this; if (!expandClause) { return; } expandClause.propertyPaths.forEach(function (pp) { var entityTypeWithoutHidden = entityType; var props = entityTypeWithoutHidden.getPropertiesOnPath(pp, false, true); var workingOptions = _this.getQueryOptions(queryOptions, props); var expandOptions = { name: props.pop().nameOnServer, expand: [] }; workingOptions.expand.push(expandOptions); }); }; OData4UriBuilder.prototype.addSelectOption = function (entityType, queryOptions, selectClause) { var _this = this; var result = []; if (!selectClause) { return; } selectClause.validate(entityType); selectClause.propertyPaths.forEach(function (pp) { var entityTypeWithoutHidden = entityType; var props = entityTypeWithoutHidden.getPropertiesOnPath(pp, false, true); var workingOptions = _this.getQueryOptions(queryOptions, props); workingOptions.select = workingOptions.select || []; workingOptions.select.push(props.pop().nameOnServer); }); }; OData4UriBuilder.prototype.toWhereODataFragment = function (entityType, wherePredicate) { if (!wherePredicate) { return undefined; } var wherePredicateExtended = wherePredicate; return wherePredicateExtended.toODataFragment({ entityType: entityType }); }; OData4UriBuilder.prototype.toOrderByODataFragment = function (entityType, orderByClause) { if (!orderByClause) { return undefined; } orderByClause.validate(entityType); var orderByClauseWithItems = orderByClause; var orderBy = orderByClauseWithItems.items.map(function (item) { var propertyPath = entityType.clientPropertyPathToServer(item.propertyPath, '/'); var direction = item.isDesc ? ' desc' : ''; return propertyPath + direction; }); return orderBy.toString(); }; OData4UriBuilder.prototype.toQueryOptionsString = function (queryOptions) { var qoStrings = []; var _loop_1 = function (qoName) { var qoValue = queryOptions[qoName]; if (qoValue !== undefined) { if (qoName === 'expand') { qoStrings.push(this_1.getExpandString(qoValue)); } else if (qoName === 'select') { qoStrings.push(this_1.getSelectString(qoValue)); } else if (qoValue instanceof Array) { qoValue.forEach(function (qov) { qoStrings.push("$" + qoName + "=" + encodeURIComponent(qov)); }); } else { qoStrings.push("$" + qoName + "=" + encodeURIComponent(qoValue)); } } }; var this_1 = this; for (var _i = 0, _a = Object.getOwnPropertyNames(queryOptions); _i < _a.length; _i++) { var qoName = _a[_i]; _loop_1(qoName); } qoStrings = qoStrings.filter(function (s) { return !!s; }); if (qoStrings.length > 0) { return '?' + qoStrings.join('&'); } else { return ''; } }; OData4UriBuilder.prototype.getSelectString = function (select) { var key = '$select'; if (!(select && select.length)) { return null; } return key + "=" + select; }; OData4UriBuilder.prototype.getFilterString = function (filter) { var key = '$filter'; if (!filter) { return null; } return key + "=" + encodeURIComponent(filter); }; OData4UriBuilder.prototype.getExpandString = function (options) { var _this = this; var key = '$expand'; var expandStrings = options.map(function (option) { var subOptions = [ _this.getFilterString(option.filter), _this.getSelectString(option.select), _this.getExpandString(option.expand) ].filter(function (s) { return !!s; }); if (!subOptions.length) { return option.name; } return option.name + "(" + subOptions.join(';') + ")"; }); var result = expandStrings.length ? key + "=" + expandStrings : null; return result; }; OData4UriBuilder.prototype.formatString = function (format, params) { var props = Object.keys(params); var args = props.map(function (prop) { return ({ key: prop, value: params[prop] }); }); var result = args.reduce(function (formattedString, arg, index) { var key = arg.key; var value = arg.value; if (value == null) { value = ''; } var reg = new RegExp("\\{" + key + "\\}", 'gm'); var newString = formattedString.replace(reg, value); if (newString !== formattedString) { delete params[key]; } return newString; }, format); return result; }; return OData4UriBuilder; }()); exports.OData4UriBuilder = OData4UriBuilder; //# sourceMappingURL=breeze-odata4-uriBuilder.js.map