common/corpus-common-addon/addon/services/resolver-service.js
changeset 339 766af1228b05
parent 328 04e728651a48
child 450 7bddb57bf806
equal deleted inserted replaced
338:4a3899b6a7ed 339:766af1228b05
     1 import Ember from 'ember';
     1 import Ember from 'ember';
     2 import _ from 'lodash';
     2 import _ from 'lodash';
     3 import store from 'corpus-common-addon/utils/store';
     3 import store from 'corpus-common-addon/utils/store';
     4 
     4 
       
     5 const DEFAULT_DEBOUNCE = 10;
       
     6 
     5 export default Ember.Service.extend({
     7 export default Ember.Service.extend({
     6 
     8 
     7     promises: null,
     9   promises: null,
     8     queryRegister: null,
    10   queryRegister: null,
     9 
    11 
    10     storeKeyBase: null,
    12   storeKeyBase: null,
    11     apiPath: null,
    13   apiPath: null,
    12     resDocRoot: null,
    14   resDocRoot: null,
    13 
    15 
    14     processId: function(id) { return id; },
    16   processId: function (id) {
       
    17     return id;
       
    18   },
    15 
    19 
    16     getReturnDictKey: function(id) { return id; },
    20   getReturnDictKey: function (id) {
       
    21     return id;
       
    22   },
    17 
    23 
    18     init() {
    24   init(...args) {
    19         this._super(...arguments);
    25     this._super(...args);
    20         this.set('promises', []);
    26     this.set('promises', []);
    21         this.set('queryRegister',{});
    27     this.set('queryRegister', {});
    22         this.doQuery = _.debounce(this._doQuery,10);
    28     this.doQuery = _.debounce(this._doQuery, DEFAULT_DEBOUNCE);
    23     },
    29   },
    24 
    30 
    25     env: function() {
    31   env: function () {
    26         return Ember.getOwner(this).resolveRegistration('config:environment');
    32     return Ember.getOwner(this).resolveRegistration('config:environment');
    27     },
    33   },
    28 
    34 
    29 
    35 
    30     _getStoreKey: function(id) {
    36   _getStoreKey: function (id) {
    31         return this.storeKeyBase+':'+id;
    37     return this.storeKeyBase + ':' + id;
    32     },
    38   },
    33 
    39 
    34     _doQuery: function() {
    40   _doQuery: function () {
    35         var queryRegister = this.get('queryRegister');
    41     const queryRegister = this.get('queryRegister');
    36         this.set('queryRegister', {});
       
    37         var ids = Object.keys(queryRegister).join(',');
       
    38         if(!ids) {
       
    39             _.each(queryRegister, (resolve_reject) => {
       
    40                 resolve_reject[0]({});
       
    41             });
       
    42         }
       
    43         Ember.$.ajax({
       
    44             //TODO Configuration ?
       
    45             url: this.env().rootURL.replace(/\/$/,'') + this.apiPath +ids,
       
    46 
    42 
    47             success: (itemDoc) => {
    43     this.set('queryRegister', {});
    48                 _.each(queryRegister, (resolve_reject) => {
       
    49                     resolve_reject[0](itemDoc[this.resDocRoot]);
       
    50                 });
       
    51             },
       
    52             error: (req, status, error) => {
       
    53                 _.each(queryRegister, (resolve_reject) => {
       
    54                     resolve_reject[1](status + ':' + error);
       
    55                 });
       
    56 
    44 
    57             }
    45     const ids = Object.keys(queryRegister).join(',');
       
    46 
       
    47     if (!ids) {
       
    48       _.each(queryRegister, resolveReject=> {
       
    49         resolveReject[0]({});
       
    50       });
       
    51     }
       
    52     Ember.$.ajax({
       
    53       // TODO Configuration ?
       
    54       url: this.env().APP.backRootURL.replace(/\/$/, '') + this.apiPath + ids,
       
    55 
       
    56       success: itemDoc=> {
       
    57         _.each(queryRegister, resolveReject=> {
       
    58           resolveReject[0](itemDoc[this.resDocRoot]);
    58         });
    59         });
    59     },
    60       },
       
    61       error: (req, status, error)=> {
       
    62         _.each(queryRegister, resolveReject=> {
       
    63           resolveReject[1](status + ':' + error);
       
    64         });
    60 
    65 
    61     // make the query for the name.
    66       }
    62     // return a Promise
    67     });
    63     queryName: function(id) {
    68   },
    64         var queryRegister = this.get('queryRegister');
       
    65         return new Ember.RSVP.Promise(function(resolve, reject) {
       
    66             queryRegister[id] = [resolve, reject];
       
    67             this.doQuery(this);
       
    68         }.bind(this));
       
    69     },
       
    70 
    69 
    71     getName: function(id) {
    70   // make the query for the name.
       
    71   // return a Promise
       
    72   queryName: function (id) {
       
    73     const queryRegister = this.get('queryRegister');
    72 
    74 
    73         if(!id) {
    75     return new Ember.RSVP.Promise(function (resolve, reject) {
    74             return new Ember.RSVP.Promise(function(resolve/*, reject*/) {
    76       queryRegister[id] = [resolve, reject];
    75                 resolve('');
    77       this.doQuery(this);
    76             });
    78     }.bind(this));
    77         }
    79   },
    78 
    80 
    79         var objectId = this.processId(id);
    81   getName: function (id) {
    80 
    82 
    81         var namePromise = null;
    83     if (!id) {
    82 
    84       return new Ember.RSVP.Promise(function (resolve/* , reject*/) {
    83         var storeKey = this._getStoreKey(id);
    85         resolve('');
    84         var name = store.get(storeKey);
    86       });
    85 
       
    86         if( name !== null) {
       
    87             namePromise = new Ember.RSVP.Promise(function(resolve/*, reject*/) {
       
    88                 resolve(name);
       
    89             });
       
    90         } else if ( storeKey in this.get('promises')) {
       
    91             namePromise = this.get('promises')[storeKey];
       
    92         } else {
       
    93             //TODO: handle error !!!
       
    94             namePromise = this.queryName(objectId)
       
    95                 .then(function(names) {
       
    96                     delete this.get('promises')[storeKey];
       
    97                     return store.set(storeKey, names[this.getReturnDictKey(objectId)]);
       
    98                 }.bind(this));
       
    99             this.get('promises')[storeKey] = namePromise;
       
   100         }
       
   101         return namePromise;
       
   102     }
    87     }
   103 
    88 
       
    89     const objectId = this.processId(id);
       
    90 
       
    91     let namePromise = null;
       
    92 
       
    93     const storeKey = this._getStoreKey(id);
       
    94     const name = store.get(storeKey);
       
    95 
       
    96     if (name !== null) {
       
    97       namePromise = new Ember.RSVP.Promise(function (resolve/* , reject*/) {
       
    98         resolve(name);
       
    99       });
       
   100     } else if (storeKey in this.get('promises')) {
       
   101       namePromise = this.get('promises')[storeKey];
       
   102     } else {
       
   103       // handle error !!!
       
   104       namePromise = this.queryName(objectId)
       
   105         .then(function (names) {
       
   106           Reflect.deleteProperty(this.get('promises'), storeKey);
       
   107 
       
   108           return store.set(storeKey, names[this.getReturnDictKey(objectId)]);
       
   109         }.bind(this));
       
   110       this.get('promises')[storeKey] = namePromise;
       
   111     }
       
   112 
       
   113     return namePromise;
       
   114   }
       
   115 
   104 });
   116 });