diff --git a/addon/serializer.js b/addon/serializer.js index 822dfb6..ec33555 100644 --- a/addon/serializer.js +++ b/addon/serializer.js @@ -27,14 +27,25 @@ const DrupalJSONAPISerializer = JSONAPISerializer.extend({ }, modelNameFromPayloadKey(key) { - let parts = key.split('--'); + const parts = key.split('--'); if (parts.length === 2) { - let bundle = parts[1]; - return singularize(normalizeModelName(bundle)); + const entity = parts[0]; + const bundle = parts[1]; + return this.get('drupalMapper').modelNameFor(entity, bundle) || singularize(normalizeModelName(bundle)); } return singularize(normalizeModelName(key)); }, + payloadKeyFromModelName(modelName) { + const drupalMapper = this.get('drupalMapper'); + if (drupalMapper.isMapped(modelName)) { + const entity = drupalMapper.entityFor(modelName); + const bundle = drupalMapper.bundleFor(modelName); + return `${entity}--${bundle}`; + } + return modelName; + }, + extractAttributes(modelClass, resourceHash) { let modelClassString = modelClass.toString(), modelName = modelClassString.split(':')[1], diff --git a/addon/services/drupal-mapper.js b/addon/services/drupal-mapper.js index 8cdab3e..d5c881f 100644 --- a/addon/services/drupal-mapper.js +++ b/addon/services/drupal-mapper.js @@ -32,5 +32,21 @@ export default Service.extend({ return DRUPAL_FIELD_PREFIX + underscore(fieldName); } return underscore(fieldName); + }, + + isMapped(modelName) { + return this.map.hasOwnProperty(modelName); + }, + + modelNameFor(entity, bundle) { + return Object.keys(this.map).find(modelName => { + const modelMap = this.map[modelName]; + modelMap.entity = modelMap.entity || 'node'; + + const bundleMatches = modelMap.bundle === bundle || modelMap.bundle === undefined && modelName === bundle; + if (bundleMatches && modelMap.entity === entity) { + return true; + } + }); } }); \ No newline at end of file