@fiado/type-kit 3.486.0 → 3.488.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/_test_/unit/cognitoBackofficeConnector/dtos/CreatePoolClientRequest.test.ts +55 -0
- package/_test_/unit/cognitoBackofficeConnector/dtos/CreateUserRequest.primaryVerified.test.ts +23 -0
- package/_test_/unit/collection/disburseRequest.test.ts +92 -0
- package/_test_/unit/collection/disbursementType.test.ts +19 -0
- package/_test_/unit/platformRbac/apiUser/apiUserDtos.test.ts +56 -0
- package/_test_/unit/platformRbac/enums/AccountType.test.ts +11 -0
- package/_test_/unit/platformRbac/enums/__snapshots__/permissionBits.test.ts.snap +2 -1
- package/_test_/unit/platformRbac/enums/apiUserPermission.test.ts +11 -0
- package/bin/cognitoBackofficeConnector/dtos/AppClientConfig.d.ts +8 -7
- package/bin/cognitoBackofficeConnector/dtos/AppClientConfig.js +23 -10
- package/bin/cognitoBackofficeConnector/dtos/CreatePoolClientRequest.d.ts +6 -0
- package/bin/cognitoBackofficeConnector/dtos/CreatePoolClientRequest.js +31 -0
- package/bin/cognitoBackofficeConnector/dtos/CreatePoolClientResponse.d.ts +4 -0
- package/bin/cognitoBackofficeConnector/dtos/CreatePoolClientResponse.js +7 -0
- package/bin/cognitoBackofficeConnector/dtos/CreateUserRequest.d.ts +2 -0
- package/bin/cognitoBackofficeConnector/dtos/CreateUserRequest.js +6 -0
- package/bin/cognitoBackofficeConnector/index.d.ts +2 -0
- package/bin/cognitoBackofficeConnector/index.js +2 -0
- package/bin/collection/dtos/DisburseRequest.d.ts +20 -0
- package/bin/collection/dtos/DisburseRequest.js +64 -0
- package/bin/collection/dtos/DisburseResponse.d.ts +4 -0
- package/bin/collection/dtos/DisburseResponse.js +22 -0
- package/bin/collection/enums/DisbursementType.d.ts +7 -0
- package/bin/collection/enums/DisbursementType.js +11 -0
- package/bin/collection/index.d.ts +3 -0
- package/bin/collection/index.js +3 -0
- package/bin/platformRbac/apiUser/ApiLoginRequest.d.ts +6 -0
- package/bin/platformRbac/apiUser/ApiLoginRequest.js +36 -0
- package/bin/platformRbac/apiUser/ApiLoginResponse.d.ts +6 -0
- package/bin/platformRbac/apiUser/ApiLoginResponse.js +7 -0
- package/bin/platformRbac/apiUser/ApiUserWhoamiResponse.d.ts +7 -0
- package/bin/platformRbac/apiUser/ApiUserWhoamiResponse.js +7 -0
- package/bin/platformRbac/apiUser/CreateApiUserRequest.d.ts +8 -0
- package/bin/platformRbac/apiUser/CreateApiUserRequest.js +45 -0
- package/bin/platformRbac/apiUser/CreateApiUserResponse.d.ts +9 -0
- package/bin/platformRbac/apiUser/CreateApiUserResponse.js +7 -0
- package/bin/platformRbac/apiUser/RotateApiUserSecretResponse.d.ts +5 -0
- package/bin/platformRbac/apiUser/RotateApiUserSecretResponse.js +7 -0
- package/bin/platformRbac/apiUser/UpdateApiUserAccessRequest.d.ts +5 -0
- package/bin/platformRbac/apiUser/UpdateApiUserAccessRequest.js +33 -0
- package/bin/platformRbac/enums/AccountType.d.ts +5 -0
- package/bin/platformRbac/enums/AccountType.js +9 -0
- package/bin/platformRbac/enums/Permission.d.ts +2 -1
- package/bin/platformRbac/enums/Permission.js +3 -0
- package/bin/platformRbac/enums/PrincipalKind.d.ts +3 -1
- package/bin/platformRbac/enums/PrincipalKind.js +2 -0
- package/bin/platformRbac/index.d.ts +8 -0
- package/bin/platformRbac/index.js +11 -1
- package/package.json +1 -1
- package/src/cognitoBackofficeConnector/dtos/AppClientConfig.ts +20 -10
- package/src/cognitoBackofficeConnector/dtos/CreatePoolClientRequest.ts +9 -0
- package/src/cognitoBackofficeConnector/dtos/CreatePoolClientResponse.ts +4 -0
- package/src/cognitoBackofficeConnector/dtos/CreateUserRequest.ts +2 -0
- package/src/cognitoBackofficeConnector/index.ts +2 -0
- package/src/collection/dtos/DisburseRequest.ts +30 -0
- package/src/collection/dtos/DisburseResponse.ts +6 -0
- package/src/collection/enums/DisbursementType.ts +7 -0
- package/src/collection/index.ts +3 -0
- package/src/platformRbac/apiUser/ApiLoginRequest.ts +9 -0
- package/src/platformRbac/apiUser/ApiLoginResponse.ts +6 -0
- package/src/platformRbac/apiUser/ApiUserWhoamiResponse.ts +7 -0
- package/src/platformRbac/apiUser/CreateApiUserRequest.ts +11 -0
- package/src/platformRbac/apiUser/CreateApiUserResponse.ts +10 -0
- package/src/platformRbac/apiUser/RotateApiUserSecretResponse.ts +5 -0
- package/src/platformRbac/apiUser/UpdateApiUserAccessRequest.ts +8 -0
- package/src/platformRbac/enums/AccountType.ts +5 -0
- package/src/platformRbac/enums/Permission.ts +3 -0
- package/src/platformRbac/enums/PrincipalKind.ts +2 -0
- package/src/platformRbac/index.ts +10 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { plainToInstance } from 'class-transformer';
|
|
3
|
+
import { validate } from 'class-validator';
|
|
4
|
+
import { CreatePoolClientRequest } from '../../../../src/cognitoBackofficeConnector/dtos/CreatePoolClientRequest';
|
|
5
|
+
import { AppClientConfig } from '../../../../src/cognitoBackofficeConnector/dtos/AppClientConfig';
|
|
6
|
+
|
|
7
|
+
const CLIENT = {
|
|
8
|
+
clientName: 'us-east-1_abc-api-client',
|
|
9
|
+
explicitAuthFlows: ['ALLOW_ADMIN_USER_PASSWORD_AUTH'],
|
|
10
|
+
tokenValidityUnits: 'minutes',
|
|
11
|
+
accessTokenValidity: 15,
|
|
12
|
+
idTokenValidity: 15,
|
|
13
|
+
refreshTokenValidity: 60,
|
|
14
|
+
preventUserExistenceErrors: true,
|
|
15
|
+
enableTokenRevocation: true,
|
|
16
|
+
writeAttributes: ['name'],
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
describe('CreatePoolClientRequest (reutiliza AppClientConfig)', () => {
|
|
20
|
+
it('acepta el client de API completo', async () => {
|
|
21
|
+
expect(await validate(plainToInstance(CreatePoolClientRequest, { region: 'us-east-1', appClientConfig: CLIENT }))).toEqual([]);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it('exige region', async () => {
|
|
25
|
+
const errors = await validate(plainToInstance(CreatePoolClientRequest, { region: '', appClientConfig: CLIENT }));
|
|
26
|
+
expect(errors.some((e) => e.property === 'region')).toBe(true);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('valida el AppClientConfig anidado', async () => {
|
|
30
|
+
const errors = await validate(plainToInstance(CreatePoolClientRequest, { region: 'us-east-1', appClientConfig: { ...CLIENT, explicitAuthFlows: ['ALLOW_INVENTADO'] } }));
|
|
31
|
+
expect(errors.some((e) => e.property === 'appClientConfig')).toBe(true);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
describe('AppClientConfig endurecido', () => {
|
|
36
|
+
it('acepta los flujos que usa el onboarding', async () => {
|
|
37
|
+
const dto = plainToInstance(AppClientConfig, { explicitAuthFlows: ['ALLOW_ADMIN_USER_PASSWORD_AUTH', 'ALLOW_CUSTOM_AUTH', 'ALLOW_REFRESH_TOKEN_AUTH'], refreshTokenValidity: 30 });
|
|
38
|
+
expect(await validate(dto)).toEqual([]);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('rechaza un flujo desconocido', async () => {
|
|
42
|
+
const errors = await validate(plainToInstance(AppClientConfig, { explicitAuthFlows: ['ALLOW_INVENTADO'] }));
|
|
43
|
+
expect(errors.some((e) => e.property === 'explicitAuthFlows')).toBe(true);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it('rechaza una unidad de vigencia desconocida', async () => {
|
|
47
|
+
const errors = await validate(plainToInstance(AppClientConfig, { explicitAuthFlows: ['ALLOW_ADMIN_USER_PASSWORD_AUTH'], tokenValidityUnits: 'weeks' }));
|
|
48
|
+
expect(errors.some((e) => e.property === 'tokenValidityUnits')).toBe(true);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it('acepta writeAttributes', async () => {
|
|
52
|
+
const errors = await validate(plainToInstance(AppClientConfig, { explicitAuthFlows: ['ALLOW_ADMIN_USER_PASSWORD_AUTH'], writeAttributes: ['name'] }));
|
|
53
|
+
expect(errors).toEqual([]);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { plainToInstance } from 'class-transformer';
|
|
3
|
+
import { validate } from 'class-validator';
|
|
4
|
+
import { CreateUserRequest } from '../../../../src/cognitoBackofficeConnector/dtos/CreateUserRequest';
|
|
5
|
+
|
|
6
|
+
describe('CreateUserRequest.primaryIdentifierVerified', () => {
|
|
7
|
+
const base = { userPoolId: 'us-east-1_p', region: 'us-east-1', email: 'api-1@api.surekeep.invalid', tenantId: 'surekeep' };
|
|
8
|
+
|
|
9
|
+
it('es opcional', async () => {
|
|
10
|
+
expect(await validate(plainToInstance(CreateUserRequest, base))).toEqual([]);
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
it('acepta false', async () => {
|
|
14
|
+
const dto = plainToInstance(CreateUserRequest, { ...base, primaryIdentifierVerified: false });
|
|
15
|
+
expect(await validate(dto)).toEqual([]);
|
|
16
|
+
expect(dto.primaryIdentifierVerified).toBe(false);
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
it('rechaza un valor no booleano', async () => {
|
|
20
|
+
const errors = await validate(plainToInstance(CreateUserRequest, { ...base, primaryIdentifierVerified: 'no' }));
|
|
21
|
+
expect(errors.some((e) => e.property === 'primaryIdentifierVerified')).toBe(true);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { plainToInstance } from 'class-transformer';
|
|
3
|
+
import { validate } from 'class-validator';
|
|
4
|
+
import { Collection } from '../../../src/index';
|
|
5
|
+
import { DisburseRequest, DisburseResponse } from '../../../src/collection/index';
|
|
6
|
+
|
|
7
|
+
const VALID = {
|
|
8
|
+
tenantId: 'surekeep',
|
|
9
|
+
domain: 'retail-wizard-business',
|
|
10
|
+
directoryId: 'dir-1',
|
|
11
|
+
disbursementType: 'MEX_BONUS',
|
|
12
|
+
amount: 25.5,
|
|
13
|
+
currencyId: 'MXN',
|
|
14
|
+
idempotencyKey: '01M0JT2KQCN9QGA7PE3C34Q37E',
|
|
15
|
+
concept: 'Bono de bienvenida SureKeep',
|
|
16
|
+
reference: '01M0JT2KQCN9QGA7PE3C34Q37E',
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
async function invalidProperties(body: Record<string, unknown>): Promise<string[]> {
|
|
20
|
+
const dto = plainToInstance(DisburseRequest, body);
|
|
21
|
+
return (await validate(dto as object)).map((e) => e.property);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
describe('DisburseRequest', () => {
|
|
25
|
+
it('acepta una dispersión válida', async () => {
|
|
26
|
+
expect(await invalidProperties(VALID)).toEqual([]);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('reference es opcional', async () => {
|
|
30
|
+
const { reference: _omit, ...withoutReference } = VALID;
|
|
31
|
+
expect(await invalidProperties(withoutReference)).toEqual([]);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it.each(['tenantId', 'domain', 'directoryId', 'idempotencyKey', 'concept'])(
|
|
35
|
+
'rechaza %s vacío',
|
|
36
|
+
async (field) => {
|
|
37
|
+
expect(await invalidProperties({ ...VALID, [field]: '' })).toContain(field);
|
|
38
|
+
},
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
it.each(['tenantId', 'domain', 'directoryId', 'disbursementType', 'amount', 'currencyId', 'idempotencyKey', 'concept'])(
|
|
42
|
+
'rechaza si falta %s',
|
|
43
|
+
async (field) => {
|
|
44
|
+
const body: Record<string, unknown> = { ...VALID };
|
|
45
|
+
delete body[field];
|
|
46
|
+
expect(await invalidProperties(body)).toContain(field);
|
|
47
|
+
},
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
it('rechaza un tipo de dispersión desconocido', async () => {
|
|
51
|
+
expect(await invalidProperties({ ...VALID, disbursementType: 'USD_BONUS' })).toContain('disbursementType');
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it('rechaza cualquier moneda distinta de MXN', async () => {
|
|
55
|
+
expect(await invalidProperties({ ...VALID, currencyId: 'USD' })).toContain('currencyId');
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it.each([0, -1, 10.005, '25'])('rechaza el monto %p', async (amount) => {
|
|
59
|
+
expect(await invalidProperties({ ...VALID, amount })).toContain('amount');
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it('acepta pesos con dos decimales', async () => {
|
|
63
|
+
expect(await invalidProperties({ ...VALID, amount: 19.99 })).toEqual([]);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it('rechaza una llave con #, que chocaría con los executionId del motor', async () => {
|
|
67
|
+
expect(await invalidProperties({ ...VALID, idempotencyKey: 'SALE#42' })).toContain('idempotencyKey');
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it('rechaza un concepto de más de 120 caracteres, el tope del processor', async () => {
|
|
71
|
+
expect(await invalidProperties({ ...VALID, concept: 'x'.repeat(121) })).toContain('concept');
|
|
72
|
+
expect(await invalidProperties({ ...VALID, concept: 'x'.repeat(120) })).toEqual([]);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('rechaza strings que no son string', async () => {
|
|
76
|
+
expect(await invalidProperties({ ...VALID, directoryId: 42, reference: 7 })).toEqual(
|
|
77
|
+
expect.arrayContaining(['directoryId', 'reference']),
|
|
78
|
+
);
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
it('sale por el index raíz', () => {
|
|
82
|
+
expect(new Collection.DisburseRequest()).toBeInstanceOf(DisburseRequest);
|
|
83
|
+
expect(new Collection.DisburseResponse()).toBeInstanceOf(DisburseResponse);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
describe('DisburseResponse', () => {
|
|
88
|
+
it('acepta un folio o null', async () => {
|
|
89
|
+
expect(await validate(plainToInstance(DisburseResponse, { transactionId: 'TX-1' }) as object)).toHaveLength(0);
|
|
90
|
+
expect(await validate(plainToInstance(DisburseResponse, { transactionId: null }) as object)).toHaveLength(0);
|
|
91
|
+
});
|
|
92
|
+
});
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { Collection } from '../../../src/index';
|
|
3
|
+
import { DisbursementType } from '../../../src/collection/index';
|
|
4
|
+
|
|
5
|
+
describe('DisbursementType', () => {
|
|
6
|
+
it('v1 solo trae el riel MEX_BONUS', () => {
|
|
7
|
+
expect(Object.values(DisbursementType)).toEqual(['MEX_BONUS']);
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
it('cada clave es igual a su valor', () => {
|
|
11
|
+
for (const [key, value] of Object.entries(DisbursementType)) {
|
|
12
|
+
expect(key).toBe(value);
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it('sale por el index raíz', () => {
|
|
17
|
+
expect(Collection.DisbursementType.MEX_BONUS).toBe('MEX_BONUS');
|
|
18
|
+
});
|
|
19
|
+
});
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { plainToInstance } from 'class-transformer';
|
|
3
|
+
import { validate } from 'class-validator';
|
|
4
|
+
import {
|
|
5
|
+
AccountType,
|
|
6
|
+
ApiLoginRequest,
|
|
7
|
+
CreateApiUserRequest,
|
|
8
|
+
UpdateApiUserAccessRequest,
|
|
9
|
+
} from '../../../../src/platformRbac';
|
|
10
|
+
|
|
11
|
+
describe('ApiLoginRequest', () => {
|
|
12
|
+
const valid = { clientId: '0b9f1c2e-1111-4222-8333-444455556666', clientSecret: 's3cr3t', tenantId: 'surekeep' };
|
|
13
|
+
|
|
14
|
+
it('acepta el body completo', async () => {
|
|
15
|
+
expect(await validate(plainToInstance(ApiLoginRequest, valid))).toEqual([]);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it.each(['clientId', 'clientSecret', 'tenantId'])('exige %s', async (field) => {
|
|
19
|
+
const errors = await validate(plainToInstance(ApiLoginRequest, { ...valid, [field]: '' }));
|
|
20
|
+
expect(errors.some((e) => e.property === field)).toBe(true);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
describe('CreateApiUserRequest', () => {
|
|
25
|
+
const valid = { accountType: AccountType.API, displayName: 'La Central', technicalContact: 'ops@central.mx', ipAllowlist: ['189.128.0.0/16'] };
|
|
26
|
+
|
|
27
|
+
it('acepta el alta completa', async () => {
|
|
28
|
+
expect(await validate(plainToInstance(CreateApiUserRequest, valid))).toEqual([]);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it('exige accountType API', async () => {
|
|
32
|
+
const errors = await validate(plainToInstance(CreateApiUserRequest, { ...valid, accountType: 'HUMAN' }));
|
|
33
|
+
expect(errors.some((e) => e.property === 'accountType')).toBe(true);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('exige displayName', async () => {
|
|
37
|
+
const errors = await validate(plainToInstance(CreateApiUserRequest, { ...valid, displayName: '' }));
|
|
38
|
+
expect(errors.some((e) => e.property === 'displayName')).toBe(true);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('exige una lista de IPs no vacía', async () => {
|
|
42
|
+
const errors = await validate(plainToInstance(CreateApiUserRequest, { ...valid, ipAllowlist: [] }));
|
|
43
|
+
expect(errors.some((e) => e.property === 'ipAllowlist')).toBe(true);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
describe('UpdateApiUserAccessRequest', () => {
|
|
48
|
+
it('acepta solo IPs', async () => {
|
|
49
|
+
expect(await validate(plainToInstance(UpdateApiUserAccessRequest, { ipAllowlist: ['10.0.0.0/8'] }))).toEqual([]);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it('rechaza una lista vacía', async () => {
|
|
53
|
+
const errors = await validate(plainToInstance(UpdateApiUserAccessRequest, { ipAllowlist: [] }));
|
|
54
|
+
expect(errors.some((e) => e.property === 'ipAllowlist')).toBe(true);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { AccountType, PrincipalKind } from '../../../../src/platformRbac';
|
|
2
|
+
|
|
3
|
+
describe('AccountType y PrincipalKind (usuarios de API)', () => {
|
|
4
|
+
it('AccountType tiene exactamente HUMAN y API', () => {
|
|
5
|
+
expect(Object.values(AccountType)).toEqual(['HUMAN', 'API']);
|
|
6
|
+
});
|
|
7
|
+
|
|
8
|
+
it('PrincipalKind suma API_USER al final sin tocar los existentes', () => {
|
|
9
|
+
expect(Object.values(PrincipalKind)).toEqual(['USER', 'INTEGRATION', 'API_USER']);
|
|
10
|
+
});
|
|
11
|
+
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
|
|
2
2
|
|
|
3
|
-
exports[`PERMISSION_BIT_ORDER PERMS_VERSION es número estable 1`] = `
|
|
3
|
+
exports[`PERMISSION_BIT_ORDER PERMS_VERSION es número estable 1`] = `2686516275`;
|
|
4
4
|
|
|
5
5
|
exports[`PERMISSION_BIT_ORDER append-only: snapshot del ORDEN COMPLETO (rompe ante cualquier reorden/inserción) 1`] = `
|
|
6
6
|
[
|
|
@@ -95,5 +95,6 @@ exports[`PERMISSION_BIT_ORDER append-only: snapshot del ORDEN COMPLETO (rompe an
|
|
|
95
95
|
"platform.integration.key.issue",
|
|
96
96
|
"platform.integration.key.revoke",
|
|
97
97
|
"tenant.integration.diagnostic",
|
|
98
|
+
"tenant.api_user.manage",
|
|
98
99
|
]
|
|
99
100
|
`;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Permission, PERMISSION_BIT_ORDER } from '../../../../src/platformRbac/enums/Permission';
|
|
2
|
+
|
|
3
|
+
describe('Permiso de administración de usuarios de API', () => {
|
|
4
|
+
it('existe con la llave tenant.api_user.manage', () => {
|
|
5
|
+
expect(Permission.TENANT_API_USER_MANAGE).toBe('tenant.api_user.manage');
|
|
6
|
+
});
|
|
7
|
+
|
|
8
|
+
it('va al FINAL del orden de bits (append-only)', () => {
|
|
9
|
+
expect(PERMISSION_BIT_ORDER[PERMISSION_BIT_ORDER.length - 1]).toBe(Permission.TENANT_API_USER_MANAGE);
|
|
10
|
+
});
|
|
11
|
+
});
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
+
/** Flujos de autenticación que Cognito admite en un app client. */
|
|
2
|
+
export declare const COGNITO_EXPLICIT_AUTH_FLOWS: readonly string[];
|
|
3
|
+
/** Unidades de vigencia de token; el conector aplica una sola a los tres tokens. */
|
|
4
|
+
export declare const COGNITO_TOKEN_VALIDITY_UNITS: readonly string[];
|
|
1
5
|
/**
|
|
2
|
-
* Config
|
|
3
|
-
*
|
|
4
|
-
* NO expone `generateSecret` — el connector hardcodea `GenerateSecret: false`
|
|
5
|
-
* en el SDK call (BFF pattern: rbac llama al connector server-to-server vía
|
|
6
|
-
* api-invoker en VPC, sin SPA-to-Cognito directo que requiera client secret).
|
|
7
|
-
* Decisión arquitectónica A21 del connector. Si aparece consumer B2B/M2M con
|
|
8
|
-
* flow `client_credentials`, evaluar con líder + bump major del connector.
|
|
6
|
+
* Config de un app client (el del pool nuevo de POST /pools o uno extra de POST /pools/{id}/clients).
|
|
7
|
+
* Sin `generateSecret`: el conector fija GenerateSecret false (A21).
|
|
9
8
|
*/
|
|
10
9
|
export declare class AppClientConfig {
|
|
11
10
|
clientName?: string;
|
|
@@ -16,4 +15,6 @@ export declare class AppClientConfig {
|
|
|
16
15
|
refreshTokenValidity?: number;
|
|
17
16
|
preventUserExistenceErrors?: boolean;
|
|
18
17
|
enableTokenRevocation?: boolean;
|
|
18
|
+
/** Atributos que el usuario puede escribir con su propio token. Ausente ⇒ todos (default de Cognito). */
|
|
19
|
+
writeAttributes?: string[];
|
|
19
20
|
}
|
|
@@ -9,17 +9,23 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
9
9
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.AppClientConfig = void 0;
|
|
12
|
+
exports.AppClientConfig = exports.COGNITO_TOKEN_VALIDITY_UNITS = exports.COGNITO_EXPLICIT_AUTH_FLOWS = void 0;
|
|
13
13
|
const class_transformer_1 = require("class-transformer");
|
|
14
14
|
const class_validator_1 = require("class-validator");
|
|
15
|
+
/** Flujos de autenticación que Cognito admite en un app client. */
|
|
16
|
+
exports.COGNITO_EXPLICIT_AUTH_FLOWS = [
|
|
17
|
+
'ALLOW_ADMIN_USER_PASSWORD_AUTH',
|
|
18
|
+
'ALLOW_CUSTOM_AUTH',
|
|
19
|
+
'ALLOW_USER_PASSWORD_AUTH',
|
|
20
|
+
'ALLOW_USER_SRP_AUTH',
|
|
21
|
+
'ALLOW_REFRESH_TOKEN_AUTH',
|
|
22
|
+
'ALLOW_USER_AUTH',
|
|
23
|
+
];
|
|
24
|
+
/** Unidades de vigencia de token; el conector aplica una sola a los tres tokens. */
|
|
25
|
+
exports.COGNITO_TOKEN_VALIDITY_UNITS = ['seconds', 'minutes', 'hours', 'days'];
|
|
15
26
|
/**
|
|
16
|
-
* Config
|
|
17
|
-
*
|
|
18
|
-
* NO expone `generateSecret` — el connector hardcodea `GenerateSecret: false`
|
|
19
|
-
* en el SDK call (BFF pattern: rbac llama al connector server-to-server vía
|
|
20
|
-
* api-invoker en VPC, sin SPA-to-Cognito directo que requiera client secret).
|
|
21
|
-
* Decisión arquitectónica A21 del connector. Si aparece consumer B2B/M2M con
|
|
22
|
-
* flow `client_credentials`, evaluar con líder + bump major del connector.
|
|
27
|
+
* Config de un app client (el del pool nuevo de POST /pools o uno extra de POST /pools/{id}/clients).
|
|
28
|
+
* Sin `generateSecret`: el conector fija GenerateSecret false (A21).
|
|
23
29
|
*/
|
|
24
30
|
class AppClientConfig {
|
|
25
31
|
}
|
|
@@ -33,13 +39,13 @@ __decorate([
|
|
|
33
39
|
__decorate([
|
|
34
40
|
(0, class_transformer_1.Expose)(),
|
|
35
41
|
(0, class_validator_1.IsArray)(),
|
|
36
|
-
(0, class_validator_1.
|
|
42
|
+
(0, class_validator_1.IsIn)(exports.COGNITO_EXPLICIT_AUTH_FLOWS, { each: true }),
|
|
37
43
|
__metadata("design:type", Array)
|
|
38
44
|
], AppClientConfig.prototype, "explicitAuthFlows", void 0);
|
|
39
45
|
__decorate([
|
|
40
46
|
(0, class_transformer_1.Expose)(),
|
|
41
47
|
(0, class_validator_1.IsOptional)(),
|
|
42
|
-
(0, class_validator_1.
|
|
48
|
+
(0, class_validator_1.IsIn)(exports.COGNITO_TOKEN_VALIDITY_UNITS),
|
|
43
49
|
__metadata("design:type", String)
|
|
44
50
|
], AppClientConfig.prototype, "tokenValidityUnits", void 0);
|
|
45
51
|
__decorate([
|
|
@@ -72,3 +78,10 @@ __decorate([
|
|
|
72
78
|
(0, class_validator_1.IsBoolean)(),
|
|
73
79
|
__metadata("design:type", Boolean)
|
|
74
80
|
], AppClientConfig.prototype, "enableTokenRevocation", void 0);
|
|
81
|
+
__decorate([
|
|
82
|
+
(0, class_transformer_1.Expose)(),
|
|
83
|
+
(0, class_validator_1.IsOptional)(),
|
|
84
|
+
(0, class_validator_1.IsArray)(),
|
|
85
|
+
(0, class_validator_1.IsString)({ each: true }),
|
|
86
|
+
__metadata("design:type", Array)
|
|
87
|
+
], AppClientConfig.prototype, "writeAttributes", void 0);
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.CreatePoolClientRequest = void 0;
|
|
13
|
+
const class_transformer_1 = require("class-transformer");
|
|
14
|
+
const class_validator_1 = require("class-validator");
|
|
15
|
+
const AppClientConfig_1 = require("./AppClientConfig");
|
|
16
|
+
/** Body de POST /pools/{userPoolId}/clients: un app client extra sobre un pool existente. */
|
|
17
|
+
class CreatePoolClientRequest {
|
|
18
|
+
}
|
|
19
|
+
exports.CreatePoolClientRequest = CreatePoolClientRequest;
|
|
20
|
+
__decorate([
|
|
21
|
+
(0, class_transformer_1.Expose)(),
|
|
22
|
+
(0, class_validator_1.IsString)(),
|
|
23
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
24
|
+
__metadata("design:type", String)
|
|
25
|
+
], CreatePoolClientRequest.prototype, "region", void 0);
|
|
26
|
+
__decorate([
|
|
27
|
+
(0, class_transformer_1.Expose)(),
|
|
28
|
+
(0, class_validator_1.ValidateNested)(),
|
|
29
|
+
(0, class_transformer_1.Type)(() => AppClientConfig_1.AppClientConfig),
|
|
30
|
+
__metadata("design:type", AppClientConfig_1.AppClientConfig)
|
|
31
|
+
], CreatePoolClientRequest.prototype, "appClientConfig", void 0);
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CreatePoolClientResponse = void 0;
|
|
4
|
+
/** Respuesta de POST /pools/{userPoolId}/clients. Sin secret: el client nace con GenerateSecret false. */
|
|
5
|
+
class CreatePoolClientResponse {
|
|
6
|
+
}
|
|
7
|
+
exports.CreatePoolClientResponse = CreatePoolClientResponse;
|
|
@@ -10,4 +10,6 @@ export declare class CreateUserRequest {
|
|
|
10
10
|
tenantId: string;
|
|
11
11
|
temporaryPassword?: string;
|
|
12
12
|
suppressInvitationEmail?: boolean;
|
|
13
|
+
/** Ausente ⇒ true. false crea el identificador primario sin verificar (usuario de API). */
|
|
14
|
+
primaryIdentifierVerified?: boolean;
|
|
13
15
|
}
|
|
@@ -69,3 +69,9 @@ __decorate([
|
|
|
69
69
|
(0, class_validator_1.IsBoolean)(),
|
|
70
70
|
__metadata("design:type", Boolean)
|
|
71
71
|
], CreateUserRequest.prototype, "suppressInvitationEmail", void 0);
|
|
72
|
+
__decorate([
|
|
73
|
+
(0, class_transformer_1.Expose)(),
|
|
74
|
+
(0, class_validator_1.IsOptional)(),
|
|
75
|
+
(0, class_validator_1.IsBoolean)(),
|
|
76
|
+
__metadata("design:type", Boolean)
|
|
77
|
+
], CreateUserRequest.prototype, "primaryIdentifierVerified", void 0);
|
|
@@ -49,6 +49,8 @@ export * from './dtos/AppClientConfig';
|
|
|
49
49
|
export * from './dtos/CreatePoolRequest';
|
|
50
50
|
export * from './dtos/CreatePoolResponse';
|
|
51
51
|
export * from './dtos/DeletePoolRequest';
|
|
52
|
+
export * from './dtos/CreatePoolClientRequest';
|
|
53
|
+
export * from './dtos/CreatePoolClientResponse';
|
|
52
54
|
export * from './enums/IntrospectFailReason';
|
|
53
55
|
export * from './dtos/IntrospectRequest';
|
|
54
56
|
export * from './dtos/IntrospectResponse';
|
|
@@ -65,6 +65,8 @@ __exportStar(require("./dtos/AppClientConfig"), exports);
|
|
|
65
65
|
__exportStar(require("./dtos/CreatePoolRequest"), exports);
|
|
66
66
|
__exportStar(require("./dtos/CreatePoolResponse"), exports);
|
|
67
67
|
__exportStar(require("./dtos/DeletePoolRequest"), exports);
|
|
68
|
+
__exportStar(require("./dtos/CreatePoolClientRequest"), exports);
|
|
69
|
+
__exportStar(require("./dtos/CreatePoolClientResponse"), exports);
|
|
68
70
|
// Introspección de token (POST /auth/introspect) — consumido por el platform-rbac-business.
|
|
69
71
|
__exportStar(require("./enums/IntrospectFailReason"), exports);
|
|
70
72
|
__exportStar(require("./dtos/IntrospectRequest"), exports);
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { CurrencyId } from '../../currency/enums/CurrencyId';
|
|
2
|
+
import { DisbursementType } from '../enums/DisbursementType';
|
|
3
|
+
/** Dispersión síncrona: el motor deposita `amount` pesos al titular por el riel de `disbursementType`. */
|
|
4
|
+
export declare class DisburseRequest {
|
|
5
|
+
tenantId: string;
|
|
6
|
+
/** Quién llama. Solo viaja a los logs; no es control de acceso. */
|
|
7
|
+
domain: string;
|
|
8
|
+
/** Titular que recibe el depósito. */
|
|
9
|
+
directoryId: string;
|
|
10
|
+
disbursementType: DisbursementType;
|
|
11
|
+
/** Pesos con hasta dos decimales, no centavos. */
|
|
12
|
+
amount: number;
|
|
13
|
+
currencyId: CurrencyId;
|
|
14
|
+
/** Única entre todas las operaciones del processor; el motor la reenvía intacta. Sin `#`. */
|
|
15
|
+
idempotencyKey: string;
|
|
16
|
+
/** Texto que ve el titular en su movimiento. 120 es el tope del processor. */
|
|
17
|
+
concept: string;
|
|
18
|
+
/** Id del llamador para rastreo: asiento, crédito. */
|
|
19
|
+
reference?: string;
|
|
20
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.DisburseRequest = void 0;
|
|
13
|
+
const class_validator_1 = require("class-validator");
|
|
14
|
+
const CurrencyId_1 = require("../../currency/enums/CurrencyId");
|
|
15
|
+
const DisbursementType_1 = require("../enums/DisbursementType");
|
|
16
|
+
/** Dispersión síncrona: el motor deposita `amount` pesos al titular por el riel de `disbursementType`. */
|
|
17
|
+
class DisburseRequest {
|
|
18
|
+
}
|
|
19
|
+
exports.DisburseRequest = DisburseRequest;
|
|
20
|
+
__decorate([
|
|
21
|
+
(0, class_validator_1.IsString)(),
|
|
22
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
23
|
+
__metadata("design:type", String)
|
|
24
|
+
], DisburseRequest.prototype, "tenantId", void 0);
|
|
25
|
+
__decorate([
|
|
26
|
+
(0, class_validator_1.IsString)(),
|
|
27
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
28
|
+
__metadata("design:type", String)
|
|
29
|
+
], DisburseRequest.prototype, "domain", void 0);
|
|
30
|
+
__decorate([
|
|
31
|
+
(0, class_validator_1.IsString)(),
|
|
32
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
33
|
+
__metadata("design:type", String)
|
|
34
|
+
], DisburseRequest.prototype, "directoryId", void 0);
|
|
35
|
+
__decorate([
|
|
36
|
+
(0, class_validator_1.IsEnum)(DisbursementType_1.DisbursementType),
|
|
37
|
+
__metadata("design:type", String)
|
|
38
|
+
], DisburseRequest.prototype, "disbursementType", void 0);
|
|
39
|
+
__decorate([
|
|
40
|
+
(0, class_validator_1.IsNumber)({ maxDecimalPlaces: 2 }),
|
|
41
|
+
(0, class_validator_1.IsPositive)(),
|
|
42
|
+
__metadata("design:type", Number)
|
|
43
|
+
], DisburseRequest.prototype, "amount", void 0);
|
|
44
|
+
__decorate([
|
|
45
|
+
(0, class_validator_1.IsIn)([CurrencyId_1.CurrencyId.MXN]),
|
|
46
|
+
__metadata("design:type", String)
|
|
47
|
+
], DisburseRequest.prototype, "currencyId", void 0);
|
|
48
|
+
__decorate([
|
|
49
|
+
(0, class_validator_1.IsString)(),
|
|
50
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
51
|
+
(0, class_validator_1.Matches)(/^[^#]+$/),
|
|
52
|
+
__metadata("design:type", String)
|
|
53
|
+
], DisburseRequest.prototype, "idempotencyKey", void 0);
|
|
54
|
+
__decorate([
|
|
55
|
+
(0, class_validator_1.IsString)(),
|
|
56
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
57
|
+
(0, class_validator_1.MaxLength)(120),
|
|
58
|
+
__metadata("design:type", String)
|
|
59
|
+
], DisburseRequest.prototype, "concept", void 0);
|
|
60
|
+
__decorate([
|
|
61
|
+
(0, class_validator_1.IsOptional)(),
|
|
62
|
+
(0, class_validator_1.IsString)(),
|
|
63
|
+
__metadata("design:type", String)
|
|
64
|
+
], DisburseRequest.prototype, "reference", void 0);
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.DisburseResponse = void 0;
|
|
13
|
+
const class_validator_1 = require("class-validator");
|
|
14
|
+
/** Folio del processor; `null` cuando aprobó sin devolverlo y el llamador decide cómo cerrar. */
|
|
15
|
+
class DisburseResponse {
|
|
16
|
+
}
|
|
17
|
+
exports.DisburseResponse = DisburseResponse;
|
|
18
|
+
__decorate([
|
|
19
|
+
(0, class_validator_1.IsOptional)(),
|
|
20
|
+
(0, class_validator_1.IsString)(),
|
|
21
|
+
__metadata("design:type", String)
|
|
22
|
+
], DisburseResponse.prototype, "transactionId", void 0);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DisbursementType = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Riel por el que el motor de cobro deposita una dispersión. Nombra el movimiento, no el propósito:
|
|
6
|
+
* el propósito lo manda el llamador en `concept`.
|
|
7
|
+
*/
|
|
8
|
+
var DisbursementType;
|
|
9
|
+
(function (DisbursementType) {
|
|
10
|
+
DisbursementType["MEX_BONUS"] = "MEX_BONUS";
|
|
11
|
+
})(DisbursementType || (exports.DisbursementType = DisbursementType = {}));
|
|
@@ -10,6 +10,7 @@ export * from './enums/CollectionFeeMode';
|
|
|
10
10
|
export * from './enums/RetryIntentStatus';
|
|
11
11
|
export * from './enums/AckIntentStatus';
|
|
12
12
|
export * from './enums/RedriveOutboxStatus';
|
|
13
|
+
export * from './enums/DisbursementType';
|
|
13
14
|
export * from './dtos/PendingChargeDto';
|
|
14
15
|
export * from './dtos/CollectRequest';
|
|
15
16
|
export * from './dtos/CollectResponse';
|
|
@@ -27,6 +28,8 @@ export * from './dtos/RegisterCollectibleResponse';
|
|
|
27
28
|
export * from './dtos/CollectionPricingDto';
|
|
28
29
|
export * from './dtos/ResolvePendingChargesRequest';
|
|
29
30
|
export * from './dtos/MoneyInEvent';
|
|
31
|
+
export * from './dtos/DisburseRequest';
|
|
32
|
+
export * from './dtos/DisburseResponse';
|
|
30
33
|
export * from './dtos/CollectionIntentSummaryDto';
|
|
31
34
|
export * from './dtos/CollectionAttemptDto';
|
|
32
35
|
export * from './dtos/CollectionOutboxEventDto';
|
package/bin/collection/index.js
CHANGED
|
@@ -27,6 +27,7 @@ __exportStar(require("./enums/CollectionFeeMode"), exports);
|
|
|
27
27
|
__exportStar(require("./enums/RetryIntentStatus"), exports);
|
|
28
28
|
__exportStar(require("./enums/AckIntentStatus"), exports);
|
|
29
29
|
__exportStar(require("./enums/RedriveOutboxStatus"), exports);
|
|
30
|
+
__exportStar(require("./enums/DisbursementType"), exports);
|
|
30
31
|
// DTOs
|
|
31
32
|
__exportStar(require("./dtos/PendingChargeDto"), exports);
|
|
32
33
|
__exportStar(require("./dtos/CollectRequest"), exports);
|
|
@@ -45,6 +46,8 @@ __exportStar(require("./dtos/RegisterCollectibleResponse"), exports);
|
|
|
45
46
|
__exportStar(require("./dtos/CollectionPricingDto"), exports);
|
|
46
47
|
__exportStar(require("./dtos/ResolvePendingChargesRequest"), exports);
|
|
47
48
|
__exportStar(require("./dtos/MoneyInEvent"), exports);
|
|
49
|
+
__exportStar(require("./dtos/DisburseRequest"), exports);
|
|
50
|
+
__exportStar(require("./dtos/DisburseResponse"), exports);
|
|
48
51
|
// DTOs — backoffice de monitoreo
|
|
49
52
|
__exportStar(require("./dtos/CollectionIntentSummaryDto"), exports);
|
|
50
53
|
__exportStar(require("./dtos/CollectionAttemptDto"), exports);
|