github.com/emate/nomad@v0.8.2-wo-binpacking/ui/app/serializers/application.js (about) 1 import { copy } from '@ember/object/internals'; 2 import { get } from '@ember/object'; 3 import { makeArray } from '@ember/array'; 4 import JSONSerializer from 'ember-data/serializers/json'; 5 import removeRecord from '../utils/remove-record'; 6 7 export default JSONSerializer.extend({ 8 primaryKey: 'ID', 9 10 keyForAttribute(attr) { 11 return attr.camelize().capitalize(); 12 }, 13 14 keyForRelationship(attr, relationshipType) { 15 const key = `${attr 16 .singularize() 17 .camelize() 18 .capitalize()}ID`; 19 return relationshipType === 'hasMany' ? key.pluralize() : key; 20 }, 21 22 // Modeled after the pushPayload for ember-data/serializers/rest 23 pushPayload(store, payload) { 24 const documentHash = { 25 data: [], 26 included: [], 27 }; 28 29 Object.keys(payload).forEach(key => { 30 const modelName = this.modelNameFromPayloadKey(key); 31 const serializer = store.serializerFor(modelName); 32 const type = store.modelFor(modelName); 33 34 makeArray(payload[key]).forEach(hash => { 35 const { data, included } = serializer.normalize(type, hash, key); 36 documentHash.data.push(data); 37 if (included) { 38 documentHash.included.push(...included); 39 } 40 }); 41 }); 42 43 store.push(documentHash); 44 }, 45 46 normalizeFindAllResponse(store, modelClass) { 47 const result = this._super(...arguments); 48 this.cullStore(store, modelClass.modelName, result.data); 49 return result; 50 }, 51 52 // When records are removed server-side, and therefore don't show up in requests, 53 // the local copies of those records need to be unloaded from the store. 54 cullStore(store, type, records, storeFilter = () => true) { 55 const newRecords = copy(records).filter(record => get(record, 'id')); 56 const oldRecords = store.peekAll(type); 57 oldRecords 58 .filter(record => get(record, 'id')) 59 .filter(storeFilter) 60 .forEach(old => { 61 const newRecord = newRecords.find(record => get(record, 'id') === get(old, 'id')); 62 if (!newRecord) { 63 removeRecord(store, old); 64 } else { 65 newRecords.removeObject(newRecord); 66 } 67 }); 68 }, 69 70 modelNameFromPayloadKey(key) { 71 return key.dasherize().singularize(); 72 }, 73 });