2024-03-10 08:49:52 +00:00
|
|
|
import AppProjections from "../AppProjections";
|
|
|
|
import AppQueries from "../AppQueries";
|
2024-03-10 09:49:36 +00:00
|
|
|
import DomainEvent from "../DomainEvent";
|
|
|
|
import DomainProjection from "../DomainProjection";
|
2024-03-10 08:49:52 +00:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|