67 lines
1.6 KiB
JavaScript
Raw Normal View History

2021-08-03 11:22:57 +02:00
'use strict';
const assert = require('assert').strict;
2021-09-20 19:15:50 +02:00
const timestampsLifecyclesSubscriber = require('./subscribers/timestamps');
const modelLifecyclesSubscriber = require('./subscribers/models-lifecycles');
const isValidSubscriber = subscriber => {
return (
typeof subscriber === 'function' || (typeof subscriber === 'object' && subscriber !== null)
);
};
2021-09-20 19:15:50 +02:00
/**
* @type {import('.').createLifecyclesProvider}
*/
const createLifecyclesProvider = db => {
let subscribers = [timestampsLifecyclesSubscriber, modelLifecyclesSubscriber];
2021-09-20 19:15:50 +02:00
return {
2021-08-03 11:22:57 +02:00
subscribe(subscriber) {
assert(isValidSubscriber(subscriber), 'Invalid subscriber. Expected function or object');
subscribers.push(subscriber);
2021-08-03 11:22:57 +02:00
return () => subscribers.splice(subscribers.indexOf(subscriber), 1);
2021-08-03 11:22:57 +02:00
},
2021-09-20 19:15:50 +02:00
clear() {
subscribers = [];
},
2021-08-03 11:22:57 +02:00
createEvent(action, uid, properties) {
const model = db.metadata.get(uid);
return {
action,
model,
...properties,
};
},
async run(action, uid, properties) {
for (const subscriber of subscribers) {
if (typeof subscriber === 'function') {
const event = this.createEvent(action, uid, properties);
await subscriber(event);
continue;
}
2021-08-03 11:22:57 +02:00
const hasAction = action in subscriber;
const hasModel = !subscriber.models || subscriber.models.includes(uid);
if (hasAction && hasModel) {
const event = this.createEvent(action, uid, properties);
await subscriber[action](event);
}
}
},
};
};
module.exports = {
2021-09-20 19:15:50 +02:00
createLifecyclesProvider,
2021-08-03 11:22:57 +02:00
};