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