Implementación Endpoints V3 de Ofertas en sw-api
1. Contexto
Este documento describe el plan para implementar los endpoints de la API REST V3 relacionados con la obtención de ofertas (/rest/v3/offers y /rest/v3/offer) dentro de la aplicación sw-api.
La especificación general de la API V3 (incluyendo los endpoints originales y su propósito) puede consultarse en lib-docs/switchain/files/restApiV3.js, aunque la implementación actual diferirá como se describe a continuación.
Esta implementación forma parte de una migración mayor desde un sistema legado basado en Meteor y MongoDB hacia una arquitectura moderna con TypeScript, NodeJS, base de datos relacional (gestionada con Prisma) y siguiendo principios de Domain-Driven Design (DDD) y Arquitectura Hexagonal.
Flujo de Datos Esperado (Actualizado):
- El paquete
packages/rates(y su correspondiente workerapps/rates) es responsable de calcular periódicamente las ofertas disponibles para cadaappId(API Key de partner) y almacenarlas en caché en Redis. - El paquete
packages/ratesexpone un controlador,pairOffersRetriever(accesible a través del objeto exportadoRatesControllersenpackages/rates/index.ts), que encapsula la lógica para leer estas ofertas cacheadas desde Redis dado unappId. - La aplicación
sw-apiexpondrá los endpoints V3 (/rest/v3/offersy/rest/v3/offer). - Cuando
sw-apireciba una petición a un endpoint de ofertas, deberá:- Autenticar la petición y extraer el
appId(API Key) del contexto de la petición. - Importar
RatesControllersdesde@sws/rates. - Llamar directamente al método
run()del controladorRatesControllers.pairOffersRetrievercon elappId. - Para
/rest/v3/offer, filtrar la lista completa de ofertas obtenida basándose en los parámetros de consulta (pair,chainPair,amountFrom) dentro del manejador de la ruta. - Formatear y devolver la respuesta según la especificación de la API V3.
- Autenticar la petición y extraer el
Arquitectura Simplificada:
La implementación en sw-api seguirá una estructura simplificada para estos endpoints:
- Domain: Mínimo, principalmente para definir la estructura de la respuesta (DTOs).
- Application: No se crearán servicios específicos para ofertas en
sw-api/application. La lógica reside en el controlador depackages/rates. - Infrastructure:
- Controladores: No se crearán controladores específicos para ofertas en
sw-api/infrastructure/controllers. - Rutas (
V3Routes.ts): Se añadirán las rutas/rest/v3/offersy/rest/v3/offer. Los manejadores de estas rutas importaránRatesControllersy llamarán directamente aRatesControllers.pairOffersRetriever.run(). La lógica de filtrado para/rest/v3/offerse implementará aquí. - Fábricas: No se requiere una
OfferFactoryespecífica ensw-apipara instanciar el controlador, ya que se importa directamente la instancia preconfigurada desde@sws/rates.
- Controladores: No se crearán controladores específicos para ofertas en
2. Endpoints a Implementar (Basado en restApiV3.js)
GET /rest/v3/offers: Devuelve la lista completa de ofertas disponibles para elappIdasociado a la API Key de la petición.GET /rest/v3/offer: Devuelve una oferta específica basada en parámetros de consulta (pair,chainPair,amountFrom).
3. Plan de Implementación Detallado (Actualizado)
Paso 1: Definir/Reutilizar Componentes del Dominio (sw-api/domain)
- Value Objects / DTOs:
ApiKey: Asegurar que el tipoApiKey(probablementestring) esté disponible en el contexto de la ruta (inyectado por el middleware de autenticación).PairOfferDto: Definir un DTO ensw-apique represente la estructura de una oferta devuelta porRatesControllers.pairOffersRetrievery que coincida con el formato esperado por la respuesta de la API V3. Es crucial conocer la estructura exacta devuelta por el controlador derates. Esta estructura debe obtenerse del propio controladorRatesControllers.pairOffersRetrieveren@sws/rates, ya que la documentación enrestApiV3.jsdescribe la implementación anterior.
Paso 2: Implementar Lógica de Aplicación (sw-api/application)
- Omitido: No se crearán servicios de aplicación específicos para ofertas en
sw-api.
Paso 3: Configurar Infraestructura (sw-api/infrastructure)
- Fábricas (
sw-api/infrastructure/factories/):- Omitido: No se necesita una
OfferFactorypara las ofertas.
- Omitido: No se necesita una
- Controlador (
sw-api/infrastructure/controllers/):- Omitido: No se necesita un
OffersController.
- Omitido: No se necesita un
- Rutas (
V3Routes.tsensw-api/infrastructure/routes/):- Importar
RatesControllersdesde@sws/rates. - Registrar las rutas
GET /rest/v3/offersyGET /rest/v3/offerusando Elysia. - En el manejador de
GET /rest/v3/offers:- Extraer el
ApiKeydel contexto. - Llamar a
RatesControllers.pairOffersRetriever.run(apiKey). - Formatear la respuesta HTTP (código 200, cuerpo
{ data: [...] }).
- Extraer el
- En el manejador de
GET /rest/v3/offer:- Extraer el
ApiKeyy los parámetros de consulta (pair,chainPair,amountFrom). - Llamar a
RatesControllers.pairOffersRetriever.run(apiKey). - Filtrar la lista de ofertas devuelta según los parámetros de consulta.
- Formatear la respuesta HTTP (código 200 con
{ data: {...} }si se encuentra, o error 404 si no).
- Extraer el
- Asegurar que el middleware de autenticación que extrae/valida la API Key se aplique a estas rutas.
- Importar
Paso 4: Middleware de Autenticación (Revisión/Ajuste)
- Verificar que el middleware de autenticación existente en
sw-apiextrae correctamente elApiKey(probablemente del headerAuthorizationo similar) y lo pone a disposición del controlador o del contexto de la petición. - Asegurar que el
ApiKeyvalidado pueda ser fácilmente inyectado o accedido por el controlador o del contexto de la petición.
Paso 5: Pruebas
- Unitarias: Probar directamente los manejadores de ruta en
V3Routes.ts, utilizando mocks paraRatesControllers.pairOffersRetrievery el middleware de autenticación. Enfocarse en la lógica de filtrado para/rest/v3/offer. - Integración: Probar las rutas completas desde la petición HTTP hasta la ejecución del controlador de
rates(idealmente conectando con una instancia de Redis de prueba poblada con datos). Verificar la correcta autenticación, el paso de parámetros, el filtrado y el formato de respuesta.
4. Consideraciones Adicionales (Actualizado)
- Dependencias: Gestionar correctamente la dependencia de
sw-apihaciapackages/rates. - Tipos de Datos: Es fundamental conocer la estructura exacta de los datos devueltos por
RatesControllers.pairOffersRetriever.run()para poder definir elPairOfferDtoensw-apiy realizar el filtrado correctamente. Será necesario inspeccionar el código de@sws/rateso añadir tipos compartidos, ya que la documentación enrestApiV3.jsno refleja la implementación actual. - Configuración del Controlador de Rates: La instancia importada
RatesControllers.pairOffersRetrieverya debería estar configurada (incluyendo la conexión Redis) por laPairOfferFactorydentro del paqueterates. - Manejo de Errores: Definir cómo se manejarán los errores devueltos por
RatesControllers.pairOffersRetriever.run()(ej., Redis no disponible, API Key no encontrada) en los manejadores de ruta desw-apiy cómo se traducirán a respuestas HTTP. - Filtrado para
/rest/v3/offer: La lógica de filtrado residirá en el manejador de la ruta enV3Routes.ts.
5. Próximos Pasos
- Validar este plan actualizado.
- Proceder con la implementación paso a paso según lo definido.
