Reporting en eventservice (API, env-vars)

Feiten over reportingService en eventService. Voor context en het verschil met platform-logging, zie Logging vs reporting.

Bron-of-truth: apps/api/src/common/services/log-service/* en apps/api/src/api/event/eventService.ts.

reportingService

Singleton in apps/api/src/common/services/log-service/reportingService.ts. Wordt elders geïmporteerd als logService via een alias:

import { logService } from '@/common/services/log-service'; // === reportingService
// of expliciet:
import { reportingService } from '@/common/services/log-service';

Event-only. De constructor registreert alleen de event-transport. flush() negeert de transportName-parameter en maakt altijd precies één Event. E-mail- en console-transports bestaan niet meer.

API

Methode Beschrijving
startContext(id) Start een (in-memory) context.
log(id, message) Voeg een regel toe (level info).
logEx(id, message, { level, tags, data }) Gestructureerde regel.
logBreak(id) Visuele scheiding.
flush(id, 'event', context?) Bundel de regels als één Event en wis de context. Transportnaam wordt genegeerd.
createContext({ id?, tags?, correlationId? }) DX-helper → { id, info(), warn(), error(), debug(), break(), flushToEvent() }.
getMetrics() In-memory metrics (lines, flushes, evictions, …).

flush / flushToEvent context-velden

Doorgegeven aan EventLogTransporteventService.create:

Veld Effect
user Triggerende gebruiker (op het Event).
sourceDoc { id, model } Koppelt het Event aan een bron-document (model moet in onModelRegistry staan).
targets Lijst van User-docs voor gerichte notificaties.
eventTypeUuid Override van het EventType (default REPORTING_EVENT_TYPE_UUID).
enableLogs false om alleen context (zonder logregels) te versturen.
idempotencyKey Standaard de contextId.

Overige velden landen in event.data (bv. subject, een summary-object). Payload wordt gescrubt (redaction) en begrensd op EVENT_MAX_DATA_BYTES; bij overschrijding worden logregels van achter naar voren getrimd met een logsMeta-notitie.

Env-vars

Env-var Default Bron
REPORTING_EVENT_TYPE_UUID 84e1858c-0230-4916-b61a-6b55aa7f4e17 envConfig
EVENT_MAX_DATA_BYTES 65536 envConfig
REPORTING_MAX_CONTEXTS 500 envConfig + direct process.env
REPORTING_MIRROR_TO_PINO false envConfig + direct process.env
REPORTING_MAX_LINES 1000 alleen process.env (niet in envConfig)
REPORTING_MAX_CONTEXT_DURATION_MS 0 = uit process.env in de service (let op: envConfig declareert 3600000, maar de service leest process.env direct met fallback 0)

Let op: reportingService leest REPORTING_MAX_LINES, REPORTING_MAX_CONTEXTS, REPORTING_MAX_CONTEXT_DURATION_MS en REPORTING_MIRROR_TO_PINO rechtstreeks uit process.env, niet via de gevalideerde env. Ongezet betekent dus: max 1000 regels, max 500 contexten, geen context-expiry, geen pino-mirroring.

eventService

apps/api/src/api/event/eventService.ts.

Methode Beschrijving
create({ eventType, user, source: { id, model }, targets?, options? }) Maakt een Event (object-signature aanbevolen; legacy positional args blijven werken). Idempotent via idempotencyKey.
getTimeline(from, to, filterOnlyInReport?, page?, limit?) Tijdlijn, gegroepeerd per dag; paginatie optioneel.
createNotificationsForEvent(eventId) Idempotente notificatie-dispatch met rate-limiting en retries.

Persistente opslag: MongoDB events-collectie (apps/api/src/api/event/eventModel.ts), met o.a. eventType, user, targets, modelId + onModel, en data.

Env-vars (notificaties)

Env-var Default
NOTIFICATIONS_MAX_RETRIES 5
NOTIFICATIONS_RATE_PER_MINUTE 120

onModelRegistry

apps/api/src/common/utils/onModelRegistry.ts koppelt een onModel-string aan een mongoose-model (getModel) en/of een service-lookup (getSourceDoc). Een Event met een sourceDoc.model dat niet in deze registry staat, kan niet worden gepopuleerd op de tijdlijn en laat notificatie-dispatch falen. Voeg nieuwe bron-modellen hier toe (en werk de drift-regressietest bij).