import { SerializableAction } from '../Redux/SerializableAction'; import { DomainEvent, DomainEventConstructor } from 'ts-eventsourcing/Domain/DomainEvent'; import { Identity, IdentityConstructor } from 'ts-eventsourcing/ValueObject/Identity'; import { EntityName } from '../ValueObject/EntityName'; import { ClassUtil } from 'ts-eventsourcing/ClassUtil'; import { actionTypeWithEntity } from '../Redux/EntityMetadata'; import { InvalidTypeError } from './Error/InvalidTypeError'; import { asReadModelAction, ReadModelAction, ReadModelMetadata } from './ReadModelAction'; export interface DomainEventMetadata extends ReadModelMetadata { aggregateId: AggregateId; } export interface DomainEventAction = DomainEventMetadata> extends ReadModelAction { event: Event; } export function asDomainEventAction = DomainEventMetadata>( action: SerializableAction, eventClass: DomainEventConstructor, ReadModelIdClass: IdentityConstructor, AggregateIdClass: IdentityConstructor, ): DomainEventAction { asReadModelAction(action, ReadModelIdClass); if (!(action.event instanceof eventClass)) { throw InvalidTypeError.actionEventDoesNotMatchEventClass(action, eventClass); } if (!(action.metadata.aggregateId instanceof AggregateIdClass)) { throw InvalidTypeError.actionAggregateIdNotInstanceOf(action, AggregateIdClass); } return action as any; } export function domainEventActionType(domainEvent: DomainEventConstructor | DomainEvent, entity: EntityName) { return actionTypeWithEntity(ClassUtil.nameOff(domainEvent), entity); }