import { pick } from 'lodash'; import { SerializerParams } from './types.js'; import { DomainEvent, DomainEventMetadata, extractDomainEventPayload, serializer, RootPath, DeletedEvent, } from './velo-index.js'; export { RootPath }; export function toVeloEvent( domainEvent: DomainEvent, serializerParams: SerializerParams, ): VeloEvent { const veloEvent: VeloEvent = { metadata: toMetadata(domainEvent) }; if (shouldContainPayload(domainEvent)) { const { key, payload } = toVeloPayload(domainEvent, serializerParams); veloEvent[key] = payload; } return veloEvent; } function toVeloPayload( domainEvent: DomainEvent, serializerParams: SerializerParams, ) { const protoPayload = extractDomainEventPayload(domainEvent); const payload = serializer(serializerParams).fromJSON(protoPayload); const key: keyof VeloEvent = domainEvent.actionEvent ? 'data' : 'entity'; return { key, payload }; } function toMetadata(domainEvent: DomainEvent) { return pick( domainEvent, 'id', 'entityId', 'eventTime', 'triggeredByAnonymizeRequest', ); } type VeloEvent = { metadata: DomainEventMetadata; data?: any; entity?: any; }; function isEntityIncludedInDeletedEvent(deletedEvent: DeletedEvent): boolean { return deletedEvent.hasOwnProperty('deletedEntityAsJson'); } function shouldContainPayload(domainEvent: DomainEvent) { return ( !domainEvent.deletedEvent || isEntityIncludedInDeletedEvent(domainEvent.deletedEvent) ); }