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