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