github.com/manicqin/nomad@v0.9.5/ui/app/serializers/application.js (about)

     1  import { copy } from 'ember-copy';
     2  import { get } from '@ember/object';
     3  import { makeArray } from '@ember/array';
     4  import JSONSerializer from 'ember-data/serializers/json';
     5  import { pluralize, singularize } from 'ember-inflector';
     6  import removeRecord from '../utils/remove-record';
     7  
     8  export default JSONSerializer.extend({
     9    primaryKey: 'ID',
    10  
    11    keyForAttribute(attr) {
    12      return attr.camelize().capitalize();
    13    },
    14  
    15    keyForRelationship(attr, relationshipType) {
    16      const key = `${singularize(attr)
    17        .camelize()
    18        .capitalize()}ID`;
    19      return relationshipType === 'hasMany' ? pluralize(key) : 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 singularize(key.dasherize());
    72    },
    73  });