@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
JavaScript
;
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