Traducción de
docs/en/onboarding/development-guide.md, que es el original. Si discrepan, manda el inglés.
#Antes de tocar código
- Lee
.agents/README.mdy el enlace de la aplicación que vayas a tocar. - Si hay un contrato de proveedor de por medio, lee
contracts/<proveedor>/ydocs/en/fidelity/<proveedor>.mdantes de implementar. - Encuentra el módulo dueño que ya existe y su prueba análoga más cercana.
- Mira
git status --shorty conserva los cambios locales que no vengan al caso.
El repositorio es modular pero no es DDD, a propósito. No introduzcas
agregados, eventos de dominio, interfaces de repositorio ni una división
application/domain/infrastructure para implementar una funcionalidad corriente.
#Elegir el sitio correcto
| Cambio | Va aquí |
|---|---|
| Ruta, validación de petición o respuesta de un proveedor | apps/api/src/providers/<id>/ |
| Regla compartida por todos los proveedores | apps/api/src/core/ o el módulo compartido dueño |
| Estado de un pago o escritura de varios pasos | apps/api/src/modules/payments/ |
| Movimiento contable | apps/api/src/modules/ledger/ |
| Funcionalidad del plano de control | apps/api/src/modules/<área>/ |
| Modelo de base de datos | apps/api/src/infrastructure/database/entities/ (aplazamiento actual) |
| Cambio de esquema | Un fichero nuevo en apps/api/src/infrastructure/database/migrations/ |
| Funcionalidad de la consola | apps/console/app/modules/<área>/ + página fina y ruta de Nitro si hacen falta |
| Comportamiento compartido de la consola | apps/console/app/core/ |
| Interfaz neutral del checkout | apps/checkout/app/components/ |
| Identidad o flujo de un proveedor en el checkout | apps/checkout/providers/<id>/ |
| Escenario propio | scenarios/<proveedor>/<nombre>.json |
#Añadir un endpoint al backend
Para el plano de control:
- Añade o reutiliza un DTO en el
dto/del módulo dueño cuando escriba datos. Los DTO usanclass-validator; no repitas a mano en el controlador la misma validación. - Añade la ruta al controlador dueño. Declara
RolesGuardyApplicationScopeGuardigual que sus rutas hermanas. - El comportamiento, las transacciones y la persistencia van en el servicio.
- Para un listado, usa
ListQueryDtoypaginate()/paginateArray(). Declara listas explícitas desortable,filterableysearchable. - Añade una prueba de integración. Si los datos tienen alcance por fila, incluye
a alguien de otro inquilino y espera
404. - Si la consola lo necesita, añade la ruta de Nitro más estrecha que valga; nunca llames a la API de NestJS desde el navegador.
El controlador comodín de la pasarela se registra el último en AppModule.
Los módulos nuevos del plano de control tienen que quedar antes de
GatewayModule, o el comodín puede capturar sus rutas.
#Cambiar una operación de un proveedor
Empieza por la especificación oficial del proveedor y su documento de fidelidad. Después:
- Toca sólo los ficheros de ruta, contrato y traducción de ese proveedor.
- Mantén las operaciones canónicas dentro de
CANONICAL_OPERATIONS. Si el proveedor exige de verdad una operación universal nueva, eso es un cambio de arquitectura: actualiza el contrato y las pruebas compartidas a conciencia. - No inyectes servicios en el plugin. Traduce a un
IntentCommandy deja quePaymentsServicehaga la escritura. - Actualiza los casos de conformidad estática y de comportamiento, y las pruebas con el SDK oficial donde el SDK pueda apuntar al emulador.
- Actualiza
docs/en/fidelity/<proveedor>.md, incluidas las limitaciones.
Para un proveedor entero nuevo, sigue Añadir un proveedor.
#Añadir o cambiar un escenario
Edita sólo el JSON canónico bajo scenarios/ y luego corre:
npm run scenario:compile
Eso regenera apps/api/src/modules/scenarios/default-scenarios.ts. El build, el
typecheck y las pruebas también compilan los escenarios antes, pero correr la
orden a mano da un error de validación más claro.
Usa un then.outcome canónico; el vocabulario del proveedor va sólo en
then.wire, y sólo cuando el estado exacto de ese proveedor sea el propósito de
la prueba. No se admite código arbitrario. Ver
Escenarios para el DSL soportado y sus carencias.
#Añadir una entidad o un campo
-
Cambia o añade la entidad en
apps/api/src/infrastructure/database/entities/y expórtala desdeentities/index.tscuando el descubrimiento lo requiera. -
Añade una migración nueva y ordenada. No reescribas una migración que ya pueda haber corrido.
-
Aplícala contra una base desechable:
npm run migrate -
Ejercita el
down:npm run migrate -- --down, y despuésnpm run migrateotra vez. Una vuelta atrás que nadie corre es una vuelta atrás que no funciona. -
Añade una prueba de integración que dependa del esquema nuevo; que compile no demuestra que la migración y la entidad estén de acuerdo.
Las columnas de dinero usan unidades mínimas enteras. Los cuerpos que varían por proveedor usan JSONB sólo en la frontera del proveedor/recurso o en metadatos declarados. Nunca añadas una columna de saldo mutable.
#Añadir una funcionalidad a la consola
El camino normal es:
página/componente -> modelo y columnas del módulo -> gateway/composable de core
-> ruta de Nitro -> endpoint del plano de control
Reutiliza createRestGateway, useEntityCollection y RTable en vez de montar
query strings o cachés en una página. Las credenciales se quedan en el servidor,
en Nitro. Corre npm run typecheck y npm run build: los problemas de
auto-importación y de resolución en SSR de Nuxt a veces sólo se ven en una
compilación de verdad.
Lo que posee cada pieza de core/ está en la consola.
#Añadir una funcionalidad al checkout
Decide si es neutral o es identidad de un proveedor:
- El resumen, el desenlace y la disposición del armazón van en
apps/checkout/app/components/. - Los textos, la disposición y el flujo propios de un proveedor van en
apps/checkout/providers/<id>/. - El acceso a la API va por
apps/checkout/server/api/yserver/utils/api.ts.
No instales ni reutilices la capa PrimeVue de la consola. Nunca aceptes un identificador de cliente desde el cuerpo de la confirmación para elegir cartera; esa identidad es de la sesión del checkout.
#Añadir una prueba
- Transformación pura o invariante:
apps/api/test/*.spec.ts. - Base de datos, HTTP, autorización o concurrencia:
apps/api/test/integration/. - Garantía para todos los proveedores: parametriza la suite de conformidad.
- Comportamiento de un SDK: un spec propio, con telemetría y red desactivadas.
- Aceptación de producto entero: amplía
scripts/stack-smoke.mjssólo para un camino crítico entre aplicaciones.
Ver Pruebas para las órdenes y cómo se comporta el arnés.
#Definición de terminado
Desde la raíz del repositorio:
npm run typecheck
npm run lint
npm test
npm run build
npm run smoke
Si el cambio toca migraciones, sesiones, rutas de Nitro, el worker o un flujo entre aplicaciones, además:
docker compose up --build --wait
npm run smoke:stack
Antes de entregar, comprueba los enlaces de la documentación y confirma que cada ruta, orden, variable de entorno y endpoint mencionado sigue existiendo.