@spartacus/core
Version:
Spartacus - the core framework
90 lines • 11.6 kB
JavaScript
import { Injectable } from '@angular/core';
import { mergeFields, parseFields } from '../utils/occ-fields';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common/http";
/**
* Helper service for optimizing endpoint calls to occ backend
*/
export class OccFieldsService {
constructor(http) {
this.http = http;
this.FIELDS_PARAM = 'fields';
}
/**
* Merge similar occ endpoints calls by merging fields parameter
*
* We assume that different scopes are defined by different fields parameters,
* so we are grouping all requests with the same urls (except fields definition)
* and merging into one request with fields that will satisfy all separate ones.
*
* @param models
*/
getOptimalUrlGroups(models) {
const groupedByUrls = {};
for (const model of models) {
const [urlPart, fields] = this.splitFields(model.url);
if (!groupedByUrls[urlPart]) {
groupedByUrls[urlPart] = {};
}
model.fields = fields ? parseFields(fields) : {};
groupedByUrls[urlPart][model.scopedData.scope] = model;
}
const mergedUrls = {};
for (const [url, group] of Object.entries(groupedByUrls)) {
const urlWithFields = this.getUrlWithFields(url, Object.values(group).map((lo) => lo.fields));
mergedUrls[urlWithFields] = group;
}
return mergedUrls;
}
/**
* Extract fields parameter from occ endpoint url
*
* @param urlWithFields
*/
splitFields(urlWithFields) {
const [url, params] = urlWithFields.split('?');
const paramsMap = {};
if (params) {
params.split('&').forEach((param) => {
const keyValue = param.split('=');
paramsMap[keyValue[0]] = keyValue[1];
});
}
const nonFieldsParams = Object.keys(paramsMap)
.sort()
.reduce((id, par) => {
if (par !== this.FIELDS_PARAM) {
id.push(paramsMap[par] ? `${par}=${paramsMap[par]}` : par);
}
return id;
}, []);
const nonFields = nonFieldsParams.join('&');
return [
nonFields ? `${url}?${nonFields}` : url,
paramsMap[this.FIELDS_PARAM],
];
}
/**
* Combine url with field parameters
*
* @param url
* @param fields
*/
getUrlWithFields(url, fields) {
const mergedFields = mergeFields(fields);
if (mergedFields) {
url += url.includes('?') ? '&' : '?';
url += `${this.FIELDS_PARAM}=${mergedFields}`;
}
return url;
}
}
OccFieldsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: OccFieldsService, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
OccFieldsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: OccFieldsService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: OccFieldsService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: function () { return [{ type: i1.HttpClient }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2NjLWZpZWxkcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvb2NjL3NlcnZpY2VzL29jYy1maWVsZHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7OztBQStCL0Q7O0dBRUc7QUFJSCxNQUFNLE9BQU8sZ0JBQWdCO0lBQzNCLFlBQXNCLElBQWdCO1FBQWhCLFNBQUksR0FBSixJQUFJLENBQVk7UUFFNUIsaUJBQVksR0FBRyxRQUFRLENBQUM7SUFGTyxDQUFDO0lBSTFDOzs7Ozs7OztPQVFHO0lBQ0gsbUJBQW1CLENBQUMsTUFBMkI7UUFDN0MsTUFBTSxhQUFhLEdBQTBCLEVBQUUsQ0FBQztRQUNoRCxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQTBCLEVBQUU7WUFDOUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN0RCxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUMzQixhQUFhLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO2FBQzdCO1lBQ0QsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2pELGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQztTQUN4RDtRQUVELE1BQU0sVUFBVSxHQUEwQixFQUFFLENBQUM7UUFDN0MsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUU7WUFDeEQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUN6QyxHQUFHLEVBQ0gsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FDNUMsQ0FBQztZQUNGLFVBQVUsQ0FBQyxhQUFhLENBQUMsR0FBRyxLQUFLLENBQUM7U0FDbkM7UUFFRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLFdBQVcsQ0FBQyxhQUFxQjtRQUN2QyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFL0MsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBRXJCLElBQUksTUFBTSxFQUFFO1lBQ1YsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDbEMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbEMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2QyxDQUFDLENBQUMsQ0FBQztTQUNKO1FBRUQsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7YUFDM0MsSUFBSSxFQUFFO2FBQ04sTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQ2xCLElBQUksR0FBRyxLQUFLLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQzdCLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDNUQ7WUFDRCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVULE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFNUMsT0FBTztZQUNMLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUc7WUFDdkMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7U0FDN0IsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLGdCQUFnQixDQUFDLEdBQVcsRUFBRSxNQUEyQjtRQUMvRCxNQUFNLFlBQVksR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFekMsSUFBSSxZQUFZLEVBQUU7WUFDaEIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQ3JDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLElBQUksWUFBWSxFQUFFLENBQUM7U0FDL0M7UUFFRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7OzZHQXRGVSxnQkFBZ0I7aUhBQWhCLGdCQUFnQixjQUZmLE1BQU07MkZBRVAsZ0JBQWdCO2tCQUg1QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IG1lcmdlRmllbGRzLCBwYXJzZUZpZWxkcyB9IGZyb20gJy4uL3V0aWxzL29jYy1maWVsZHMnO1xuaW1wb3J0IHsgU2NvcGVkRGF0YSB9IGZyb20gJy4uLy4uL21vZGVsL3Njb3BlZC1kYXRhJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NvcGVkRGF0YVdpdGhVcmwge1xuICAvKiogVXJsICh3aXRoIGZpZWxkcykgdG8gbG9hZCBzY29wZWQgZGF0YSAqL1xuICB1cmw/OiBzdHJpbmc7XG4gIC8qKiBzY29wZWQgZGF0YSBtb2RlbCAqL1xuICBzY29wZWREYXRhOiBTY29wZWREYXRhPGFueT47XG59XG5cbi8qKlxuICogSW50ZXJtZWRpYXRlIG1vZGVsIHRvIGFjY29tbW9kYXRlIGFsbCBkYXRhIG5lZWRlZCB0byBwZXJmb3JtIG9jYyBmaWVsZHMgb3B0aW1pemF0aW9uc1xuICogd3JhcHBpbmcgU2NvcGVkRGF0YSB3aXRoIHVybCBhbmQgZmllbGRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2NjRmllbGRzTW9kZWwgZXh0ZW5kcyBTY29wZWREYXRhV2l0aFVybCB7XG4gIC8qKiBleHRyYWN0ZWQgZmllbGRzIG9iamVjdCwgdXNlZCB0byBleHRyYWN0IGRhdGEgZnJvbSBicm9hZGVyIG1vZGVsICovXG4gIGZpZWxkcz86IG9iamVjdDtcbn1cblxuLyoqXG4gKiBHcm91cGVkIHJlc3QgY2FsbHMgd2l0aCBvcHRpbWFsIHVybHNcbiAqXG4gKiBPbmUgdXJsIGdyb3VwcyBhbGwgc2NvcGVzIGl0IGNvdmVycyB3aXRoIHJlbGF0ZWQgb2NjRmllbGRzTW9kZWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2NjT3B0aW1pbWFsVXJsR3JvdXBzIHtcbiAgW29wdGltYWxVcmw6IHN0cmluZ106IHtcbiAgICBbc2NvcGU6IHN0cmluZ106IE9jY0ZpZWxkc01vZGVsO1xuICB9O1xufVxuXG4vKipcbiAqIEhlbHBlciBzZXJ2aWNlIGZvciBvcHRpbWl6aW5nIGVuZHBvaW50IGNhbGxzIHRvIG9jYyBiYWNrZW5kXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBPY2NGaWVsZHNTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGh0dHA6IEh0dHBDbGllbnQpIHt9XG5cbiAgcHJvdGVjdGVkIEZJRUxEU19QQVJBTSA9ICdmaWVsZHMnO1xuXG4gIC8qKlxuICAgKiBNZXJnZSBzaW1pbGFyIG9jYyBlbmRwb2ludHMgY2FsbHMgYnkgbWVyZ2luZyBmaWVsZHMgcGFyYW1ldGVyXG4gICAqXG4gICAqIFdlIGFzc3VtZSB0aGF0IGRpZmZlcmVudCBzY29wZXMgYXJlIGRlZmluZWQgYnkgZGlmZmVyZW50IGZpZWxkcyBwYXJhbWV0ZXJzLFxuICAgKiBzbyB3ZSBhcmUgZ3JvdXBpbmcgYWxsIHJlcXVlc3RzIHdpdGggdGhlIHNhbWUgdXJscyAoZXhjZXB0IGZpZWxkcyBkZWZpbml0aW9uKVxuICAgKiBhbmQgbWVyZ2luZyBpbnRvIG9uZSByZXF1ZXN0IHdpdGggZmllbGRzIHRoYXQgd2lsbCBzYXRpc2Z5IGFsbCBzZXBhcmF0ZSBvbmVzLlxuICAgKlxuICAgKiBAcGFyYW0gbW9kZWxzXG4gICAqL1xuICBnZXRPcHRpbWFsVXJsR3JvdXBzKG1vZGVsczogU2NvcGVkRGF0YVdpdGhVcmxbXSk6IE9jY09wdGltaW1hbFVybEdyb3VwcyB7XG4gICAgY29uc3QgZ3JvdXBlZEJ5VXJsczogT2NjT3B0aW1pbWFsVXJsR3JvdXBzID0ge307XG4gICAgZm9yIChjb25zdCBtb2RlbCBvZiBtb2RlbHMgYXMgT2NjRmllbGRzTW9kZWxbXSkge1xuICAgICAgY29uc3QgW3VybFBhcnQsIGZpZWxkc10gPSB0aGlzLnNwbGl0RmllbGRzKG1vZGVsLnVybCk7XG4gICAgICBpZiAoIWdyb3VwZWRCeVVybHNbdXJsUGFydF0pIHtcbiAgICAgICAgZ3JvdXBlZEJ5VXJsc1t1cmxQYXJ0XSA9IHt9O1xuICAgICAgfVxuICAgICAgbW9kZWwuZmllbGRzID0gZmllbGRzID8gcGFyc2VGaWVsZHMoZmllbGRzKSA6IHt9O1xuICAgICAgZ3JvdXBlZEJ5VXJsc1t1cmxQYXJ0XVttb2RlbC5zY29wZWREYXRhLnNjb3BlXSA9IG1vZGVsO1xuICAgIH1cblxuICAgIGNvbnN0IG1lcmdlZFVybHM6IE9jY09wdGltaW1hbFVybEdyb3VwcyA9IHt9O1xuICAgIGZvciAoY29uc3QgW3VybCwgZ3JvdXBdIG9mIE9iamVjdC5lbnRyaWVzKGdyb3VwZWRCeVVybHMpKSB7XG4gICAgICBjb25zdCB1cmxXaXRoRmllbGRzID0gdGhpcy5nZXRVcmxXaXRoRmllbGRzKFxuICAgICAgICB1cmwsXG4gICAgICAgIE9iamVjdC52YWx1ZXMoZ3JvdXApLm1hcCgobG8pID0+IGxvLmZpZWxkcylcbiAgICAgICk7XG4gICAgICBtZXJnZWRVcmxzW3VybFdpdGhGaWVsZHNdID0gZ3JvdXA7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lcmdlZFVybHM7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCBmaWVsZHMgcGFyYW1ldGVyIGZyb20gb2NjIGVuZHBvaW50IHVybFxuICAgKlxuICAgKiBAcGFyYW0gdXJsV2l0aEZpZWxkc1xuICAgKi9cbiAgcHJpdmF0ZSBzcGxpdEZpZWxkcyh1cmxXaXRoRmllbGRzOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgICBjb25zdCBbdXJsLCBwYXJhbXNdID0gdXJsV2l0aEZpZWxkcy5zcGxpdCgnPycpO1xuXG4gICAgY29uc3QgcGFyYW1zTWFwID0ge307XG5cbiAgICBpZiAocGFyYW1zKSB7XG4gICAgICBwYXJhbXMuc3BsaXQoJyYnKS5mb3JFYWNoKChwYXJhbSkgPT4ge1xuICAgICAgICBjb25zdCBrZXlWYWx1ZSA9IHBhcmFtLnNwbGl0KCc9Jyk7XG4gICAgICAgIHBhcmFtc01hcFtrZXlWYWx1ZVswXV0gPSBrZXlWYWx1ZVsxXTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IG5vbkZpZWxkc1BhcmFtcyA9IE9iamVjdC5rZXlzKHBhcmFtc01hcClcbiAgICAgIC5zb3J0KClcbiAgICAgIC5yZWR1Y2UoKGlkLCBwYXIpID0+IHtcbiAgICAgICAgaWYgKHBhciAhPT0gdGhpcy5GSUVMRFNfUEFSQU0pIHtcbiAgICAgICAgICBpZC5wdXNoKHBhcmFtc01hcFtwYXJdID8gYCR7cGFyfT0ke3BhcmFtc01hcFtwYXJdfWAgOiBwYXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpZDtcbiAgICAgIH0sIFtdKTtcblxuICAgIGNvbnN0IG5vbkZpZWxkcyA9IG5vbkZpZWxkc1BhcmFtcy5qb2luKCcmJyk7XG5cbiAgICByZXR1cm4gW1xuICAgICAgbm9uRmllbGRzID8gYCR7dXJsfT8ke25vbkZpZWxkc31gIDogdXJsLFxuICAgICAgcGFyYW1zTWFwW3RoaXMuRklFTERTX1BBUkFNXSxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbWJpbmUgdXJsIHdpdGggZmllbGQgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBAcGFyYW0gdXJsXG4gICAqIEBwYXJhbSBmaWVsZHNcbiAgICovXG4gIHByaXZhdGUgZ2V0VXJsV2l0aEZpZWxkcyh1cmw6IHN0cmluZywgZmllbGRzOiAoc3RyaW5nIHwgb2JqZWN0KVtdKTogc3RyaW5nIHtcbiAgICBjb25zdCBtZXJnZWRGaWVsZHMgPSBtZXJnZUZpZWxkcyhmaWVsZHMpO1xuXG4gICAgaWYgKG1lcmdlZEZpZWxkcykge1xuICAgICAgdXJsICs9IHVybC5pbmNsdWRlcygnPycpID8gJyYnIDogJz8nO1xuICAgICAgdXJsICs9IGAke3RoaXMuRklFTERTX1BBUkFNfT0ke21lcmdlZEZpZWxkc31gO1xuICAgIH1cblxuICAgIHJldHVybiB1cmw7XG4gIH1cbn1cbiJdfQ==