mirage/serializers/application.js
import { RestSerializer } from 'miragejs';
import { dasherize } from '@ember/string';
import { pluralize } from 'ember-inflector';
export default RestSerializer.extend({
keyForForeignKey(relationshipName) {
return relationshipName;
},
keyForRelationshipIds(type) {
return type;
},
normalize(payload) {
let [type] = Object.keys(payload);
let attrs = payload[type];
let { belongsToAssociations, hasManyAssociations } =
this.registry.schema._registry[type].class.prototype;
let jsonApiPayload = {
data: {
type: pluralize(type),
},
};
Object.keys(attrs).forEach((key) => {
if (key === 'id') {
// records id
jsonApiPayload.data.id = attrs.id;
} else if (
belongsToAssociations.hasOwnProperty(key) ||
hasManyAssociations.hasOwnProperty(key)
) {
// relationship
if (!jsonApiPayload.data.hasOwnProperty('relationships')) {
jsonApiPayload.data.relationships = {};
}
let association = belongsToAssociations.hasOwnProperty(key)
? belongsToAssociations[key]
: hasManyAssociations[key];
let associationType = belongsToAssociations.hasOwnProperty(key)
? 'belongsTo'
: 'hasMany';
let associationModel = association.modelName;
let relationshipObject = {};
switch (associationType) {
case 'belongsTo':
relationshipObject.data = {
type: associationModel,
id: attrs[key],
};
break;
case 'hasMany':
relationshipObject.data = [];
attrs[key].forEach((value) => {
relationshipObject.data.push({
type: associationModel,
id: value,
});
});
break;
}
jsonApiPayload.data.relationships[key] = relationshipObject;
} else {
// attribute
if (!jsonApiPayload.data.hasOwnProperty('attributes')) {
jsonApiPayload.data.attributes = {};
}
jsonApiPayload.data.attributes[dasherize(key)] = attrs[key];
}
});
return jsonApiPayload;
},
serializeIds: 'always',
});