common/corpus-common-addon/addon/services/resolver-service.js
author ymh <ymh.work@gmail.com>
Sat, 06 Aug 2016 21:29:33 +0700
changeset 261 02e2396bcbbc
parent 182 1bcc373adabb
child 328 04e728651a48
permissions -rw-r--r--
Migrate to ember 2.7 + correct jquery null context error + declare shim for popcorn (instead of silencing the JSHint error)
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
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
export default Ember.Service.extend({
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
    promises: null,
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
    queryRegister: null,
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
    storeKeyBase: null,
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
    apiPath: null,
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
    resDocRoot: null,
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
    processId: function(id) { return id; },
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
    getReturnDictKey: function(id) { return id; },
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
    init() {
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
        this._super(...arguments);
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
        this.set('promises', []);
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
        this.set('queryRegister',{});
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
        this.doQuery = _.debounce(this._doQuery,10);
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
    },
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
    env: function() {
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
        return Ember.getOwner(this).resolveRegistration('config:environment');
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
    },
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
    _getStoreKey: function(id) {
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
        return this.storeKeyBase+':'+id;
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
    },
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
    _doQuery: function() {
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
        var queryRegister = this.get('queryRegister');
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
        this.set('queryRegister', {});
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
        var ids = Object.keys(queryRegister).join(',');
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
        if(!ids) {
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
            _.each(queryRegister, (resolve_reject) => {
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
                resolve_reject[0]({});
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
            });
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
        }
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
        Ember.$.ajax({
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
            //TODO Configuration ?
261
02e2396bcbbc Migrate to ember 2.7 + correct jquery null context error + declare shim for popcorn (instead of silencing the JSHint error)
ymh <ymh.work@gmail.com>
parents: 182
diff changeset
    45
            url: this.env().rootURL.replace(/\/$/,'') + this.apiPath +ids,
182
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
            success: (itemDoc) => {
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
                _.each(queryRegister, (resolve_reject) => {
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
                    resolve_reject[0](itemDoc[this.resDocRoot]);
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
                });
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
            },
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
            error: (req, status, error) => {
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
                _.each(queryRegister, (resolve_reject) => {
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
                    resolve_reject[1](status + ':' + error);
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
                });
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
            }
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
        });
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
    },
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
    // make the query for the name.
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
    // return a Promise
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
    queryName: function(id) {
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
        var queryRegister = this.get('queryRegister');
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
        return new Ember.RSVP.Promise(function(resolve, reject) {
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
            queryRegister[id] = [resolve, reject];
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
            this.doQuery(this);
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
        }.bind(this));
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
    },
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
    getName: function(id) {
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
        if(!id) {
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
            return new Ember.RSVP.Promise(function(resolve/*, reject*/) {
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
                resolve('');
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
            });
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
        }
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
        var objectId = this.processId(id);
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
        var namePromise = null;
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
        var storeKey = this._getStoreKey(id);
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
        var name = store.get(storeKey);
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
        if( name !== null) {
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
            namePromise = new Ember.RSVP.Promise(function(resolve/*, reject*/) {
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
                resolve(name);
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
            });
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
        } else if ( storeKey in this.get('promises')) {
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
            namePromise = this.get('promises')[storeKey];
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
        } else {
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
            //TODO: handle error !!!
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
            namePromise = this.queryName(objectId)
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
                .then(function(names) {
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
                    delete this.get('promises')[storeKey];
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
                    return store.set(storeKey, names[this.getReturnDictKey(objectId)]);
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
                }.bind(this));
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
            this.get('promises')[storeKey] = namePromise;
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
        }
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
        return namePromise;
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
    }
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
1bcc373adabb Optimize resolver service to minimize number of requests
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
});