95 lines
3.1 KiB
JavaScript
95 lines
3.1 KiB
JavaScript
import Ember from 'ember';
|
|
import V3Serializer from 'travis/serializers/v3';
|
|
|
|
export default V3Serializer.extend({
|
|
isNewSerializerAPI: true,
|
|
|
|
extractRelationships(modelClass, resourceHash) {
|
|
if(resourceHash['@type']) {
|
|
return this._super(...arguments);
|
|
} else {
|
|
let relationships = {};
|
|
|
|
modelClass.eachRelationship((key, relationshipMeta) => {
|
|
// V2 API payload
|
|
let relationship = null;
|
|
let relationshipKey = this.keyForV2Relationship(key, relationshipMeta.kind, 'deserialize');
|
|
let alternativeRelationshipKey = key.underscore();
|
|
|
|
if (resourceHash.hasOwnProperty(alternativeRelationshipKey) || resourceHash.hasOwnProperty(relationshipKey)) {
|
|
let data = null;
|
|
let relationshipHash = resourceHash[alternativeRelationshipKey] || resourceHash[relationshipKey];
|
|
if (relationshipMeta.kind === 'belongsTo') {
|
|
data = this.extractRelationship(relationshipMeta.type, relationshipHash);
|
|
} else if (relationshipMeta.kind === 'hasMany') {
|
|
data = relationshipHash.map((item) => this.extractRelationship(relationshipMeta.type, item));
|
|
}
|
|
relationship = { data };
|
|
}
|
|
|
|
if (relationship) {
|
|
relationships[key] = relationship;
|
|
}
|
|
});
|
|
|
|
return relationships;
|
|
}
|
|
},
|
|
|
|
normalize(modelClass, resourceHash) {
|
|
if(resourceHash['@type']) {
|
|
return this._super(...arguments);
|
|
} else {
|
|
var modelKey = modelClass.modelName;
|
|
var attributes = resourceHash[modelKey];
|
|
if(attributes) {
|
|
for(var key in attributes) {
|
|
resourceHash[key] = attributes[key];
|
|
}
|
|
|
|
resourceHash['type'] = modelKey;
|
|
delete resourceHash[modelKey];
|
|
}
|
|
|
|
let { data, included } = this._super(...arguments);
|
|
if(!included) {
|
|
included = [];
|
|
}
|
|
let store = this.store;
|
|
|
|
if(data.relationships) {
|
|
Object.keys(data.relationships).forEach(function (key) {
|
|
let relationship = data.relationships[key];
|
|
let process = function(data) {
|
|
if(Object.keys(data).sort()+'' !== 'id,type' || (data['@href'] && data.type === 'branch')) {
|
|
// no need to add records if they have only id and type
|
|
let type = key === 'defaultBranch' ? 'branch' : key.singularize();
|
|
let serializer = store.serializerFor(type);
|
|
let modelClass = store.modelFor(type);
|
|
let normalized = serializer.normalize(modelClass, data);
|
|
included.push(normalized.data);
|
|
if(normalized.included) {
|
|
normalized.included.forEach(function(item) {
|
|
included.push(item);
|
|
});
|
|
}
|
|
}
|
|
};
|
|
|
|
if(Array.isArray(relationship.data)) {
|
|
relationship.data.forEach(process);
|
|
} else if(relationship && relationship.data) {
|
|
process(relationship.data);
|
|
}
|
|
});
|
|
}
|
|
|
|
return { data, included };
|
|
}
|
|
},
|
|
|
|
keyForV2Relationship(key, typeClass, method) {
|
|
return key.underscore() + '_id';
|
|
}
|
|
});
|