- Postgres: every table has a uuid `id` (gen_random_uuid()); the event store keeps its relay order in `seq`, and the lookup tables their uniqueness in constraints of their own. - MongoDB: `_id` is Mongo's ObjectId; `id` is the domain id (the same uuid as the aggregate's stream in Postgres), unique, and every query goes by it. Production starts from empty databases. - Web: linking tickets and hanging one from a parent are picked from a searchable select (links across projects, parents within the project) instead of typing a key; every checkbox is @pi/ui's pi-checkbox. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
api-shared-infrastructure
Event store en PostgreSQL y el camino de los eventos hasta la lectura.
- Import:
@task-stream/api/shared/infrastructure - Capa:
infrastructure· Tags:scope:api-shared,type:infrastructure
Contenido
PostgresEventStore(tablaevents,UNIQUE(stream_id, position)→ConcurrencyError).EventSerializer/EventDeserializeryEventStorePublisher(sustituye al publisher delEventBus:commit()persiste).EventStoreRelay: copia los eventos nuevos al Redis Stream (FOR UPDATE SKIP LOCKED).EventsBridge: consume el stream y entrega cada evento a sus@EventsHandler, en orden y esperando (ACK al final); después ejecuta los@Saga()(elEventBusen memoria nunca ve los eventos guardados) y sus comandos, uno a uno.- Conexiones Redis (
REDIS_CLIENT,GRAPHQL_PUB_SUB) ySharedInfrastructureModule.forRootAsync.
Flujo completo: Arquitectura.
Comandos
npx nx lint api-shared-infrastructure
npx nx test api-shared-infrastructure # Jest
Reglas de dependencia entre capas: Arquitectura.