@directus/api
Version:
Directus is a real-time API and App dashboard for managing SQL database content
132 lines (130 loc) • 3.23 kB
JavaScript
import { useBus } from "../../bus/lib/use-bus.js";
import "../../bus/index.js";
import emitter_default from "../../emitter.js";
import { systemCollectionNames } from "@directus/system-data";
//#region src/websocket/controllers/hooks.ts
let actionsRegistered = false;
function registerWebSocketEvents() {
if (actionsRegistered) return;
actionsRegistered = true;
registerActionHooks(["items", ...systemCollectionNames.filter((collection) => ![
"directus_migrations",
"directus_fields",
"directus_relations",
"directus_files",
"directus_sessions"
].includes(collection)).map((collection) => collection.replace("directus_", ""))]);
registerFieldsHooks();
registerFilesHooks();
registerRelationsHooks();
registerSortHooks();
}
function registerActionHooks(modules) {
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() {
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() {
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() {
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_default.onAction(event, (data) => {
messenger.publish("websocket.event", transform(data));
});
}
//#endregion
export { registerWebSocketEvents };