New structure, persistance and recovery #2

Merged
facundo.marion merged 1 commits from FIXPT-2/New_structure_and_persistance into develop 2026-03-30 13:42:20 +00:00

🐛 Reason to Be

Se agrega persistencia de mensajes FIX post-trade en PostgreSQL (qfixpt_messages como JSONB y qfixpt_logs como texto raw), tracking de estado de trades en
memoria (active/corrected/cancelled), recovery automático al reiniciar desde los mensajes del día, y nuevos endpoints REST para consultar trades y sus logs.

Resolves #FIXPT-2

Expected Behaviour

Trade lifecycle con estados:

  • Los trades se trackean en un mapa in-memory con estados active, corrected y cancelled basados en TradeReportType (101=confirm, 103=correction,
    104=cancel)
  • GET /trades devuelve solo trades activos
  • GET /trades/all devuelve todos los trades con su status
  • GET /trades/:tradeID/logs devuelve raw FIX messages (IN/OUT) para un trade específico

Persistencia:

  • Tabla qfixpt_messages: almacena mensajes FIX estructurados como JSONB (TradeCaptureReport, AllocationReport, Confirmation)
  • Tabla qfixpt_logs: almacena raw FIX messages concatenados por trade (upsert con append)
  • Tablas auto-creadas al startup vía embedded SQL (db.sql)
  • Parsers estructurados: parseTradeCaptureReportJSON, parseAllocationReportJSON, parseConfirmationJSON

Recovery al startup:

  • loadTrades() reconstruye el estado de todos los trades del día desde qfixpt_messages
  • Se aplica la misma lógica de estados (TradeReportType → status) para reconstruir el mapa
  • Log de recovery muestra totalTrades y activeTrades

Correlación cross-message:

  • TradeID (tag 1003) como clave primaria de correlación
  • Fallback a SecondaryOrderID (tag 198) en AllocationReport y ConfirmID (tag 664) en Confirmation
  • Hook onRawMessage captura mensajes IN/OUT para el log

Cambios en DB:

  • Nueva tabla qfixpt_messages con índices en trade_id y created_at
  • Nueva tabla qfixpt_logs con trade_id UNIQUE (append-only upsert)

📋 How To Test

  • Verificar que las tablas se auto-crean en un startup limpio
  • Enviar un TradeCaptureReport y verificar que se persiste en qfixpt_messages como JSONB
  • Verificar que los raw messages se appendean en qfixpt_logs
  • Verificar que GET /trades solo devuelve trades con status active
  • Verificar que GET /trades/all devuelve trades en todos los estados
  • Verificar que GET /trades/:tradeID/logs devuelve el historial de raw messages
  • Enviar correction (type 103) y cancel (type 104) y verificar que el status se actualiza correctamente
  • Reiniciar el servicio y verificar que el recovery reconstruye los trades con sus estados desde la DB
🐛 Reason to Be Se agrega persistencia de mensajes FIX post-trade en PostgreSQL (qfixpt_messages como JSONB y qfixpt_logs como texto raw), tracking de estado de trades en memoria (active/corrected/cancelled), recovery automático al reiniciar desde los mensajes del día, y nuevos endpoints REST para consultar trades y sus logs. Resolves #FIXPT-2 ✅ Expected Behaviour Trade lifecycle con estados: - Los trades se trackean en un mapa in-memory con estados `active`, `corrected` y `cancelled` basados en `TradeReportType` (101=confirm, 103=correction, 104=cancel) - `GET /trades` devuelve solo trades activos - `GET /trades/all` devuelve todos los trades con su status - `GET /trades/:tradeID/logs` devuelve raw FIX messages (IN/OUT) para un trade específico Persistencia: - Tabla `qfixpt_messages`: almacena mensajes FIX estructurados como JSONB (TradeCaptureReport, AllocationReport, Confirmation) - Tabla `qfixpt_logs`: almacena raw FIX messages concatenados por trade (upsert con append) - Tablas auto-creadas al startup vía embedded SQL (`db.sql`) - Parsers estructurados: `parseTradeCaptureReportJSON`, `parseAllocationReportJSON`, `parseConfirmationJSON` Recovery al startup: - `loadTrades()` reconstruye el estado de todos los trades del día desde `qfixpt_messages` - Se aplica la misma lógica de estados (TradeReportType → status) para reconstruir el mapa - Log de recovery muestra `totalTrades` y `activeTrades` Correlación cross-message: - TradeID (tag 1003) como clave primaria de correlación - Fallback a SecondaryOrderID (tag 198) en AllocationReport y ConfirmID (tag 664) en Confirmation - Hook `onRawMessage` captura mensajes IN/OUT para el log Cambios en DB: - Nueva tabla `qfixpt_messages` con índices en `trade_id` y `created_at` - Nueva tabla `qfixpt_logs` con `trade_id` UNIQUE (append-only upsert) 📋 How To Test - Verificar que las tablas se auto-crean en un startup limpio - Enviar un TradeCaptureReport y verificar que se persiste en `qfixpt_messages` como JSONB - Verificar que los raw messages se appendean en `qfixpt_logs` - Verificar que `GET /trades` solo devuelve trades con status `active` - Verificar que `GET /trades/all` devuelve trades en todos los estados - Verificar que `GET /trades/:tradeID/logs` devuelve el historial de raw messages - Enviar correction (type 103) y cancel (type 104) y verificar que el status se actualiza correctamente - Reiniciar el servicio y verificar que el recovery reconstruye los trades con sus estados desde la DB
facundo.marion added 1 commit 2026-03-30 13:41:17 +00:00
facundo.marion merged commit e01dce49c5 into develop 2026-03-30 13:42:20 +00:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Quantex/qfixpt#2
No description provided.