UNPKG

@sap-cloud-sdk/odata-common

Version:

SAP Cloud SDK for JavaScript common functions of OData client generator and OpenAPI clint generator.

136 lines 6.42 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.entitySerializer = entitySerializer; const util_1 = require("@sap-cloud-sdk/util"); const selectable_1 = require("./selectable"); const edm_types_1 = require("./edm-types"); const de_serializers_1 = require("./de-serializers"); const logger = (0, util_1.createLogger)({ package: 'odata-common', messageContext: 'entity-serializer' }); /** * Constructs an entitySerializer given the OData v2 or v4 specific tsToEdm method. * The concrete serializers are created in odata/v2/entity-serializer.ts and odata/v4/entity-serializer.ts. * @param deSerializers - (De-)serializers used for transformation. * @returns A entity serializer as defined by {@link EntitySerializer}. */ function entitySerializer(deSerializers) { const tsToEdm = (0, de_serializers_1.createValueSerializer)(deSerializers); /** * Converts an instance of an entity class into a JSON payload to be sent to an OData service. * @param entity - An instance of an entity. * @param entityApi - Entity API to serialize for. * @param diff - Serialize changed properties only. This only applies on the first level in case there are navigational properties. * @returns JSON. */ function serializeEntity(entity, entityApi, diff = false) { return { ...serializeEntityNonCustomFields(entity, entityApi, diff), ...(diff ? entity.getUpdatedCustomFields() : entity.getCustomFields()) }; } function serializeField(field, fieldValue) { if (fieldValue === null || fieldValue === undefined) { return null; } if (field instanceof selectable_1.EdmTypeField) { return tsToEdm(fieldValue, field.edmType, field._fieldOptions.precision); } if (field instanceof selectable_1.OneToOneLink) { return serializeEntity(fieldValue, field._linkedEntityApi); } if (field instanceof selectable_1.Link) { return fieldValue.map(linkedEntity => serializeEntity(linkedEntity, field._linkedEntityApi)); } if (field instanceof selectable_1.ComplexTypeField) { if (field._complexType) { return serializeComplexType(fieldValue, field._complexType); } return serializeComplexTypeFieldLegacy(field, fieldValue); } if (field instanceof selectable_1.CollectionField) { return serializeCollection(fieldValue, field._fieldType); } if (field instanceof selectable_1.EnumField) { return fieldValue; } } /** * Converts an instance of an entity class into a JSON payload to be sent to an OData service, ignoring custom fields. * @param entity - An instance of an entity. * @param entityApi - Entity API to serialize for. * @param diff - Serialize changed properties only. This only applies on the first level in case there are navigational properties. * @returns A JSON Representation of the non custom fields. */ function serializeEntityNonCustomFields(entity, entityApi, diff = false) { return getFieldNames(entity, diff).reduce((serialized, key) => { const field = entityApi.schema[(0, util_1.upperCaseSnakeCase)(key)]; const fieldValue = entity[key]; const serializedValue = serializeField(field, fieldValue); if (typeof serializedValue === 'undefined') { logger.warn(`Could not serialize value for unknown field: ${field}. Skipping field.`); return serialized; } return { ...serialized, [field._fieldName]: serializedValue }; }, {}); } function getFieldNames(entity, diff = false) { return entity ? diff ? entity.getUpdatedPropertyNames() : Object.keys(entity) : []; } // TODO: get rid of this function in v2.0 function serializeComplexTypeFieldLegacy(complexTypeField, fieldValue) { logger.warn('It seems that you are using an outdated OData client. To make this warning disappear, please regenerate your client using the latest version of the SAP Cloud SDK generator.'); return Object.entries(complexTypeField) .filter(([propertyKey, propertyValue]) => (propertyValue instanceof selectable_1.EdmTypeField || propertyValue instanceof selectable_1.ComplexTypeField) && typeof fieldValue[propertyKey] !== 'undefined') .reduce((complexTypeObject, [propertyKey, propertyValue]) => ({ ...complexTypeObject, [propertyValue._fieldName]: propertyValue instanceof selectable_1.EdmTypeField ? tsToEdm(fieldValue[propertyKey], propertyValue.edmType) : serializeComplexTypeFieldLegacy(propertyValue, fieldValue[propertyKey]) }), {}); } function serializeComplexTypeProperty(propertyValue, propertyMetadata) { if (propertyMetadata.isCollection) { return serializeCollection(propertyValue, propertyMetadata.type); } if ((0, selectable_1.isComplexTypeNameSpace)(propertyMetadata.type)) { return serializeComplexType(propertyValue, propertyMetadata.type); } return tsToEdm(propertyValue, propertyMetadata.type); } function serializeComplexType(fieldValue, complexType) { return complexType._propertyMetadata .map(property => ({ ...(typeof fieldValue[property.name] !== 'undefined' && { [property.originalName]: serializeComplexTypeProperty(fieldValue[property.name], property) }) })) .reduce((complexTypeObject, property) => ({ ...complexTypeObject, ...property }), {}); } function serializeCollection(fieldValue, fieldType) { if ((0, edm_types_1.isEdmType)(fieldType)) { return fieldValue.map(val => tsToEdm(val, fieldType)); } if ((0, selectable_1.isComplexTypeNameSpace)(fieldType)) { return fieldValue.map(val => serializeComplexType(val, fieldType)); } // Enum return fieldValue; } return { serializeEntity, serializeComplexType, serializeEntityNonCustomFields }; } //# sourceMappingURL=entity-serializer.js.map