Tools/domain/testing/TestApp.ts
2024-03-10 10:49:36 +01:00

47 lines
1.3 KiB
TypeScript

import AppProjections from "../AppProjections";
import AppQueries from "../AppQueries";
import DomainEvent from "../DomainEvent";
import DomainProjection from "../DomainProjection";
import EventStore from "../EventStore";
export class TestApp {
readonly eventStore: InMemoryEventStore = new InMemoryEventStore();
readonly projections: AppProjections = new AppProjections();
readonly queries: AppQueries = new AppQueries(this.projections);
constructor(history: DomainEvent<any>[] = []) {
this.projections.getAll().forEach((projection) => {
this.eventStore.subscribe(projection);
});
for (const event of history) {
this.eventStore.append(event);
}
}
}
class InMemoryEventStore implements EventStore {
private handlers: DomainProjection[] = [];
private readonly events: DomainEvent<any>[] = [];
async append(event: DomainEvent<any>): Promise<void> {
this.events.push(event);
for (const handler of this.handlers) {
handler.handle(event);
}
}
subscribe(projection: DomainProjection): void {
this.handlers.push(projection);
}
async replay(): Promise<void> {
throw new Error(
"Replay is not relevant for InMemoryEventStore. Use append instead."
);
}
getAllEvents(): DomainEvent<any>[] {
return this.events;
}
}