@fiado/type-kit 3.71.0 → 3.73.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/benefitCenter/dtos/BackofficeLeafOverrideUpsertRequest.d.ts +22 -0
- package/bin/benefitCenter/dtos/BackofficeLeafOverrideUpsertRequest.js +91 -0
- package/bin/benefitCenter/dtos/FieldOverrideRequest.d.ts +19 -0
- package/bin/benefitCenter/dtos/FieldOverrideRequest.js +80 -0
- package/bin/benefitCenter/dtos/InputSchemaOverrideRequest.d.ts +9 -0
- package/bin/benefitCenter/dtos/InputSchemaOverrideRequest.js +29 -0
- package/bin/benefitCenter/enums/LeafOverrideStatusEnum.d.ts +10 -0
- package/bin/benefitCenter/enums/LeafOverrideStatusEnum.js +14 -0
- package/bin/cognitoBackofficeConnector/dtos/MfaPoolConfig.d.ts +7 -0
- package/bin/cognitoBackofficeConnector/dtos/MfaPoolConfig.js +36 -0
- package/bin/cognitoBackofficeConnector/validators/MfaTypesRequiresOne.d.ts +17 -0
- package/bin/cognitoBackofficeConnector/validators/MfaTypesRequiresOne.js +39 -0
- package/bin/cognitoConnector/dtos/SignUpBackofficeRequest.d.ts +13 -0
- package/bin/cognitoConnector/dtos/SignUpBackofficeRequest.js +71 -0
- package/bin/comission-business/dtos/GenerateReportRequest.d.ts +10 -0
- package/bin/comission-business/dtos/GenerateReportRequest.js +2 -0
- package/bin/comission-business/dtos/GenerateReportResponse.d.ts +6 -0
- package/bin/comission-business/dtos/GenerateReportResponse.js +2 -0
- package/bin/comission-business/enums/PaymentStatusEnum.d.ts +5 -0
- package/bin/comission-business/enums/PaymentStatusEnum.js +9 -0
- package/bin/credit/dtos/CreditBannerStateResponse.d.ts +10 -0
- package/bin/credit/dtos/CreditBannerStateResponse.js +6 -0
- package/bin/credit/dtos/CreditDetailResponse.d.ts +23 -0
- package/bin/credit/dtos/CreditDetailResponse.js +6 -0
- package/bin/credit/dtos/CreditEligibilityResponse.d.ts +9 -0
- package/bin/credit/dtos/CreditEligibilityResponse.js +6 -0
- package/bin/credit/dtos/CreditMovementResponse.d.ts +20 -0
- package/bin/credit/dtos/CreditMovementResponse.js +9 -0
- package/bin/credit/dtos/CreditRequestCreate.d.ts +4 -0
- package/bin/credit/dtos/CreditRequestCreate.js +26 -0
- package/bin/credit/dtos/CreditRequestResponse.d.ts +7 -0
- package/bin/credit/dtos/CreditRequestResponse.js +6 -0
- package/bin/credit/dtos/CreditScheduleResponse.d.ts +18 -0
- package/bin/credit/dtos/CreditScheduleResponse.js +9 -0
- package/bin/credit/dtos/CreditStatementResponse.d.ts +11 -0
- package/bin/credit/dtos/CreditStatementResponse.js +9 -0
- package/bin/credit/dtos/EarlyPaymentRequest.d.ts +7 -0
- package/bin/credit/dtos/EarlyPaymentRequest.js +37 -0
- package/bin/credit/dtos/EarlyPaymentResponse.d.ts +11 -0
- package/bin/credit/dtos/EarlyPaymentResponse.js +6 -0
- package/bin/credit/dtos/internal/CreditBalanceRequest.d.ts +3 -0
- package/bin/credit/dtos/internal/CreditBalanceRequest.js +21 -0
- package/bin/credit/dtos/internal/CreditCollectionRequest.d.ts +11 -0
- package/bin/credit/dtos/internal/CreditCollectionRequest.js +59 -0
- package/bin/credit/dtos/internal/CreditCollectionResponse.d.ts +12 -0
- package/bin/credit/dtos/internal/CreditCollectionResponse.js +6 -0
- package/bin/credit/dtos/internal/CreditDisbursementRequest.d.ts +7 -0
- package/bin/credit/dtos/internal/CreditDisbursementRequest.js +43 -0
- package/bin/credit/dtos/internal/CreditDisbursementResponse.d.ts +8 -0
- package/bin/credit/dtos/internal/CreditDisbursementResponse.js +6 -0
- package/bin/credit/dtos/internal/CreditProfileRequest.d.ts +3 -0
- package/bin/credit/dtos/internal/CreditProfileRequest.js +23 -0
- package/bin/credit/dtos/internal/CreditReversalRequest.d.ts +5 -0
- package/bin/credit/dtos/internal/CreditReversalRequest.js +31 -0
- package/bin/credit/dtos/internal/CreditReversalResponse.d.ts +7 -0
- package/bin/credit/dtos/internal/CreditReversalResponse.js +6 -0
- package/bin/credit/dtos/internal/CreditTransferLoancoRequest.d.ts +8 -0
- package/bin/credit/dtos/internal/CreditTransferLoancoRequest.js +46 -0
- package/bin/credit/dtos/internal/CreditTransferLoancoResponse.d.ts +8 -0
- package/bin/credit/dtos/internal/CreditTransferLoancoResponse.js +6 -0
- package/bin/credit/dtos/internal/DocumentSignRequest.d.ts +3 -0
- package/bin/credit/dtos/internal/DocumentSignRequest.js +21 -0
- package/bin/credit/dtos/internal/LienApplyRequest.d.ts +7 -0
- package/bin/credit/dtos/internal/LienApplyRequest.js +45 -0
- package/bin/credit/enums/CollectionFrequencyEnum.d.ts +5 -0
- package/bin/credit/enums/CollectionFrequencyEnum.js +9 -0
- package/bin/credit/enums/CreditOperationEnum.d.ts +11 -0
- package/bin/credit/enums/CreditOperationEnum.js +15 -0
- package/bin/credit/enums/CreditStatusEnum.d.ts +12 -0
- package/bin/credit/enums/CreditStatusEnum.js +16 -0
- package/bin/credit/enums/DelinquencyLevelEnum.d.ts +9 -0
- package/bin/credit/enums/DelinquencyLevelEnum.js +13 -0
- package/bin/credit/enums/DocumentTypeEnum.d.ts +8 -0
- package/bin/credit/enums/DocumentTypeEnum.js +12 -0
- package/bin/credit/enums/OfferStatusEnum.d.ts +8 -0
- package/bin/credit/enums/OfferStatusEnum.js +12 -0
- package/bin/credit/enums/PaymentTypeEnum.d.ts +9 -0
- package/bin/credit/enums/PaymentTypeEnum.js +13 -0
- package/bin/credit/enums/ReconciliationStatusEnum.d.ts +6 -0
- package/bin/credit/enums/ReconciliationStatusEnum.js +10 -0
- package/bin/credit/enums/TransferStatusEnum.d.ts +8 -0
- package/bin/credit/enums/TransferStatusEnum.js +12 -0
- package/bin/platformRbac/dtos/CreateTenantRequest.d.ts +2 -0
- package/bin/platformRbac/dtos/CreateTenantRequest.js +7 -0
- package/bin/platformRbac/enums/Permission.d.ts +24 -1
- package/bin/platformRbac/enums/Permission.js +24 -1
- package/bin/platformRbac/enums/TokenValidationMode.d.ts +13 -0
- package/bin/platformRbac/enums/TokenValidationMode.js +17 -0
- package/bin/platformRbac/index.d.ts +1 -0
- package/bin/platformRbac/index.js +1 -0
- package/bin/riskProfile/dtos/TransactionAlarmQueueMessage.d.ts +2 -0
- package/bin/riskProfile/dtos/TransactionAlarmQueueMessage.js +6 -0
- package/docs/superpowers/plans/2026-05-22-http-client-inversify-v8.md +243 -0
- package/docs/superpowers/specs/2026-05-22-inversify-v8-migration-design.md +191 -0
- package/package.json +1 -1
- package/src/platformRbac/dtos/CreateTenantRequest.ts +3 -1
- package/src/platformRbac/enums/Permission.ts +24 -1
- package/src/platformRbac/enums/TokenValidationMode.ts +13 -0
- package/src/platformRbac/index.ts +1 -0
- package/src/riskProfile/dtos/TransactionAlarmQueueMessage.ts +5 -0
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
# Migración a inversify v8 (última) con soporte gradual de lambdas en v6
|
|
2
|
+
|
|
3
|
+
Fecha: 2026-05-22
|
|
4
|
+
Estado: diseño aprobado (estrategia), pendiente de revisión del spec
|
|
5
|
+
Versión objetivo: inversify **8.x** (la última, hoy 8.1.0). Se salta v7; se va de v6 directo a v8.
|
|
6
|
+
|
|
7
|
+
## 1. Contexto y objetivo
|
|
8
|
+
|
|
9
|
+
Las libs compartidas (`@fiado/api-invoker`, `@fiado/gateway-adapter`,
|
|
10
|
+
`@fiado/http-client`) dependen hoy de `inversify ^6.x` como dependencia normal.
|
|
11
|
+
122 repos de lambdas las consumen y todos declaran `inversify` directamente,
|
|
12
|
+
repartidos entre el major 1 (~80 repos, `^1.x`) y el major 3 (~30, `^3.x`).
|
|
13
|
+
Las libs se publican a npm público (`registry.npmjs.org`).
|
|
14
|
+
|
|
15
|
+
**Objetivo:** subir las libs a inversify 8 y migrar las 122 lambdas **de forma
|
|
16
|
+
gradual**, manteniendo las lambdas no migradas funcionando en inversify 6,
|
|
17
|
+
incluyendo la capacidad de sacar hotfixes a las libs para esas lambdas v6.
|
|
18
|
+
|
|
19
|
+
## 2. Restricciones técnicas (la causa raíz)
|
|
20
|
+
|
|
21
|
+
- **La DI cruza la frontera lib↔lambda.** Cada lambda hace
|
|
22
|
+
`const c = new Container(); c.load(gatewayAdapterBindings); c.load(apiInvokerBindings)`
|
|
23
|
+
y además `c.bind("IHttpRequest").to(AxiosHttpRequest)`. Los `ContainerModule`
|
|
24
|
+
y las clases `@injectable` viajan desde la lib al container de la lambda.
|
|
25
|
+
- **Consecuencia:** el `ContainerModule`/decoradores producidos por la lib y el
|
|
26
|
+
`Container` de la lambda **deben ser de la misma versión de inversify**.
|
|
27
|
+
inversify 6 y 8 no se pueden mezclar en un mismo container (cambian la firma
|
|
28
|
+
del callback de `ContainerModule`, se elimina el namespace `interfaces`, y
|
|
29
|
+
cambian APIs de binding). Por eso **no existe una sola versión de lib que
|
|
30
|
+
sirva para ambos** sin un shim frágil.
|
|
31
|
+
- **Atomicidad de la migración por lambda:** una lambda no puede mezclar
|
|
32
|
+
`gateway-adapter` v6 con `api-invoker` v8. Debe subir **en un solo PR**:
|
|
33
|
+
`inversify` 6→8 + el set completo de libs que tocan su container
|
|
34
|
+
(`api-invoker`, `gateway-adapter`, `http-client`).
|
|
35
|
+
- **Ciclo entre libs:** `gateway-adapter` depende de `api-invoker` y
|
|
36
|
+
`api-invoker` depende de `gateway-adapter`. No se pueden publicar "uno a la
|
|
37
|
+
vez"; sus majors nuevos se publican coordinados (ver §5).
|
|
38
|
+
- **Libs sin inversify:** `logger` y `type-kit` no usan el container ni
|
|
39
|
+
decoradores → **no se tocan** en esta migración.
|
|
40
|
+
|
|
41
|
+
## 3. Estrategia elegida: majors paralelos (dual-track)
|
|
42
|
+
|
|
43
|
+
Sacar un **major nuevo** de cada lib del set, construido sobre inversify 8.
|
|
44
|
+
Los majors v6 actuales quedan como **línea de mantenimiento** para backports.
|
|
45
|
+
Cada lambda migra cuando le toca, en un PR atómico. Cada container en runtime
|
|
46
|
+
ve **una sola** versión de inversify.
|
|
47
|
+
|
|
48
|
+
Líneas resultantes por lib (los majors de NUESTRAS libs son independientes del
|
|
49
|
+
número de versión de inversify):
|
|
50
|
+
|
|
51
|
+
| Lib | Línea v6 (mantenimiento) | Línea v8 (nueva) |
|
|
52
|
+
|----------------|--------------------------|----------------------|
|
|
53
|
+
| http-client | 1.x | 2.0.0 |
|
|
54
|
+
| gateway-adapter| 1.x | 2.0.0 |
|
|
55
|
+
| api-invoker | 3.x | 4.0.0 |
|
|
56
|
+
| logger | — (sin cambio) | — |
|
|
57
|
+
| type-kit | — (sin cambio) | — |
|
|
58
|
+
|
|
59
|
+
(Estrategias descartadas: desacoplar las libs de inversify por completo —
|
|
60
|
+
refactor enorme incompatible con "gradual"; peerDependency + shim dual-API —
|
|
61
|
+
frágil por las diferencias de API entre v6 y v8.)
|
|
62
|
+
|
|
63
|
+
## 4. Breaking changes confirmados (v6 → v8)
|
|
64
|
+
|
|
65
|
+
Verificado contra las guías oficiales ([migrating-from-v6](https://inversify.io/docs/guides/migrating-from-v6/)
|
|
66
|
+
y [migrating-from-v7](https://inversify.io/docs/guides/migrating-from-v7/)).
|
|
67
|
+
Lo que toca este código:
|
|
68
|
+
|
|
69
|
+
1. **`ContainerModule`**: el callback recibe ahora un objeto
|
|
70
|
+
`ContainerModuleLoadOptions`; se usa `options.bind(...)`. Afecta
|
|
71
|
+
`apiInvokerBindings` y `gatewayAdapterBindings`.
|
|
72
|
+
```ts
|
|
73
|
+
// v6
|
|
74
|
+
export const apiInvokerBindings = new ContainerModule((bind: interfaces.Bind) => {
|
|
75
|
+
bind<IDirectoryApi>("IDirectoryApi").to(DirectoryApi);
|
|
76
|
+
});
|
|
77
|
+
// v8
|
|
78
|
+
export const apiInvokerBindings = new ContainerModule((options) => {
|
|
79
|
+
options.bind<IDirectoryApi>("IDirectoryApi").to(DirectoryApi);
|
|
80
|
+
});
|
|
81
|
+
```
|
|
82
|
+
2. **Namespace `interfaces` eliminado**: importar los tipos directamente.
|
|
83
|
+
`interfaces.Context → ResolutionContext`, `interfaces.Factory → Factory`,
|
|
84
|
+
`interfaces.Newable → Newable`, `interfaces.Request → BindingConstraints`.
|
|
85
|
+
Afecta `import { ContainerModule, interfaces } from "inversify"`.
|
|
86
|
+
3. **`toAutoFactory` eliminado** → reescribir con `toFactory`:
|
|
87
|
+
```ts
|
|
88
|
+
// v6 (auth-business)
|
|
89
|
+
.toAutoFactory("EventBridgeMessageSubscriber")
|
|
90
|
+
// v8
|
|
91
|
+
.toFactory((ctx) => () => ctx.get("EventBridgeMessageSubscriber"))
|
|
92
|
+
```
|
|
93
|
+
También: `toProvider → toFactory` (con función async),
|
|
94
|
+
`toConstructor → toConstantValue`, `toFunction → toConstantValue`.
|
|
95
|
+
4. **`container.load()` SIGUE SIENDO SÍNCRONO en v8** (convención "sync-first":
|
|
96
|
+
el nombre por defecto es sync, el async es `loadAsync()`). Como nuestros
|
|
97
|
+
módulos de binding son síncronos, **el patrón `const container = new
|
|
98
|
+
Container(); container.load(...); export { container }` se conserva** — NO
|
|
99
|
+
hay que volverlo async. (En v7 sí era async; v8 lo revirtió, a nuestro favor.)
|
|
100
|
+
`container.get()` también sigue síncrono.
|
|
101
|
+
5. **Opciones del `Container`**: `autoBindInjectable → autobind`;
|
|
102
|
+
`container.createChild()` → `new Container({ parent })`. Revisar usos.
|
|
103
|
+
6. **`@injectable`/`@inject` sin cambios**; nuevo `@injectFromBase` solo si una
|
|
104
|
+
clase hereda de una base injectable (revisar herencia).
|
|
105
|
+
7. **inversify 8 es ESM-only**, pero proyectos CommonJS lo consumen vía
|
|
106
|
+
`require(esm)` en **Node 20+**. ⇒ todas las lambdas deben correr en runtime
|
|
107
|
+
**Node 20.x o superior**. Verificar el runtime de cada lambda antes de migrar.
|
|
108
|
+
|
|
109
|
+
Entregable de esta fase: un **codemod / guía** reproducible para
|
|
110
|
+
`container.config.ts` (reescritura de `toAutoFactory`, import de `interfaces`,
|
|
111
|
+
firma de `ContainerModule`), ya que el patrón se repite en las 122 lambdas.
|
|
112
|
+
|
|
113
|
+
## 5. Orden de trabajo en las libs (un proyecto a la vez)
|
|
114
|
+
|
|
115
|
+
Para cada lib, antes de tocar: `git checkout develop && git pull`.
|
|
116
|
+
|
|
117
|
+
1. **http-client** (hoja, solo `@injectable` en `AxiosHttpRequest`):
|
|
118
|
+
migrar a v8, publicar **2.0.0**. dist-tag `latest` → 2.x, `legacy-v6` → 1.x.
|
|
119
|
+
2. **gateway-adapter + api-invoker** (ciclo): migrar el código de ambos a v8 en
|
|
120
|
+
ramas, desarrollando con enlaces locales (`npm link` / `file:`) para que
|
|
121
|
+
compilen uno contra otro. Publicar coordinado con prerelease:
|
|
122
|
+
- `gateway-adapter@2.0.0-rc.0` con dep `@fiado/api-invoker@^4.0.0-rc`
|
|
123
|
+
- `api-invoker@4.0.0-rc.0` con dep `@fiado/gateway-adapter@^2.0.0-rc`
|
|
124
|
+
- validar en 1 lambda piloto, luego promover a `2.0.0` / `4.0.0` finales.
|
|
125
|
+
3. **logger / type-kit**: sin cambios.
|
|
126
|
+
|
|
127
|
+
> **Publicación en espera:** no se publica ninguna lib a npm hasta terminar los
|
|
128
|
+
> cambios y tener el visto bueno explícito del usuario.
|
|
129
|
+
|
|
130
|
+
## 6. Política de branching y backport (soporte v6)
|
|
131
|
+
|
|
132
|
+
- Cortar una rama de mantenimiento por línea v6 en el último release v6:
|
|
133
|
+
`release/3.x` en api-invoker (desde 3.18.0), `release/1.x` en
|
|
134
|
+
gateway-adapter y http-client. `develop` pasa a ser la línea v8.
|
|
135
|
+
- **Hotfix que toca una lib mientras una lambda sigue en v6:**
|
|
136
|
+
1. El fix se hace en la línea natural y se hace `git cherry-pick` a la otra.
|
|
137
|
+
La mayoría de hotfixes (lógica de negocio, no inversify) tienen archivos
|
|
138
|
+
idénticos entre líneas → cherry-pick limpio.
|
|
139
|
+
2. Publicar patch en la línea v6 (ej. `3.18.1`) y, si aplica, en la nueva.
|
|
140
|
+
3. La lambda v6 (pineada `^3.x`) hace `npm update` y recibe el fix: cero
|
|
141
|
+
cambio de inversify, cero cambio en su `container.config.ts`.
|
|
142
|
+
- **Disciplina clave:** mantener el major nuevo como un **diff quirúrgico** sobre
|
|
143
|
+
v6 (tocar solo archivos que tocan inversify) para que los cherry-picks no
|
|
144
|
+
choquen.
|
|
145
|
+
- **Ventana de soporte:** se backportea **solo al último major v6** (api-invoker
|
|
146
|
+
3.x). Las ~80 lambdas aún en `^1.x` deben consolidarse a `^3` como parte de
|
|
147
|
+
(o antes de) la migración, porque hoy ya no pueden recibir fixes limpios.
|
|
148
|
+
|
|
149
|
+
## 7. Playbook de migración por lambda (gradual)
|
|
150
|
+
|
|
151
|
+
Por cada lambda, en un PR atómico:
|
|
152
|
+
|
|
153
|
+
1. `inversify` 6→8 y `reflect-metadata` a la versión alineada.
|
|
154
|
+
2. Subir el set de libs nuevas: `api-invoker` `^4`, `gateway-adapter` `^2`,
|
|
155
|
+
`http-client` `^2`.
|
|
156
|
+
3. Aplicar el codemod/guía a `container.config.ts`: reescribir `toAutoFactory`
|
|
157
|
+
→ `toFactory`, ajustar imports del namespace `interfaces`. El patrón
|
|
158
|
+
síncrono `export { container }` **no cambia** (load/get siguen sync en v8).
|
|
159
|
+
4. Verificar que el runtime de la lambda sea **Node ≥20** (inversify 8 ESM-only).
|
|
160
|
+
5. Correr tests + smoke test del handler. Merge y deploy.
|
|
161
|
+
|
|
162
|
+
Las lambdas no migradas siguen en v6 sin cambios.
|
|
163
|
+
|
|
164
|
+
## 8. Riesgos
|
|
165
|
+
|
|
166
|
+
- **Divergencia de líneas v6/v8** si el major nuevo refactoriza de más →
|
|
167
|
+
mitigado con el "diff quirúrgico".
|
|
168
|
+
- **Ciclo api-invoker↔gateway-adapter** en el publish → mitigado con prerelease
|
|
169
|
+
rc + dist-tags.
|
|
170
|
+
- **Cola de migración larga** (122 lambdas) → mantener línea v6 viva y priorizar
|
|
171
|
+
consolidar los `^1.x` a `^3.x`.
|
|
172
|
+
- **Runtime Node <20**: inversify 8 es ESM-only; lambdas en Node 18 o menor no
|
|
173
|
+
podrán hacer `require(esm)`. Mitigación: auditar y subir a Node 20+ el runtime
|
|
174
|
+
de cada lambda como prerrequisito de su PR de migración.
|
|
175
|
+
- **Saltar v7→v8 directo** acumula breaking changes; mitigado validando lib por
|
|
176
|
+
lib con su smoke test antes de avanzar. (El cambio más riesgoso de v7 —`load`
|
|
177
|
+
async— quedó revertido en v8, así que el bootstrap síncrono se conserva.)
|
|
178
|
+
|
|
179
|
+
## 9. Criterios de éxito
|
|
180
|
+
|
|
181
|
+
- http-client@2, gateway-adapter@2, api-invoker@4 construidos sobre inversify 8
|
|
182
|
+
y validados en 1 lambda piloto (publicación pendiente de visto bueno).
|
|
183
|
+
- Línea v6 (`release/*`) capaz de recibir y publicar un hotfix backporteado.
|
|
184
|
+
- Guía/codemod de `container.config.ts` documentada y reutilizable.
|
|
185
|
+
- Lambdas no migradas siguen desplegando sin cambios.
|
|
186
|
+
|
|
187
|
+
## Seguridad (fuera de alcance, pero a atender)
|
|
188
|
+
|
|
189
|
+
`fiado-api-invoker/.npmrc` contiene un token de publicación de npm en texto
|
|
190
|
+
plano. Si está versionado, debe **revocarse/rotarse** en npmjs.com y moverse a
|
|
191
|
+
una variable de entorno / secret de CI.
|
package/package.json
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Expose } from 'class-transformer';
|
|
2
|
-
import { IsBoolean, IsEmail, IsInt, IsOptional, IsString, Matches, Min } from 'class-validator';
|
|
2
|
+
import { IsBoolean, IsEmail, IsEnum, IsInt, IsOptional, IsString, Matches, Min } from 'class-validator';
|
|
3
|
+
import { TokenValidationMode } from '../enums/TokenValidationMode';
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* Input del POST backoffice de creación de tenant (F-11 — onboarding de tenant en SureKeep).
|
|
@@ -17,4 +18,5 @@ export class CreateTenantRequest {
|
|
|
17
18
|
@Expose() @IsString() region!: string;
|
|
18
19
|
@Expose() @IsOptional() @IsBoolean() mfaRequired?: boolean;
|
|
19
20
|
@Expose() @IsOptional() @IsInt() @Min(8) passwordMinLength?: number;
|
|
21
|
+
@Expose() @IsOptional() @IsEnum(TokenValidationMode) tokenValidationMode?: TokenValidationMode;
|
|
20
22
|
}
|
|
@@ -6,7 +6,25 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Copy-paste literal de los valores del spec (DEC-003).
|
|
8
8
|
* Convención: `<category>.<resource>.<action>` (snake_case en action si multi-palabra).
|
|
9
|
-
*
|
|
9
|
+
*
|
|
10
|
+
* ⚠️ ESTE ES EL CATÁLOGO GLOBAL Y ÚNICO. Todo permiso del sistema vive acá. Los tenants
|
|
11
|
+
* NO inventan permisos: cada `tenantType` arma su lista (techo) ELIGIENDO de este catálogo
|
|
12
|
+
* (`TenantTypePermissionCatalog_GT` en platform-rbac-business, DEC-062), y cada tenant arma
|
|
13
|
+
* sus roles combinando esos permisos. El vocabulario es global; lo que varía por tenant es
|
|
14
|
+
* QUÉ permisos usa, no CUÁLES existen.
|
|
15
|
+
*
|
|
16
|
+
* ⚠️⚠️ AL AGREGAR / QUITAR / RENOMBRAR UN PERMISO — PROCEDIMIENTO OBLIGATORIO:
|
|
17
|
+
* 1. Agregar el valor a ESTE enum.
|
|
18
|
+
* 2. Agregarlo TAMBIÉN al FINAL de `PERMISSION_BIT_ORDER` (abajo) — append-only, NUNCA en
|
|
19
|
+
* el medio ni reordenando: ese array define el bit de cada permiso en el token (bitset).
|
|
20
|
+
* Reordenar/insertar en medio desalinea TODOS los tokens ya emitidos (escalada/pérdida
|
|
21
|
+
* de permisos silenciosa). Un permiso deprecado CONSERVA su posición (no se borra del array).
|
|
22
|
+
* 3. Recién entonces un `tenantType` puede incluirlo en su lista. Un permiso que NO esté en
|
|
23
|
+
* este enum + bit-order NO tiene bit → no viaja en el token (el gateway-adapter no lo ve).
|
|
24
|
+
* 4. `PERMS_VERSION` (hash del orden) cambia solo → bump minor del type-kit + redeploy de
|
|
25
|
+
* consumers (jwt-inyector-trigger, gateway-adapter, platform-rbac-business). Tokens viejos
|
|
26
|
+
* caen al fallback (resolver DDB) hasta refrescar — by-design, no rompe.
|
|
27
|
+
* El test `permissionBits.test.ts` falla si el enum y `PERMISSION_BIT_ORDER` se desincronizan.
|
|
10
28
|
*
|
|
11
29
|
* Coexiste con módulo `rbac/` oficial cuando yhonhansen publique componente 01 — TD-RBAC-002.
|
|
12
30
|
*/
|
|
@@ -143,6 +161,11 @@ export enum Permission {
|
|
|
143
161
|
* Índice de cada permiso = su posición de bit. NUNCA reordenar ni borrar:
|
|
144
162
|
* deprecados CONSERVAN su posición; los nuevos van SIEMPRE al final.
|
|
145
163
|
* Derivado explícitamente (no Object.values, frágil ante edición del enum).
|
|
164
|
+
*
|
|
165
|
+
* ⚠️ Si agregás un permiso al enum `Permission` (arriba), agregalo TAMBIÉN acá, AL FINAL.
|
|
166
|
+
* Ver el procedimiento completo en el JSDoc del enum `Permission`. El test
|
|
167
|
+
* `permissionBits.test.ts` rompe si esto y el enum no coinciden, y el snapshot del orden
|
|
168
|
+
* completo rompe si reordenás (guard anti-desalineamiento de tokens emitidos).
|
|
146
169
|
*/
|
|
147
170
|
export const PERMISSION_BIT_ORDER: readonly Permission[] = [
|
|
148
171
|
Permission.RBAC_CATALOG_MANAGE,
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Modo de validación de tokens por tenant (DEC-RBAC-002 del rbac-authorizer-trigger).
|
|
3
|
+
* Persistido como atributo no-key en PlatformTenantConfig_GT. Los valores string SON el
|
|
4
|
+
* contrato: el authorizer los espeja con un tipo local (no depende de type-kit, DT-7).
|
|
5
|
+
* - OFFLINE: solo firma (JWKS) + permsEpoch. Default. No pega a Cognito.
|
|
6
|
+
* - ONLINE_PREFERRED: AdminGetUser; negativo definitivo → Deny; fallo de infra → cae a offline.
|
|
7
|
+
* - ONLINE_STRICT: AdminGetUser; negativo definitivo O fallo de infra → Deny (fail-closed, regulado).
|
|
8
|
+
*/
|
|
9
|
+
export enum TokenValidationMode {
|
|
10
|
+
OFFLINE = 'offline',
|
|
11
|
+
ONLINE_PREFERRED = 'online_preferred',
|
|
12
|
+
ONLINE_STRICT = 'online_strict',
|
|
13
|
+
}
|
|
@@ -26,6 +26,7 @@ export type { EffectivePermissionsResponse } from './dtos/EffectivePermissionsRe
|
|
|
26
26
|
// Fase 1 — Custom Auth Challenge (Email OTP + TOTP) + MFA self-service.
|
|
27
27
|
// Class values (no type-only) — los DTOs llevan decoradores class-validator y se hidratan con plainToInstance en runtime.
|
|
28
28
|
export * from './enums/MfaMethodEnum';
|
|
29
|
+
export * from './enums/TokenValidationMode';
|
|
29
30
|
export * from './enums/ChallengeNameEnum';
|
|
30
31
|
export * from './auth/DefineNextChallengeRequest';
|
|
31
32
|
export * from './auth/DefineNextChallengeResponse';
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { IsNotEmpty, IsNumber, IsOptional, IsString } from "class-validator";
|
|
2
2
|
import { OperationEnum } from "../../transaction";
|
|
3
|
+
import { ProductSubtypeEnum } from "../../productCatalog";
|
|
3
4
|
|
|
4
5
|
|
|
5
6
|
|
|
@@ -37,6 +38,10 @@ export class TransactionAlarmQueueMessage {
|
|
|
37
38
|
@IsNotEmpty()
|
|
38
39
|
transactionType: string
|
|
39
40
|
|
|
41
|
+
@IsString()
|
|
42
|
+
@IsOptional()
|
|
43
|
+
subType?: ProductSubtypeEnum
|
|
44
|
+
|
|
40
45
|
@IsString()
|
|
41
46
|
@IsNotEmpty()
|
|
42
47
|
id: string
|