common/corpus-common-addon/addon/services/resolver-service.js
author ymh <ymh.work@gmail.com>
Mon, 28 Nov 2016 17:04:56 +0100
changeset 450 7bddb57bf806
parent 328 04e728651a48
child 474 245b4df137d3
permissions -rw-r--r--
avoid use unsupported Reflect api
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
182
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
import Ember from 'ember';
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
import _ from 'lodash';
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
import store from 'corpus-common-addon/utils/store';
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
328
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
     5
const DEFAULT_DEBOUNCE = 10;
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
     6
182
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
export default Ember.Service.extend({
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
328
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
     9
  promises: null,
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    10
  queryRegister: null,
182
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
328
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    12
  storeKeyBase: null,
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    13
  apiPath: null,
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    14
  resDocRoot: null,
182
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
328
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    16
  processId: function (id) {
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    17
    return id;
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    18
  },
182
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
328
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    20
  getReturnDictKey: function (id) {
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    21
    return id;
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    22
  },
182
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
328
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    24
  init(...args) {
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    25
    this._super(...args);
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    26
    this.set('promises', []);
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    27
    this.set('queryRegister', {});
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    28
    this.doQuery = _.debounce(this._doQuery, DEFAULT_DEBOUNCE);
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    29
  },
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    30
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    31
  env: function () {
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    32
    return Ember.getOwner(this).resolveRegistration('config:environment');
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    33
  },
182
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
328
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    36
  _getStoreKey: function (id) {
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    37
    return this.storeKeyBase + ':' + id;
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    38
  },
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    39
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    40
  _doQuery: function () {
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    41
    const queryRegister = this.get('queryRegister');
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    42
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    43
    this.set('queryRegister', {});
182
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
328
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    45
    const ids = Object.keys(queryRegister).join(',');
182
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
328
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    47
    if (!ids) {
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    48
      _.each(queryRegister, resolveReject=> {
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    49
        resolveReject[0]({});
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    50
      });
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    51
    }
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    52
    Ember.$.ajax({
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    53
      // TODO Configuration ?
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    54
      url: this.env().APP.backRootURL.replace(/\/$/, '') + this.apiPath + ids,
182
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
328
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    56
      success: itemDoc=> {
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    57
        _.each(queryRegister, resolveReject=> {
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    58
          resolveReject[0](itemDoc[this.resDocRoot]);
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    59
        });
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    60
      },
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    61
      error: (req, status, error)=> {
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    62
        _.each(queryRegister, resolveReject=> {
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    63
          resolveReject[1](status + ':' + error);
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    64
        });
182
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
328
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    66
      }
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    67
    });
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    68
  },
182
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
328
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    70
  // make the query for the name.
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    71
  // return a Promise
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    72
  queryName: function (id) {
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    73
    const queryRegister = this.get('queryRegister');
182
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
328
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    75
    return new Ember.RSVP.Promise(function (resolve, reject) {
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    76
      queryRegister[id] = [resolve, reject];
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    77
      this.doQuery(this);
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    78
    }.bind(this));
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    79
  },
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    80
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    81
  getName: function (id) {
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    82
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    83
    if (!id) {
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    84
      return new Ember.RSVP.Promise(function (resolve/* , reject*/) {
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    85
        resolve('');
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    86
      });
182
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
    }
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
328
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    89
    const objectId = this.processId(id);
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    90
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    91
    let namePromise = null;
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    92
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    93
    const storeKey = this._getStoreKey(id);
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    94
    const name = store.get(storeKey);
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    95
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    96
    if (name !== null) {
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    97
      namePromise = new Ember.RSVP.Promise(function (resolve/* , reject*/) {
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    98
        resolve(name);
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
    99
      });
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
   100
    } else if (storeKey in this.get('promises')) {
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
   101
      namePromise = this.get('promises')[storeKey];
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
   102
    } else {
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
   103
      // handle error !!!
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
   104
      namePromise = this.queryName(objectId)
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
   105
        .then(function (names) {
450
7bddb57bf806 avoid use unsupported Reflect api
ymh <ymh.work@gmail.com>
parents: 328
diff changeset
   106
          delete this.get('promises').storeKey; /* eslint prefer-reflect: "off" */
328
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
   107
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
   108
          return store.set(storeKey, names[this.getReturnDictKey(objectId)]);
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
   109
        }.bind(this));
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
   110
      this.get('promises')[storeKey] = namePromise;
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
   111
    }
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
   112
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
   113
    return namePromise;
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
   114
  }
04e728651a48 add reference to backRootUrl in common module
ymh <ymh.work@gmail.com>
parents: 261
diff changeset
   115
182
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
});