Files
dashback/docs/api/routes/events.md
2026-10-16 16:24:58 +02:00

4.1 KiB

GET /events

Protected. Requires a valid session cookie (credentials: 'include').

Subscribe to update signals (SSE)

Opens a Server-Sent Events stream for the authenticated user's selected company. Clients receive named signals when another request successfully mutates shared data for that company (including the same browser's other tabs).

Use EventSource with credentials so the session cookie is sent:

const es = new EventSource('https://…/api/events', { withCredentials: true });
es.addEventListener('category', () => { refetchCategoryTree(); });
es.addEventListener('articles', () => { refetchArticleIndex(); });
es.addEventListener('article-42000045', () => { refetchArticle('42000045'); });

Keep-alive comments (: heartbeat) are sent roughly every 20s. Reconnect after changing the selected company (the stream is bound to the company at connect time).

Signals

Every SSE event uses the event name as the signal id; payloads are JSON and most events send an empty object {}. Only brand emits a richer payload.

Signal Payload Emitted after successful
category {} POST /category, PATCH /category/{id}, PUT /category/order, DELETE /category/{id}, POST /category/{id}/image, DELETE /category/{id}/image, PUT /category/{id}/property
articles {} POST /article, PATCH /article/{sku}, DELETE /article/{sku}, PUT /article/{sku}/articles-style list-level changes, POST /category/{id}/article and related article-assigning category mutations
article-<sku> {} PUT /article/{sku}/weight, PUT /article/{sku}/prices, PUT /article/{sku}/eans, PUT /article/{sku}/categories, PUT /article/{sku}/brand, PUT /article/{sku}/images/order, POST /article/{sku}/image, DELETE /article/{sku}/image/{fullHash}, supplier/article-property mutations affecting the article
stock {} POST /stock/adjust
ledger {} POST /stock/adjust
attributename {} POST /attributename, PUT /attributename/order, PATCH /attributename/{id}, DELETE /attributename/{id}
propertyname {} POST /propertyname, PUT /propertyname/order, PATCH /propertyname/{id}, DELETE /propertyname/{id}
labeltemplate {} POST /labeltemplate, PUT /labeltemplate/{id}, PATCH /labeltemplate/{id}, DELETE /labeltemplate/{id}
printer {} POST /printer, PUT /printer/{id}, PATCH /printer/{id}, DELETE /printer/{id}
warehouse {} POST /warehouse, PUT /warehouse/{id}, PATCH /warehouse/{id}, DELETE /warehouse/{id}
vfs {} VFS uploads and filesystem mutations such as POST /vfs/upload, POST /vfs/mkdir, POST /vfs/rename, PUT /vfs/{*path}, DELETE /vfs/{*path}
modelconversation {} POST /modelconversation, DELETE /modelconversation/{id}
modelconversation-<id> {} Conversation-specific updates on the same model conversation thread; the concrete ID is used in the event name
brand { sender, brandId } POST /brand, PATCH /brand/{id}, DELETE /brand/{id}, POST /brand/{id}/image, DELETE /brand/{id}/image

The brand payload is { sender, brandId }: sender echoes the caller's x-client-id header (empty string if absent) so the sender can ignore its own event; brandId is the affected brand id (null only if unknown). All other signals send {}.

Signals are only sent when the mutation actually succeeds (2xx). Failed or no-op validation errors do not emit. The article-<sku> and modelconversation-<id> event names use the concrete item id at runtime (for example article-42000045 and modelconversation-123).

Response 200

SSE stream (text/event-stream). Each signal is an SSE event whose name is the signal id. Most signals send {} as data; brand sends { "sender": "<x-client-id>", "brandId": 12 }.

Errors

Status Description
400 No company selected — {"error":"…"}
401 Unauthorized — {"error":"…"}

Generated from @openapi JSDoc. Do not edit by hand — run npm run docs:api.