Files
boc/packages/infrastructure/src/adapters/in-memory-event-store.ts
T

46 lines
1.2 KiB
TypeScript
Raw Normal View History

/**
* In-Memory Event Store
*
* Adapter: Implements EventStore using an array.
* Purpose: Testing, development, CI/CD pipelines.
* NOT for production.
*
* ADR-003: Event Sourcing for traceability
* - Events are immutable facts
* - State is a projection of event history
* - Replay reconstructs any past state
*/
import { DomainEvent } from '@landvex/domain';
import { EventStore } from '../repositories/repository-interfaces';
export class InMemoryEventStore implements EventStore {
private events: DomainEvent[] = [];
async append(event: DomainEvent): Promise<void> {
this.events.push(event);
}
async getEvents(aggregateId: string): Promise<DomainEvent[]> {
return this.events
.filter(e => e.aggregateId === aggregateId)
.sort((a, b) => a.occurredAt.getTime() - b.occurredAt.getTime());
}
async getAllEvents(since?: Date): Promise<DomainEvent[]> {
let filtered = this.events;
if (since) {
filtered = filtered.filter(e => e.occurredAt >= since);
}
return filtered.sort((a, b) => a.occurredAt.getTime() - b.occurredAt.getTime());
}
clear(): void {
this.events = [];
}
count(): number {
return this.events.length;
}
}