UNPKG

@directus/api

Version:

Directus is a real-time API and App dashboard for managing SQL database content

142 lines (141 loc) 4.08 kB
import { useBus } from '../../bus/index.js'; import emitter from '../../emitter.js'; let actionsRegistered = false; export function registerWebSocketEvents() { if (actionsRegistered) return; actionsRegistered = true; registerActionHooks([ 'items', 'access', 'activity', 'collections', 'dashboards', 'flows', 'folders', 'notifications', 'operations', 'panels', 'permissions', 'policies', 'presets', 'revisions', 'roles', 'settings', 'shares', 'translations', 'users', 'versions', 'webhooks', ]); registerFieldsHooks(); registerFilesHooks(); registerRelationsHooks(); registerSortHooks(); } function registerActionHooks(modules) { // register event hooks that can be handled in an uniform manner for (const module of modules) { registerAction(module + '.create', ({ key, collection, payload = {} }) => ({ collection, action: 'create', key, payload, })); registerAction(module + '.update', ({ keys, collection, payload = {} }) => ({ collection, action: 'update', keys, payload, })); registerAction(module + '.delete', ({ keys, collection, payload = [] }) => ({ collection, action: 'delete', keys, payload, })); } } function registerFieldsHooks() { // exception for field hooks that don't report `directus_fields` as being the collection registerAction('fields.create', ({ key, payload = {} }) => ({ collection: 'directus_fields', action: 'create', key, payload, })); registerAction('fields.update', ({ keys, payload = {} }) => ({ collection: 'directus_fields', action: 'update', keys, payload, })); registerAction('fields.delete', ({ keys, payload = [] }) => ({ collection: 'directus_fields', action: 'delete', keys, payload, })); } function registerFilesHooks() { // extra event for file uploads that doubles as create event registerAction('files.upload', ({ key, collection, payload = {} }) => ({ collection, action: 'create', key, payload, })); registerAction('files.update', ({ keys, collection, payload = {} }) => ({ collection, action: 'update', keys, payload, })); registerAction('files.delete', ({ keys, collection, payload = [] }) => ({ collection, action: 'delete', keys, payload, })); } function registerRelationsHooks() { // exception for relation hooks that don't report `directus_relations` as being the collection registerAction('relations.create', ({ key, payload = {} }) => ({ collection: 'directus_relations', action: 'create', key, payload: { ...payload, key }, })); registerAction('relations.update', ({ keys, payload = {} }) => ({ collection: 'directus_relations', action: 'update', keys, payload, })); registerAction('relations.delete', ({ collection, payload = [] }) => ({ collection: 'directus_relations', action: 'delete', keys: payload, payload: { collection, fields: payload }, })); } function registerSortHooks() { registerAction('items.sort', ({ collection, item }) => ({ collection, action: 'update', keys: [item], payload: {}, })); } /** * Wrapper for emitter.onAction to hook into system events * @param event The action event to watch * @param transform Transformer function */ function registerAction(event, transform) { const messenger = useBus(); emitter.onAction(event, (data) => { // push the event through the Redis pub/sub messenger.publish('websocket.event', transform(data)); }); }