← ClaudeAtlas

event-sourcing-cqrslisted

Event Sourcing and CQRS patterns. Event stores, projections, snapshots, command handlers, query models, and eventual consistency. Covers EventStoreDB, Axon Framework, and custom implementations. USE WHEN: user mentions "event sourcing", "CQRS", "event store", "projection", "command handler", "read model", "write model", "EventStoreDB", "Axon" DO NOT USE FOR: simple event-driven architecture - use `event-driven`; message brokers - use messaging skills; DDD basics - use `ddd`
claude-dev-suite/claude-dev-suite · ★ 33 · AI & Automation · score 80
Install: claude install-skill claude-dev-suite/claude-dev-suite
# Event Sourcing & CQRS ## Core Concepts ``` Command ──▶ Command Handler ──▶ Aggregate ──▶ Events ──▶ Event Store │ ┌──────┘ ▼ Projections ──▶ Read Models ──▶ Queries ``` ## Event Sourcing (TypeScript) ### Event Store ```typescript interface DomainEvent { eventId: string; aggregateId: string; type: string; data: unknown; version: number; timestamp: Date; } class EventStore { async append(aggregateId: string, events: DomainEvent[], expectedVersion: number): Promise<void> { // Optimistic concurrency: check current version matches expected const current = await this.getCurrentVersion(aggregateId); if (current !== expectedVersion) throw new ConcurrencyError(aggregateId); await db.events.createMany({ data: events.map((e, i) => ({ ...e, version: expectedVersion + i + 1 })), }); } async getEvents(aggregateId: string): Promise<DomainEvent[]> { return db.events.findMany({ where: { aggregateId }, orderBy: { version: 'asc' }, }); } } ``` ### Event-Sourced Aggregate ```typescript class OrderAggregate { private id!: string; private status!: string; private items: OrderItem[] = []; private version = 0; private uncommittedEvents: DomainEvent[] = []; static fromHistory(events: DomainEvent[]): OrderA