
Pusher payloads don't have all of the information that is available in API V3, so we need to do some normalizing.
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';
|
|
}
|
|
});
|