UNPKG

breeze-client

Version:

Breeze data management for JavaScript clients

100 lines 16.8 kB
import * as breeze from 'breeze-client'; // import { JsonResultsAdapter, KeyMapping } from './breeze'; /** @hidden */ export class DataServiceWebApiAdapter extends breeze.AbstractDataServiceAdapter { constructor() { super(); this.name = "webApi"; } static register(config) { config = config || breeze.config; config.registerAdapter("dataService", DataServiceWebApiAdapter); return config.initializeAdapterInstance("dataService", "webApi", true); } /** @hidden @internal */ _prepareSaveBundle(saveContext, saveBundle) { let changeRequestInterceptor = this._createChangeRequestInterceptor(saveContext, saveBundle); let em = saveContext.entityManager; let metadataStore = em.metadataStore; let helper = em.helper; let serSaveBundle = {}; serSaveBundle.entities = saveBundle.entities.map(function (e, ix) { let rawEntity = helper.unwrapInstance(e, transformValue); let autoGeneratedKey; if (e.entityType.autoGeneratedKeyType !== breeze.AutoGeneratedKeyType.None) { autoGeneratedKey = { propertyName: e.entityType.keyProperties[0].nameOnServer, autoGeneratedKeyType: e.entityType.autoGeneratedKeyType.name }; } let originalValuesOnServer = helper.unwrapOriginalValues(e, metadataStore); rawEntity.entityAspect = { entityTypeName: e.entityType.name, defaultResourceName: e.entityType.defaultResourceName, entityState: e.entityAspect.entityState.name, originalValuesMap: originalValuesOnServer, autoGeneratedKey: autoGeneratedKey }; rawEntity = changeRequestInterceptor.getRequest(rawEntity, e, ix); return rawEntity; }); serSaveBundle.saveOptions = { tag: saveBundle.saveOptions.tag }; changeRequestInterceptor.done(serSaveBundle.entities); return serSaveBundle; } /** @hidden @internal */ _prepareSaveResult(saveContext, data) { // use the jsonResultAdapter to extractResults and extractKeyMappings let jra = saveContext.dataService.jsonResultsAdapter || this.jsonResultsAdapter; let entities = jra.extractSaveResults(data) || []; let keyMappings = jra.extractKeyMappings(data) || []; let deletedKeys = jra.extractDeletedKeys ? (jra.extractDeletedKeys(data)) || [] : []; if (keyMappings.length) { // HACK: need to change the 'case' of properties in the saveResult // but KeyMapping properties internally are still ucase. ugh... keyMappings = keyMappings.map(function (km) { if (km.entityTypeName) return km; // it's already lower case let kmHack = km; let entityTypeName = breeze.MetadataStore.normalizeTypeName(kmHack.EntityTypeName); return { entityTypeName: entityTypeName, tempValue: kmHack.TempValue, realValue: kmHack.RealValue }; }); } if (deletedKeys.length) { deletedKeys = deletedKeys.map(function (dk) { if (dk.entityTypeName) return dk; // it's already lower case let entityTypeName = breeze.MetadataStore.normalizeTypeName(dk.EntityTypeName); // NOTE the dk.KeyValue => keyValues transition - needed because we are deserializing an .NET EntityKey return { entityTypeName: entityTypeName, keyValues: dk.KeyValue }; }); } return { entities: entities, keyMappings: keyMappings, deletedKeys: deletedKeys }; } jsonResultsAdapter = new breeze.JsonResultsAdapter({ name: "webApi_default", visitNode: function (node, mappingContext, nodeContext) { if (node == null) return {}; let entityTypeName = breeze.MetadataStore.normalizeTypeName(node.$type); let entityType = entityTypeName && mappingContext.entityManager.metadataStore.getEntityType(entityTypeName, true); let propertyName = nodeContext.propertyName; let ignore = propertyName && propertyName.substr(0, 1) === "$"; return { entityType: entityType, nodeId: node.$id, nodeRefId: node.$ref, ignore: ignore }; } }); } /** Transform data properties while unwrapping entities before save */ function transformValue(prop, val) { if (prop.dataType === breeze.DataType.DateOnly) { val = breeze.DataType.toDateOnlyString(val); } return val; } breeze.config.registerAdapter("dataService", DataServiceWebApiAdapter); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRhcHRlci1kYXRhLXNlcnZpY2Utd2ViYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FkYXB0ZXItZGF0YS1zZXJ2aWNlLXdlYmFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssTUFBTSxNQUFNLGVBQWUsQ0FBQztBQUN4Qyw2REFBNkQ7QUFFN0QsY0FBYztBQUNkLE1BQU0sT0FBTyx3QkFBeUIsU0FBUSxNQUFNLENBQUMsMEJBQTBCO0lBRTdFO1FBQ0UsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUE0QjtRQUMxQyxNQUFNLEdBQUcsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDakMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztRQUNoRSxPQUFPLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxhQUFhLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBNkIsQ0FBQztJQUNyRyxDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLGtCQUFrQixDQUFDLFdBQStCLEVBQUUsVUFBNkI7UUFDL0UsSUFBSSx3QkFBd0IsR0FBRyxJQUFJLENBQUMsK0JBQStCLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzdGLElBQUksRUFBRSxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUM7UUFDbkMsSUFBSSxhQUFhLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQztRQUNyQyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ3ZCLElBQUksYUFBYSxHQUFRLEVBQUUsQ0FBQztRQUM1QixhQUFhLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUU7WUFDOUQsSUFBSSxTQUFTLEdB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S0FFRixDQUFDLENBQUM7Q0FFSjtBQUVELHNFQUFzRTtBQUN0RSxTQUFTLGNBQWMsQ0FBQyxJQUF5QixFQUFFLEdBQVE7SUFDekQsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFO1FBQzlDLEdBQUcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQzdDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBR0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLHdCQUF3QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBicmVlemUgZnJvbSAnYnJlZXplLWNsaWVudCc7XHJcbi8vIGltcG9ydCB7IEpzb25SZXN1bHRzQWRhcHRlciwgS2V5TWFwcGluZyB9IGZyb20gJy4vYnJlZXplJztcclxuXHJcbi8qKiBAaGlkZGVuICovXHJcbmV4cG9ydCBjbGFzcyBEYXRhU2VydmljZVdlYkFwaUFkYXB0ZXIgZXh0ZW5kcyBicmVlemUuQWJzdHJhY3REYXRhU2VydmljZUFkYXB0ZXIge1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICB0aGlzLm5hbWUgPSBcIndlYkFwaVwiO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIHJlZ2lzdGVyKGNvbmZpZz86IGJyZWV6ZS5CcmVlemVDb25maWcpIHtcclxuICAgIGNvbmZpZyA9IGNvbmZpZyB8fCBicmVlemUuY29uZmlnO1xyXG4gICAgY29uZmlnLnJlZ2lzdGVyQWRhcHRlcihcImRhdGFTZXJ2aWNlXCIsIERhdGFTZXJ2aWNlV2ViQXBpQWRhcHRlcik7XHJcbiAgICByZXR1cm4gY29uZmlnLmluaXRpYWxpemVBZGFwdGVySW5zdGFuY2UoXCJkYXRhU2VydmljZVwiLCBcIndlYkFwaVwiLCB0cnVlKSBhcyBEYXRhU2VydmljZVdlYkFwaUFkYXB0ZXI7XHJcbiAgfVxyXG5cclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBfcHJlcGFyZVNhdmVCdW5kbGUoc2F2ZUNvbnRleHQ6IGJyZWV6ZS5TYXZlQ29udGV4dCwgc2F2ZUJ1bmRsZTogYnJlZXplLlNhdmVCdW5kbGUpIHtcclxuICAgIGxldCBjaGFuZ2VSZXF1ZXN0SW50ZXJjZXB0b3IgPSB0aGlzLl9jcmVhdGVDaGFuZ2VSZXF1ZXN0SW50ZXJjZXB0b3Ioc2F2ZUNvbnRleHQsIHNhdmVCdW5kbGUpO1xyXG4gICAgbGV0IGVtID0gc2F2ZUNvbnRleHQuZW50aXR5TWFuYWdlcjtcclxuICAgIGxldCBtZXRhZGF0YVN0b3JlID0gZW0ubWV0YWRhdGFTdG9yZTtcclxuICAgIGxldCBoZWxwZXIgPSBlbS5oZWxwZXI7XHJcbiAgICBsZXQgc2VyU2F2ZUJ1bmRsZTogYW55ID0ge307XHJcbiAgICBzZXJTYXZlQnVuZGxlLmVudGl0aWVzID0gc2F2ZUJ1bmRsZS5lbnRpdGllcy5tYXAoZnVuY3Rpb24gKGUsIGl4KSB7XHJcbiAgICAgIGxldCByYXdFbnRpdHkgPSBoZWxwZXIudW53cmFwSW5zdGFuY2UoZSwgdHJhbnNmb3JtVmFsdWUpO1xyXG5cclxuICAgICAgbGV0IGF1dG9HZW5lcmF0ZWRLZXk6IE9iamVjdCB8IHVuZGVmaW5lZDtcclxuICAgICAgaWYgKGUuZW50aXR5VHlwZS5hdXRvR2VuZXJhdGVkS2V5VHlwZSAhPT0gYnJlZXplLkF1dG9HZW5lcmF0ZWRLZXlUeXBlLk5vbmUpIHtcclxuICAgICAgICBhdXRvR2VuZXJhdGVkS2V5ID0ge1xyXG4gICAgICAgICAgcHJvcGVydHlOYW1lOiBlLmVudGl0eVR5cGUua2V5UHJvcGVydGllc1swXS5uYW1lT25TZXJ2ZXIsXHJcbiAgICAgICAgICBhdXRvR2VuZXJhdGVkS2V5VHlwZTogZS5lbnRpdHlUeXBlLmF1dG9HZW5lcmF0ZWRLZXlUeXBlLm5hbWVcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgb3JpZ2luYWxWYWx1ZXNPblNlcnZlciA9IGhlbHBlci51bndyYXBPcmlnaW5hbFZhbHVlcyhlLCBtZXRhZGF0YVN0b3JlKTtcclxuICAgICAgcmF3RW50aXR5LmVudGl0eUFzcGVjdCA9IHtcclxuICAgICAgICBlbnRpdHlUeXBlTmFtZTogZS5lbnRpdHlUeXBlLm5hbWUsXHJcbiAgICAgICAgZGVmYXVsdFJlc291cmNlTmFtZTogZS5lbnRpdHlUeXBlLmRlZmF1bHRSZXNvdXJjZU5hbWUsXHJcbiAgICAgICAgZW50aXR5U3RhdGU6IGUuZW50aXR5QXNwZWN0LmVudGl0eVN0YXRlLm5hbWUsXHJcbiAgICAgICAgb3JpZ2luYWxWYWx1ZXNNYXA6IG9yaWdpbmFsVmFsdWVzT25TZXJ2ZXIsXHJcbiAgICAgICAgYXV0b0dlbmVyYXRlZEtleTogYXV0b0dlbmVyYXRlZEtleVxyXG4gICAgICB9O1xyXG4gICAgICByYXdFbnRpdHkgPSBjaGFuZ2VSZXF1ZXN0SW50ZXJjZXB0b3IuZ2V0UmVxdWVzdChyYXdFbnRpdHksIGUsIGl4KTtcclxuICAgICAgcmV0dXJuIHJhd0VudGl0eTtcclxuICAgIH0pO1xyXG5cclxuICAgIHNlclNhdmVCdW5kbGUuc2F2ZU9wdGlvbnMgPSB7IHRhZzogc2F2ZUJ1bmRsZS5zYXZlT3B0aW9ucy50YWcgfTtcclxuICAgIGNoYW5nZVJlcXVlc3RJbnRlcmNlcHRvci5kb25lKHNlclNhdmVCdW5kbGUuZW50aXRpZXMpO1xyXG4gICAgcmV0dXJuIHNlclNhdmVCdW5kbGU7XHJcbiAgfVxyXG5cclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBfcHJlcGFyZVNhdmVSZXN1bHQoc2F2ZUNvbnRleHQ6IGJyZWV6ZS5TYXZlQ29udGV4dCwgZGF0YTogYW55KSB7XHJcbiAgICAvLyB1c2UgdGhlIGpzb25SZXN1bHRBZGFwdGVyIHRvIGV4dHJhY3RSZXN1bHRzIGFuZCBleHRyYWN0S2V5TWFwcGluZ3NcclxuICAgIGxldCBqcmEgPSBzYXZlQ29udGV4dC5kYXRhU2VydmljZS5qc29uUmVzdWx0c0FkYXB0ZXIgfHwgdGhpcy5qc29uUmVzdWx0c0FkYXB0ZXI7XHJcbiAgICBsZXQgZW50aXRpZXMgPSBqcmEuZXh0cmFjdFNhdmVSZXN1bHRzKGRhdGEpIHx8IFtdO1xyXG4gICAgbGV0IGtleU1hcHBpbmdzOiBicmVlemUuS2V5TWFwcGluZ1tdID0ganJhLmV4dHJhY3RLZXlNYXBwaW5ncyhkYXRhKSB8fCBbXTtcclxuICAgIGxldCBkZWxldGVkS2V5cyA9IGpyYS5leHRyYWN0RGVsZXRlZEtleXMgPyAoanJhLmV4dHJhY3REZWxldGVkS2V5cyhkYXRhKSkgfHwgW10gOiBbXTtcclxuXHJcbiAgICBpZiAoa2V5TWFwcGluZ3MubGVuZ3RoKSB7XHJcbiAgICAgIC8vIEhBQ0s6IG5lZWQgdG8gY2hhbmdlIHRoZSAnY2FzZScgb2YgcHJvcGVydGllcyBpbiB0aGUgc2F2ZVJlc3VsdFxyXG4gICAgICAvLyBidXQgS2V5TWFwcGluZyBwcm9wZXJ0aWVzIGludGVybmFsbHkgYXJlIHN0aWxsIHVjYXNlLiB1Z2guLi5cclxuICAgICAga2V5TWFwcGluZ3MgPSBrZXlNYXBwaW5ncy5tYXAoZnVuY3Rpb24gKGttKSB7XHJcbiAgICAgICAgaWYgKGttLmVudGl0eVR5cGVOYW1lKSByZXR1cm4ga207IC8vIGl0J3MgYWxyZWFkeSBsb3dlciBjYXNlXHJcbiAgICAgICAgbGV0IGttSGFjayA9IGttIGFzIGFueTtcclxuICAgICAgICBsZXQgZW50aXR5VHlwZU5hbWUgPSBicmVlemUuTWV0YWRhdGFTdG9yZS5ub3JtYWxpemVUeXBlTmFtZShrbUhhY2suRW50aXR5VHlwZU5hbWUpO1xyXG4gICAgICAgIHJldHVybiB7IGVudGl0eVR5cGVOYW1lOiBlbnRpdHlUeXBlTmFtZSwgdGVtcFZhbHVlOiBrbUhhY2suVGVtcFZhbHVlLCByZWFsVmFsdWU6IGttSGFjay5SZWFsVmFsdWUgfTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGRlbGV0ZWRLZXlzLmxlbmd0aCkge1xyXG4gICAgICBkZWxldGVkS2V5cyA9IGRlbGV0ZWRLZXlzLm1hcChmdW5jdGlvbiAoZGspIHtcclxuICAgICAgICBpZiAoZGsuZW50aXR5VHlwZU5hbWUpIHJldHVybiBkazsgLy8gaXQncyBhbHJlYWR5IGxvd2VyIGNhc2VcclxuICAgICAgICBsZXQgZW50aXR5VHlwZU5hbWUgPSBicmVlemUuTWV0YWRhdGFTdG9yZS5ub3JtYWxpemVUeXBlTmFtZShkay5FbnRpdHlUeXBlTmFtZSk7XHJcbiAgICAgICAgLy8gTk9URSB0aGUgZGsuS2V5VmFsdWUgPT4ga2V5VmFsdWVzIHRyYW5zaXRpb24gLSBuZWVkZWQgYmVjYXVzZSB3ZSBhcmUgZGVzZXJpYWxpemluZyBhbiAuTkVUIEVudGl0eUtleVxyXG4gICAgICAgIHJldHVybiB7IGVudGl0eVR5cGVOYW1lOiBlbnRpdHlUeXBlTmFtZSwga2V5VmFsdWVzOiBkay5LZXlWYWx1ZSB9O1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geyBlbnRpdGllczogZW50aXRpZXMsIGtleU1hcHBpbmdzOiBrZXlNYXBwaW5ncywgZGVsZXRlZEtleXM6IGRlbGV0ZWRLZXlzIH07XHJcblxyXG4gIH1cclxuXHJcbiAganNvblJlc3VsdHNBZGFwdGVyOiBicmVlemUuSnNvblJlc3VsdHNBZGFwdGVyID0gbmV3IGJyZWV6ZS5Kc29uUmVzdWx0c0FkYXB0ZXIoe1xyXG5cclxuICAgIG5hbWU6IFwid2ViQXBpX2RlZmF1bHRcIixcclxuXHJcbiAgICB2aXNpdE5vZGU6IGZ1bmN0aW9uIChub2RlOiBhbnksIG1hcHBpbmdDb250ZXh0OiBicmVlemUuTWFwcGluZ0NvbnRleHQsIG5vZGVDb250ZXh0OiBicmVlemUuTm9kZUNvbnRleHQpIHtcclxuICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgcmV0dXJuIHt9O1xyXG4gICAgICBsZXQgZW50aXR5VHlwZU5hbWUgPSBicmVlemUuTWV0YWRhdGFTdG9yZS5ub3JtYWxpemVUeXBlTmFtZShub2RlLiR0eXBlKTtcclxuICAgICAgbGV0IGVudGl0eVR5cGUgPSBlbnRpdHlUeXBlTmFtZSAmJiBtYXBwaW5nQ29udGV4dC5lbnRpdHlNYW5hZ2VyLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShlbnRpdHlUeXBlTmFtZSwgdHJ1ZSk7XHJcbiAgICAgIGxldCBwcm9wZXJ0eU5hbWUgPSBub2RlQ29udGV4dC5wcm9wZXJ0eU5hbWU7XHJcbiAgICAgIGxldCBpZ25vcmUgPSBwcm9wZXJ0eU5hbWUgJiYgcHJvcGVydHlOYW1lLnN1YnN0cigwLCAxKSA9PT0gXCIkXCI7XHJcblxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGVudGl0eVR5cGU6IGVudGl0eVR5cGUsXHJcbiAgICAgICAgbm9kZUlkOiBub2RlLiRpZCxcclxuICAgICAgICBub2RlUmVmSWQ6IG5vZGUuJHJlZixcclxuICAgICAgICBpZ25vcmU6IGlnbm9yZVxyXG4gICAgICB9IGFzIGFueTtcclxuICAgIH1cclxuXHJcbiAgfSk7XHJcblxyXG59XHJcblxyXG4vKiogVHJhbnNmb3JtIGRhdGEgcHJvcGVydGllcyB3aGlsZSB1bndyYXBwaW5nIGVudGl0aWVzIGJlZm9yZSBzYXZlICovXHJcbmZ1bmN0aW9uIHRyYW5zZm9ybVZhbHVlKHByb3A6IGJyZWV6ZS5EYXRhUHJvcGVydHksIHZhbDogYW55KSB7XHJcbiAgaWYgKHByb3AuZGF0YVR5cGUgPT09IGJyZWV6ZS5EYXRhVHlwZS5EYXRlT25seSkge1xyXG4gICAgdmFsID0gYnJlZXplLkRhdGFUeXBlLnRvRGF0ZU9ubHlTdHJpbmcodmFsKTtcclxuICB9XHJcbiAgcmV0dXJuIHZhbDtcclxufVxyXG5cclxuXHJcbmJyZWV6ZS5jb25maWcucmVnaXN0ZXJBZGFwdGVyKFwiZGF0YVNlcnZpY2VcIiwgRGF0YVNlcnZpY2VXZWJBcGlBZGFwdGVyKTtcclxuIl19