breeze2-odata4
Version:
Library to allow OData 4 support for breezejs 2
194 lines • 8.33 kB
JavaScript
;
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