Separated event listeners from resource fetching

refs https://github.com/TryGhost/Toolbox/issues/125

- The "fetchResources" method did way to many things extracted event listener setup logic to a separate method
- This allows to call out these stages as needed if we retreive resources separately from a cache of some sort and don't need to wait for the database response
This commit is contained in:
Naz 2021-11-12 11:56:05 +04:00
parent 46c3b53979
commit 376e2f4cf3
2 changed files with 27 additions and 6 deletions

View File

@ -55,13 +55,12 @@ class Resources {
} }
const bridge = require('../../../bridge'); const bridge = require('../../../bridge');
this.resourcesAPIVersion = bridge.getFrontendApiVersion(); const resourcesAPIVersion = bridge.getFrontendApiVersion();
this.resourcesConfig = require(`./configs/${this.resourcesAPIVersion}`); this.resourcesConfig = require(`./configs/${resourcesAPIVersion}`);
} }
/** /**
* @description Helper function to initialise data fetching. Each resource type needs to register resource/model * @description Helper function to initialize data fetching.
* events to get notified about updates/deletions/inserts.
*/ */
fetchResources() { fetchResources() {
const ops = []; const ops = [];
@ -75,6 +74,29 @@ class Resources {
// NOTE: We are querying knex directly, because the Bookshelf ORM overhead is too slow. // NOTE: We are querying knex directly, because the Bookshelf ORM overhead is too slow.
ops.push(this._fetch(resourceConfig)); ops.push(this._fetch(resourceConfig));
});
return Promise.all(ops);
}
/**
* @description Each resource type needs to register resource/model events to get notified
* about updates/deletions/inserts.
*
* For example for a "tag" resource type with following configuration:
* events: {
* add: 'tag.added',
* update: ['tag.edited', 'tag.attached', 'tag.detached'],
* remove: 'tag.deleted'
* }
* there would be:
* 1 event listener connected to "_onResourceAdded" handler and it's 'tag.added' event
* 3 event listeners connected to "_onResourceUpdated" handler and it's 'tag.edited', 'tag.attached', 'tag.detached' events
* 1 event listener connected to "_onResourceRemoved" handler and it's 'tag.deleted' event
*/
initEvenListeners() {
_.each(this.resourcesConfig, (resourceConfig) => {
this.data[resourceConfig.type] = [];
this._listenOn(resourceConfig.events.add, (model) => { this._listenOn(resourceConfig.events.add, (model) => {
return this._onResourceAdded.bind(this)(resourceConfig.type, model); return this._onResourceAdded.bind(this)(resourceConfig.type, model);
@ -96,8 +118,6 @@ class Resources {
return this._onResourceRemoved.bind(this)(resourceConfig.type, model); return this._onResourceRemoved.bind(this)(resourceConfig.type, model);
}); });
}); });
return Promise.all(ops);
} }
/** /**

View File

@ -288,6 +288,7 @@ class UrlService {
*/ */
init() { init() {
this.resources.fetchResources(); this.resources.fetchResources();
this.resources.initEvenListeners();
// CASE: all resources are fetched, start the queue // CASE: all resources are fetched, start the queue
this.queue.start({ this.queue.start({
event: 'init', event: 'init',