Estoy tratando de aplicar múltiples validaciones a un esquema Joi que verifica el valor de dos claves y valida una clave final según el resultado.
Usando el cuerpo del ejemplo a continuación, quiero verificar el campo del canal. Esto podría ser LOCAL o GLOBAL .
{ "channel":"LOCAL", "beneficiary": { "currency": "GBP", "accountNumber": "12345678" } } Si LOCAL y la moneda del beneficiario es GBP, se debe aplicar lo siguiente: Joi.string().regex(/^[0-9]{8}$/).required()
Si GLOBAL y la moneda del beneficiario también es GBP, entonces se debe aplicar lo siguiente: Joi.string().regex(/^[AZ]{2}[0-9]{2}([0-9]|[AZ])+([0-9A-Z]+){10,31}$/).required()
Sin embargo, esto debe funcionar para una matriz de muchas posibilidades según la siguiente cantidad +n de monedas admitidas.
| ESCRIBE | DIVISA | REGEX |
|---|---|---|
| GLOBAL | Dólar estadounidense | ^[AZ]{2}[0-9]{2}([0-9]|[AZ])+([0-9A-Z]+){10,31}$ |
| LOCAL | Dólar estadounidense | ^[0-9A-Z]{1,45}$ |
| GLOBAL | GBP | ^[AZ]{2}[0-9]{2}([0-9]|[AZ])+([0-9A-Z]+){10,31}$ |
| LOCAL | GBP | ^[0-9]{8}$ |
| GLOBAL | AUD | ^[A-Za-z0-9]{0,9}$ |
| LOCAL | AUD | ^[0-9]{1,7}$ |
| GLOBAL | EUR | ^[A-Za-z0-9]+$ |
| LOCAL | EUR | ^[A-Za-z0-9]{1,50}$ |
Descubrí que puedo usar lo siguiente, pero no se escala en la matriz de posibles opciones:
accountNumber: Joi.string().when(Joi.ref('...channel', { is: 'LOCAL', then: Joi.when(Joi.ref('currency'), { is: 'GBP', then: Joi.string().regex(/^[0-9]{8}$/).required() }) })Yo usaría oneOf para este caso de uso:
{ "type": "object", "$schema": "http://json-schema.org/draft-06/schema#", "description": "JSON schema generated with JSONBuddy https://www.json-buddy.com", "oneOf": [ { "properties": { "channel": { "type": "string", "const": "GLOBAL" }, "beneficiary": { "$ref": "#/definitions/beneficiary-GLOBAL-USD" } } }, { "properties": { "channel": { "type": "string", "const": "LOCAL" }, "beneficiary": { "$ref": "#/definitions/beneficiary-LOCAL-USD" } } } ], "definitions": { "beneficiary-GLOBAL-USD": { "type": "object", "properties": { "accountNumber": { "pattern": "^[AZ]{2}[0-9]{2}([0-9]|[AZ])+([0-9A-Z]+){10,31}$" }, "currency": { "const": "USD" } } }, "beneficiary-LOCAL-USD": { "type": "object", "properties": { "accountNumber": { "pattern": "^[0-9A-Z]{1,45}$" }, "currency": { "const": "USD" } } } } } Si también coloca los subesquemas individuales como $ref en definiciones separadas, depende de usted. Pero me temo que no puedes ser mucho menos detallado.