import { SerializableAction } from '../Redux/SerializableAction'; import { Identity, IdentityConstructor } from 'ts-eventsourcing/ValueObject/Identity'; import { InvalidTypeError } from './Error/InvalidTypeError'; import { EntityMetadata } from '../Redux/EntityMetadata'; import { Playhead } from '../ValueObject/Playhead'; export interface ReadModelMetadata extends EntityMetadata { readModelId: ReadModelId; recordedOn: Date; playhead?: Playhead; } export interface ReadModelAction = ReadModelMetadata> extends SerializableAction { } export function asReadModelAction< ReadModelId extends Identity = Identity, Metadata extends ReadModelMetadata = ReadModelMetadata>( action: SerializableAction, ReadModelIdClass?: IdentityConstructor, ): ReadModelAction { if (!(action.metadata.recordedOn instanceof Date)) { throw InvalidTypeError.actionMissingRecordedOn(); } if (ReadModelIdClass && !(action.metadata.readModelId instanceof ReadModelIdClass)) { throw InvalidTypeError.actionReadModelIdNotInstanceOf(action, ReadModelIdClass); } return action as any; }