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  });