@fiado/type-kit 3.420.0 → 3.422.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/messagesConnector/MdmNotifyQueueMessageRequest.test.ts +136 -0
- package/_test_/unit/messagesConnector/messagingEnums.test.ts +2 -1
- package/_test_/unit/whatsappConnector/ConnectorSendMessageRequest.test.ts +97 -0
- package/_test_/unit/whatsappConnector/ConnectorSendMessageResponse.test.ts +16 -0
- package/_test_/unit/whatsappConnector/SelectedProvider.test.ts +39 -0
- package/bin/index.d.ts +1 -0
- package/bin/index.js +3 -2
- package/bin/messagesConnector/dtos/MdmNotifyQueueMessageRequest.d.ts +16 -0
- package/bin/messagesConnector/dtos/MdmNotifyQueueMessageRequest.js +47 -0
- package/bin/messagesConnector/enums/DeliveryChannelExtendedEnum.d.ts +3 -1
- package/bin/messagesConnector/enums/DeliveryChannelExtendedEnum.js +2 -0
- package/bin/messagesConnector/index.d.ts +1 -0
- package/bin/messagesConnector/index.js +1 -0
- package/bin/whatsappConnector/dtos/ConnectorSendMessageRequest.d.ts +20 -0
- package/bin/whatsappConnector/dtos/ConnectorSendMessageRequest.js +59 -0
- package/bin/whatsappConnector/dtos/ConnectorSendMessageResponse.d.ts +9 -0
- package/bin/whatsappConnector/dtos/ConnectorSendMessageResponse.js +30 -0
- package/bin/whatsappConnector/dtos/SelectedProvider.d.ts +17 -0
- package/bin/whatsappConnector/dtos/SelectedProvider.js +45 -0
- package/bin/whatsappConnector/index.d.ts +3 -0
- package/bin/whatsappConnector/index.js +19 -0
- package/package.json +1 -1
- package/src/index.ts +1 -0
- package/src/messagesConnector/dtos/MdmNotifyQueueMessageRequest.ts +37 -0
- package/src/messagesConnector/enums/DeliveryChannelExtendedEnum.ts +2 -0
- package/src/messagesConnector/index.ts +1 -0
- package/src/whatsappConnector/dtos/ConnectorSendMessageRequest.ts +28 -0
- package/src/whatsappConnector/dtos/ConnectorSendMessageResponse.ts +13 -0
- package/src/whatsappConnector/dtos/SelectedProvider.ts +23 -0
- package/src/whatsappConnector/index.ts +3 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { plainToInstance } from 'class-transformer';
|
|
3
|
+
import { validate, ValidationError } from 'class-validator';
|
|
4
|
+
import { MdmNotifyItem } from '../../../src/messagesConnector/dtos/MdmNotifyItem';
|
|
5
|
+
import { MdmNotifyQueueMessageRequest } from '../../../src/messagesConnector/dtos/MdmNotifyQueueMessageRequest';
|
|
6
|
+
import * as MessagesConnectorBarrel from '../../../src/messagesConnector/index';
|
|
7
|
+
import { DeviceNotifyIntensityEnum } from '../../../src/mdm/enums/DeviceNotifyIntensityEnum';
|
|
8
|
+
import { MdmNoticeTypeEnum } from '../../../src/mdm/enums/MdmNoticeTypeEnum';
|
|
9
|
+
import { MdmProviderEnum } from '../../../src/mdm/enums/MdmProviderEnum';
|
|
10
|
+
import { MDM_NOTIFY_MAX_BATCH } from '../../../src/messagesConnector/constants/MdmNotifyBatchLimits';
|
|
11
|
+
|
|
12
|
+
/** ULID real del motor: así genera los creditId `loan-credit-business`. */
|
|
13
|
+
const CREDIT_ID = '01M0B5D7FQA3T06K4REEVPRM33';
|
|
14
|
+
|
|
15
|
+
const validItem = {
|
|
16
|
+
imei: '351756051523999',
|
|
17
|
+
creditId: CREDIT_ID,
|
|
18
|
+
provider: MdmProviderEnum.TRUSTONIC,
|
|
19
|
+
noticeType: MdmNoticeTypeEnum.OVERDUE_1_DAY,
|
|
20
|
+
intensity: DeviceNotifyIntensityEnum.BANNER,
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
/** Lote de `size` equipos con imei distinto: el lote real nunca repite imei. */
|
|
24
|
+
const batchOf = (size: number): Record<string, unknown>[] =>
|
|
25
|
+
Array.from({ length: size }, (_unused, index) => ({ ...validItem, imei: `35175605152${String(index).padStart(4, '0')}` }));
|
|
26
|
+
|
|
27
|
+
const validMessage = {
|
|
28
|
+
items: [validItem],
|
|
29
|
+
operationReference: 'mdm-notify-2026-09-08-0001',
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
/** True si el error de `property` trae ese constraint puntual (no solo "algo falló"). */
|
|
33
|
+
const hasConstraint = (errors: ValidationError[], property: string, constraint: string): boolean =>
|
|
34
|
+
errors.some((e) => e.property === property && Boolean(e.constraints?.[constraint]));
|
|
35
|
+
|
|
36
|
+
const validateMessage = async (payload: Record<string, unknown>): Promise<ValidationError[]> =>
|
|
37
|
+
validate(plainToInstance(MdmNotifyQueueMessageRequest, { ...validMessage, ...payload }));
|
|
38
|
+
|
|
39
|
+
describe('MdmNotifyQueueMessageRequest', () => {
|
|
40
|
+
it('valida el mensaje mínimo de la cola', async () => {
|
|
41
|
+
expect(await validateMessage({})).toEqual([]);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it('valida sin tenantId: messages-business asume FIADO', async () => {
|
|
45
|
+
const dto = plainToInstance(MdmNotifyQueueMessageRequest, validMessage);
|
|
46
|
+
expect(await validate(dto)).toEqual([]);
|
|
47
|
+
expect(dto.tenantId).toBeUndefined();
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('valida con tenantId explícito', async () => {
|
|
51
|
+
expect(await validateMessage({ tenantId: 'SUREKEEP' })).toEqual([]);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it('falla si tenantId viene vacío: ausente cae a FIADO, pero "" no es un tenant', async () => {
|
|
55
|
+
expect(hasConstraint(await validateMessage({ tenantId: '' }), 'tenantId', 'isNotEmpty')).toBe(true);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it('falla si el lote viene vacío', async () => {
|
|
59
|
+
expect(hasConstraint(await validateMessage({ items: [] }), 'items', 'arrayNotEmpty')).toBe(true);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it('falla si items no es un arreglo', async () => {
|
|
63
|
+
expect(hasConstraint(await validateMessage({ items: 'nada' }), 'items', 'isArray')).toBe(true);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it('falla si items no viaja', async () => {
|
|
67
|
+
const { items: _omitted, ...rest } = validMessage;
|
|
68
|
+
const errors = await validate(plainToInstance(MdmNotifyQueueMessageRequest, rest));
|
|
69
|
+
expect(hasConstraint(errors, 'items', 'arrayNotEmpty')).toBe(true);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it('falla si dos ítems repiten el mismo imei: el equipo recibiría el aviso dos veces y el acuse colapsa en uno', async () => {
|
|
73
|
+
expect(hasConstraint(await validateMessage({ items: [validItem, validItem] }), 'items', 'arrayUnique')).toBe(true);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it('acepta el lote completo hasta el tope', async () => {
|
|
77
|
+
expect(await validateMessage({ items: batchOf(MDM_NOTIFY_MAX_BATCH) })).toEqual([]);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it('falla si el lote excede el tope de equipos', async () => {
|
|
81
|
+
const errors = await validateMessage({ items: batchOf(MDM_NOTIFY_MAX_BATCH + 1) });
|
|
82
|
+
expect(hasConstraint(errors, 'items', 'arrayMaxSize')).toBe(true);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it('el tope del lote es el mismo que el del endpoint HTTP que reemplaza', () => {
|
|
86
|
+
expect(MDM_NOTIFY_MAX_BATCH).toBe(500);
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it('falla si operationReference no viaja', async () => {
|
|
90
|
+
const { operationReference: _omitted, ...rest } = validMessage;
|
|
91
|
+
const errors = await validate(plainToInstance(MdmNotifyQueueMessageRequest, rest));
|
|
92
|
+
expect(hasConstraint(errors, 'operationReference', 'isNotEmpty')).toBe(true);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it('falla si operationReference viene vacío', async () => {
|
|
96
|
+
expect(hasConstraint(await validateMessage({ operationReference: '' }), 'operationReference', 'isNotEmpty')).toBe(true);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it('falla si operationReference excede el largo máximo', async () => {
|
|
100
|
+
const errors = await validateMessage({ operationReference: 'x'.repeat(65) });
|
|
101
|
+
expect(hasConstraint(errors, 'operationReference', 'maxLength')).toBe(true);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it('acepta operationReference justo en el largo máximo', async () => {
|
|
105
|
+
expect(await validateMessage({ operationReference: 'x'.repeat(64) })).toEqual([]);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it('falla si un ítem trae un provider fuera del enum', async () => {
|
|
109
|
+
const errors = await validateMessage({ items: [{ ...validItem, provider: 'AIRDROID' }] });
|
|
110
|
+
const children = errors.find((e) => e.property === 'items')?.children ?? [];
|
|
111
|
+
expect(hasConstraint(children[0]?.children ?? [], 'provider', 'isEnum')).toBe(true);
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
it('falla si un ítem trae un noticeType fuera del catálogo', async () => {
|
|
115
|
+
const errors = await validateMessage({ items: [{ ...validItem, noticeType: 'OVERDUE_99_DAYS' }] });
|
|
116
|
+
const children = errors.find((e) => e.property === 'items')?.children ?? [];
|
|
117
|
+
expect(hasConstraint(children[0]?.children ?? [], 'noticeType', 'isEnum')).toBe(true);
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it('falla si un ítem trae un creditId que no es ULID', async () => {
|
|
121
|
+
const errors = await validateMessage({ items: [{ ...validItem, creditId: 'no-es-ulid' }] });
|
|
122
|
+
const children = errors.find((e) => e.property === 'items')?.children ?? [];
|
|
123
|
+
expect(hasConstraint(children[0]?.children ?? [], 'creditId', 'matches')).toBe(true);
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it('materializa los ítems como MdmNotifyItem', () => {
|
|
127
|
+
const dto = plainToInstance(MdmNotifyQueueMessageRequest, validMessage);
|
|
128
|
+
expect(dto.items[0]).toBeInstanceOf(MdmNotifyItem);
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
describe('barrel de messagesConnector', () => {
|
|
133
|
+
it('exporta el mensaje de cola de avisos MDM', () => {
|
|
134
|
+
expect(MessagesConnectorBarrel.MdmNotifyQueueMessageRequest).toBe(MdmNotifyQueueMessageRequest);
|
|
135
|
+
});
|
|
136
|
+
});
|
|
@@ -2,12 +2,13 @@ import 'reflect-metadata';
|
|
|
2
2
|
import { DeliveryChannelExtendedEnum, MessagingSlotEnum } from '../../../src/messagesConnector/index';
|
|
3
3
|
|
|
4
4
|
describe('DeliveryChannelExtendedEnum', () => {
|
|
5
|
-
it('incluye MDM junto a los tres canales que ya existían', () => {
|
|
5
|
+
it('incluye MDM y WHATSAPP junto a los tres canales que ya existían', () => {
|
|
6
6
|
expect(Object.values(DeliveryChannelExtendedEnum).sort()).toEqual([
|
|
7
7
|
'MAIL',
|
|
8
8
|
'MDM',
|
|
9
9
|
'PUSH_NOTIFICATION',
|
|
10
10
|
'SMS',
|
|
11
|
+
'WHATSAPP',
|
|
11
12
|
]);
|
|
12
13
|
});
|
|
13
14
|
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { plainToInstance } from 'class-transformer';
|
|
3
|
+
import { validate } from 'class-validator';
|
|
4
|
+
import { ConnectorSendMessageRequest } from '../../../src/whatsappConnector/dtos/ConnectorSendMessageRequest';
|
|
5
|
+
import { DeliveryChannelExtendedEnum } from '../../../src/messagesConnector/index';
|
|
6
|
+
|
|
7
|
+
const base = {
|
|
8
|
+
channelType: DeliveryChannelExtendedEnum.WHATSAPP,
|
|
9
|
+
destination: '+525512345678',
|
|
10
|
+
language: 'es',
|
|
11
|
+
tenantId: 'surekeep',
|
|
12
|
+
messageType: 'OTP_CODE',
|
|
13
|
+
selectedProvider: {
|
|
14
|
+
templateId: 'otp_code',
|
|
15
|
+
senderId: '1234567890',
|
|
16
|
+
contentVariables: { '1': '123456' },
|
|
17
|
+
secretRef: 'whatsapp-surekeep-credentials',
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const errorsOn = async (payload: Record<string, unknown>, property: string) => {
|
|
22
|
+
const dto = plainToInstance(ConnectorSendMessageRequest, { ...base, ...payload });
|
|
23
|
+
const errors = await validate(dto);
|
|
24
|
+
return errors.filter((e) => e.property === property);
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
describe('ConnectorSendMessageRequest', () => {
|
|
28
|
+
it('acepta el contrato completo', async () => {
|
|
29
|
+
expect(await validate(plainToInstance(ConnectorSendMessageRequest, base))).toEqual([]);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
describe('channelType', () => {
|
|
33
|
+
it('acepta un valor del enum', async () => {
|
|
34
|
+
expect(await errorsOn({ channelType: DeliveryChannelExtendedEnum.WHATSAPP }, 'channelType')).toHaveLength(0);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it('rechaza un valor fuera del enum', async () => {
|
|
38
|
+
expect(await errorsOn({ channelType: 'TELEGRAM' }, 'channelType')).not.toHaveLength(0);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('rechaza el vacío', async () => {
|
|
42
|
+
expect(await errorsOn({ channelType: '' }, 'channelType')).not.toHaveLength(0);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('rechaza la ausencia', async () => {
|
|
46
|
+
expect(await errorsOn({ channelType: undefined }, 'channelType')).not.toHaveLength(0);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
describe('destination', () => {
|
|
51
|
+
it('acepta un destino válido', async () => {
|
|
52
|
+
expect(await errorsOn({ destination: '+525512345678' }, 'destination')).toHaveLength(0);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('rechaza el vacío', async () => {
|
|
56
|
+
expect(await errorsOn({ destination: '' }, 'destination')).not.toHaveLength(0);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it('rechaza la ausencia', async () => {
|
|
60
|
+
expect(await errorsOn({ destination: undefined }, 'destination')).not.toHaveLength(0);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
describe('language', () => {
|
|
65
|
+
it('rechaza el vacío', async () => {
|
|
66
|
+
expect(await errorsOn({ language: '' }, 'language')).not.toHaveLength(0);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it('rechaza la ausencia', async () => {
|
|
70
|
+
expect(await errorsOn({ language: undefined }, 'language')).not.toHaveLength(0);
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
describe('tenantId', () => {
|
|
75
|
+
it('rechaza el vacío', async () => {
|
|
76
|
+
expect(await errorsOn({ tenantId: '' }, 'tenantId')).not.toHaveLength(0);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it('rechaza la ausencia', async () => {
|
|
80
|
+
expect(await errorsOn({ tenantId: undefined }, 'tenantId')).not.toHaveLength(0);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
describe('selectedProvider', () => {
|
|
85
|
+
it('valida el proveedor anidado', async () => {
|
|
86
|
+
expect(await errorsOn({ selectedProvider: { templateId: '', senderId: '' } }, 'selectedProvider')).not.toHaveLength(0);
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it('rechaza la ausencia', async () => {
|
|
90
|
+
expect(await errorsOn({ selectedProvider: undefined }, 'selectedProvider')).not.toHaveLength(0);
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it('messageType sigue siendo opcional', async () => {
|
|
95
|
+
expect(await errorsOn({ messageType: undefined }, 'messageType')).toHaveLength(0);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { plainToInstance } from 'class-transformer';
|
|
3
|
+
import { validate } from 'class-validator';
|
|
4
|
+
import { ConnectorSendMessageResponse } from '../../../src/whatsappConnector/dtos/ConnectorSendMessageResponse';
|
|
5
|
+
|
|
6
|
+
describe('ConnectorSendMessageResponse', () => {
|
|
7
|
+
it('acepta el id y el estado que devuelve Meta', async () => {
|
|
8
|
+
const dto = plainToInstance(ConnectorSendMessageResponse, { providerMessageId: 'wamid.HBg', status: 'accepted' });
|
|
9
|
+
expect(await validate(dto)).toEqual([]);
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
it('rechaza un id que no es string', async () => {
|
|
13
|
+
const dto = plainToInstance(ConnectorSendMessageResponse, { providerMessageId: 42, status: 'accepted' });
|
|
14
|
+
expect(await validate(dto)).not.toHaveLength(0);
|
|
15
|
+
});
|
|
16
|
+
});
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { plainToInstance } from 'class-transformer';
|
|
3
|
+
import { validate } from 'class-validator';
|
|
4
|
+
import { SelectedProvider } from '../../../src/whatsappConnector/dtos/SelectedProvider';
|
|
5
|
+
|
|
6
|
+
const base = {
|
|
7
|
+
templateId: 'otp_code',
|
|
8
|
+
senderId: '1234567890',
|
|
9
|
+
contentVariables: { '1': '123456' },
|
|
10
|
+
secretRef: 'whatsapp-surekeep-credentials',
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const build = (over: Record<string, unknown> = {}) => plainToInstance(SelectedProvider, { ...base, ...over });
|
|
14
|
+
|
|
15
|
+
describe('SelectedProvider', () => {
|
|
16
|
+
it('acepta el proveedor ya resuelto', async () => {
|
|
17
|
+
expect(await validate(build())).toEqual([]);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it('rechaza templateId vacío', async () => {
|
|
21
|
+
expect(await validate(build({ templateId: '' }))).not.toHaveLength(0);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it('rechaza senderId vacío', async () => {
|
|
25
|
+
expect(await validate(build({ senderId: '' }))).not.toHaveLength(0);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('rechaza secretRef vacío', async () => {
|
|
29
|
+
expect(await validate(build({ secretRef: '' }))).not.toHaveLength(0);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it('rechaza la ausencia de secretRef', async () => {
|
|
33
|
+
expect(await validate(build({ secretRef: undefined }))).not.toHaveLength(0);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('deja contentVariables opcional', async () => {
|
|
37
|
+
expect(await validate(build({ contentVariables: undefined }))).toEqual([]);
|
|
38
|
+
});
|
|
39
|
+
});
|
package/bin/index.d.ts
CHANGED
|
@@ -81,6 +81,7 @@ export * as MilestoneBusiness from './milestone-business';
|
|
|
81
81
|
export * as Mdm from './mdm';
|
|
82
82
|
export * as MessagesConnector from './messagesConnector';
|
|
83
83
|
export * as TwilioConnector from './twilioConnector';
|
|
84
|
+
export * as WhatsappConnector from './whatsappConnector';
|
|
84
85
|
export * as CognitoBackofficeConnector from './cognitoBackofficeConnector';
|
|
85
86
|
export * as PlatformRbac from './platformRbac';
|
|
86
87
|
export * as Remittance from './remittance';
|
package/bin/index.js
CHANGED
|
@@ -37,8 +37,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
exports.IssuanceBusiness = exports.Blacklist = exports.CentralPayments = exports.Helpdesk = exports.FiadoApiResponse = exports.Auth = exports.LegalDocumentsBusiness = exports.Role = exports.STPAccount = exports.RiskProfile = exports.FraudPreventionEngine = exports.BBVARst = exports.Stp = exports.BenefitCenter = exports.BankAccount = exports.P2pContact = exports.CreditContract = exports.Contract = exports.ProductCatalog = exports.ContactInfo = exports.TransactionAnalytics = exports.Transaction = exports.TransactionProcessor = exports.GenericMessage = exports.EventBridgeMessage = exports.SessionActivity = exports.NotificationMessages = exports.ServicePayment = exports.Header = exports.Identity = exports.UserTags = exports.Group = exports.File = exports.ExchangeRate = exports.Directory = exports.Currency = exports.Country = exports.Card = exports.Authentication = exports.AppContent = exports.App = exports.Offices = exports.Places = exports.Address = exports.Beneficiary = exports.Activity = exports.Biometrics = exports.MetamapConnector = exports.Account = exports.Crypto = void 0;
|
|
40
|
-
exports.
|
|
41
|
-
exports.Membership = exports.WebhookBusiness = exports.PeopleBusiness = exports.UserConfirmations = exports.Collection = exports.Shipping = exports.PhoneSales = exports.Onboarding = exports.Kyc = exports.LoanScoring = exports.LoanCredit = exports.LoanCollectorAssignment = exports.LoanOfferings = exports.Shortlink = void 0;
|
|
40
|
+
exports.DatalakeQuery = exports.RetailWizard = exports.RetailCustomer = exports.RetailCards = exports.RetailCatalog = exports.RetailCommission = exports.RetailOrg = exports.EmailVerification = exports.NetworkConnector = exports.Modelias = exports.TotpSecurity = exports.Passport = exports.WalletFunding = exports.Remittance = exports.PlatformRbac = exports.CognitoBackofficeConnector = exports.WhatsappConnector = exports.TwilioConnector = exports.MessagesConnector = exports.Mdm = exports.MilestoneBusiness = exports.CirculoCredito = exports.CreditStatements = exports.Sentry = exports.AiEngine = exports.Funnel = exports.TeamsConnector = exports.PlatformErrorEvents = exports.CustomerFile = exports.CreditBackoffice = exports.CreditDashboard = exports.CreditEngine = exports.Credit = exports.ComissionBusiness = exports.ReferralBusiness = exports.ZendeskMessaging = exports.NotificationWS = exports.Event = exports.PayrollBusiness = exports.Cnbv = exports.DirectorySetting = exports.InvoiceCollector = exports.Collector = exports.Pricelist = exports.Company = exports.Services = exports.AccountIssuanceBusiness = exports.AppSelectionData = exports.Device = exports.Observations = void 0;
|
|
41
|
+
exports.Membership = exports.WebhookBusiness = exports.PeopleBusiness = exports.UserConfirmations = exports.Collection = exports.Shipping = exports.PhoneSales = exports.Onboarding = exports.Kyc = exports.LoanScoring = exports.LoanCredit = exports.LoanCollectorAssignment = exports.LoanOfferings = exports.Shortlink = exports.LoanConfig = void 0;
|
|
42
42
|
exports.Crypto = __importStar(require("./crypto"));
|
|
43
43
|
exports.Account = __importStar(require("./account"));
|
|
44
44
|
exports.MetamapConnector = __importStar(require("./metamapConnector"));
|
|
@@ -122,6 +122,7 @@ exports.MilestoneBusiness = __importStar(require("./milestone-business"));
|
|
|
122
122
|
exports.Mdm = __importStar(require("./mdm"));
|
|
123
123
|
exports.MessagesConnector = __importStar(require("./messagesConnector"));
|
|
124
124
|
exports.TwilioConnector = __importStar(require("./twilioConnector"));
|
|
125
|
+
exports.WhatsappConnector = __importStar(require("./whatsappConnector"));
|
|
125
126
|
exports.CognitoBackofficeConnector = __importStar(require("./cognitoBackofficeConnector"));
|
|
126
127
|
// PlatformRbac: módulo del lambda platform-rbac-business (Fase 0 SureKeep).
|
|
127
128
|
// Contiene Permission enum + AuthContext + RoleAssignmentInfo + PermissionScope +
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { MdmNotifyItem } from './MdmNotifyItem';
|
|
2
|
+
/**
|
|
3
|
+
* Mensaje que viaja por la cola de messages-business para avisar en lote a los equipos.
|
|
4
|
+
* Reemplaza al `POST /private/messages/mdm-notify`, que se retira.
|
|
5
|
+
*/
|
|
6
|
+
export declare class MdmNotifyQueueMessageRequest {
|
|
7
|
+
/**
|
|
8
|
+
* Equipos del lote. El tope es el mismo que el del lote de `loan-credit-business`.
|
|
9
|
+
* El imei repetido duplica el aviso en el equipo y colapsa los dos acuses en uno.
|
|
10
|
+
*/
|
|
11
|
+
items: MdmNotifyItem[];
|
|
12
|
+
/** Tenant emisor del aviso. Si se omite, messages-business asume FIADO. */
|
|
13
|
+
tenantId?: string;
|
|
14
|
+
/** Referencia con la que el productor correlaciona este lote. Es la que viaja al proveedor. */
|
|
15
|
+
operationReference: string;
|
|
16
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
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.MdmNotifyQueueMessageRequest = void 0;
|
|
13
|
+
const class_transformer_1 = require("class-transformer");
|
|
14
|
+
const class_validator_1 = require("class-validator");
|
|
15
|
+
const MdmNotifyItem_1 = require("./MdmNotifyItem");
|
|
16
|
+
const MdmNotifyBatchLimits_1 = require("../constants/MdmNotifyBatchLimits");
|
|
17
|
+
/**
|
|
18
|
+
* Mensaje que viaja por la cola de messages-business para avisar en lote a los equipos.
|
|
19
|
+
* Reemplaza al `POST /private/messages/mdm-notify`, que se retira.
|
|
20
|
+
*/
|
|
21
|
+
class MdmNotifyQueueMessageRequest {
|
|
22
|
+
}
|
|
23
|
+
exports.MdmNotifyQueueMessageRequest = MdmNotifyQueueMessageRequest;
|
|
24
|
+
__decorate([
|
|
25
|
+
(0, class_transformer_1.Expose)(),
|
|
26
|
+
(0, class_validator_1.IsArray)(),
|
|
27
|
+
(0, class_validator_1.ArrayNotEmpty)(),
|
|
28
|
+
(0, class_validator_1.ArrayMaxSize)(MdmNotifyBatchLimits_1.MDM_NOTIFY_MAX_BATCH),
|
|
29
|
+
(0, class_validator_1.ArrayUnique)((item) => item.imei),
|
|
30
|
+
(0, class_validator_1.ValidateNested)({ each: true }),
|
|
31
|
+
(0, class_transformer_1.Type)(() => MdmNotifyItem_1.MdmNotifyItem),
|
|
32
|
+
__metadata("design:type", Array)
|
|
33
|
+
], MdmNotifyQueueMessageRequest.prototype, "items", void 0);
|
|
34
|
+
__decorate([
|
|
35
|
+
(0, class_transformer_1.Expose)(),
|
|
36
|
+
(0, class_validator_1.IsOptional)(),
|
|
37
|
+
(0, class_validator_1.IsString)(),
|
|
38
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
39
|
+
__metadata("design:type", String)
|
|
40
|
+
], MdmNotifyQueueMessageRequest.prototype, "tenantId", void 0);
|
|
41
|
+
__decorate([
|
|
42
|
+
(0, class_transformer_1.Expose)(),
|
|
43
|
+
(0, class_validator_1.IsString)(),
|
|
44
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
45
|
+
(0, class_validator_1.MaxLength)(64),
|
|
46
|
+
__metadata("design:type", String)
|
|
47
|
+
], MdmNotifyQueueMessageRequest.prototype, "operationReference", void 0);
|
|
@@ -3,5 +3,7 @@ export declare enum DeliveryChannelExtendedEnum {
|
|
|
3
3
|
MAIL = "MAIL",
|
|
4
4
|
PUSH_NOTIFICATION = "PUSH_NOTIFICATION",
|
|
5
5
|
/** Aviso en la pantalla del equipo financiado. Se entrega por IMEI, no por teléfono ni correo. */
|
|
6
|
-
MDM = "MDM"
|
|
6
|
+
MDM = "MDM",
|
|
7
|
+
/** Mensaje por WhatsApp. Se entrega por teléfono; el connector normaliza el número antes de enviar. */
|
|
8
|
+
WHATSAPP = "WHATSAPP"
|
|
7
9
|
}
|
|
@@ -8,4 +8,6 @@ var DeliveryChannelExtendedEnum;
|
|
|
8
8
|
DeliveryChannelExtendedEnum["PUSH_NOTIFICATION"] = "PUSH_NOTIFICATION";
|
|
9
9
|
/** Aviso en la pantalla del equipo financiado. Se entrega por IMEI, no por teléfono ni correo. */
|
|
10
10
|
DeliveryChannelExtendedEnum["MDM"] = "MDM";
|
|
11
|
+
/** Mensaje por WhatsApp. Se entrega por teléfono; el connector normaliza el número antes de enviar. */
|
|
12
|
+
DeliveryChannelExtendedEnum["WHATSAPP"] = "WHATSAPP";
|
|
11
13
|
})(DeliveryChannelExtendedEnum || (exports.DeliveryChannelExtendedEnum = DeliveryChannelExtendedEnum = {}));
|
|
@@ -23,6 +23,7 @@ export * from './dtos/TemplateMessageListFiltersRequest';
|
|
|
23
23
|
export * from './constants/MdmNotifyBatchLimits';
|
|
24
24
|
export * from './dtos/MdmNotifyItem';
|
|
25
25
|
export * from './dtos/MdmNotifyRequest';
|
|
26
|
+
export * from './dtos/MdmNotifyQueueMessageRequest';
|
|
26
27
|
export * from './dtos/MdmNotifyResponse';
|
|
27
28
|
export * from './dtos/MdmNotifyBatchResponse';
|
|
28
29
|
export * from './constants/MessageIdempotencyLimits';
|
|
@@ -39,6 +39,7 @@ __exportStar(require("./dtos/TemplateMessageListFiltersRequest"), exports);
|
|
|
39
39
|
__exportStar(require("./constants/MdmNotifyBatchLimits"), exports);
|
|
40
40
|
__exportStar(require("./dtos/MdmNotifyItem"), exports);
|
|
41
41
|
__exportStar(require("./dtos/MdmNotifyRequest"), exports);
|
|
42
|
+
__exportStar(require("./dtos/MdmNotifyQueueMessageRequest"), exports);
|
|
42
43
|
__exportStar(require("./dtos/MdmNotifyResponse"), exports);
|
|
43
44
|
__exportStar(require("./dtos/MdmNotifyBatchResponse"), exports);
|
|
44
45
|
__exportStar(require("./constants/MessageIdempotencyLimits"), exports);
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { DeliveryChannelExtendedEnum } from '../../messagesConnector/index';
|
|
2
|
+
import { SelectedProvider } from './SelectedProvider';
|
|
3
|
+
/**
|
|
4
|
+
* Contrato de entrada `messages-business → whatsapp-connector`.
|
|
5
|
+
* El proveedor llega ya resuelto: el connector solo transmite a Meta.
|
|
6
|
+
*/
|
|
7
|
+
export declare class ConnectorSendMessageRequest {
|
|
8
|
+
/** Canal de entrega. Acepta cualquier valor de `DeliveryChannelExtendedEnum`. */
|
|
9
|
+
channelType: DeliveryChannelExtendedEnum;
|
|
10
|
+
/** Teléfono destino. El connector lo normaliza a E.164 antes de enviar. Ej: "+525512345678". */
|
|
11
|
+
destination: string;
|
|
12
|
+
/** Tipo de mensaje de dominio. Ej: "OTP_CODE". Solo para logging/trazabilidad. */
|
|
13
|
+
messageType?: string;
|
|
14
|
+
/** Idioma de la plantilla. Ej: "es". Obligatorio: Meta lo exige en cada envío. */
|
|
15
|
+
language: string;
|
|
16
|
+
/** Tenant dueño del envío. El connector valida contra el que corresponde al `secretRef`. */
|
|
17
|
+
tenantId: string;
|
|
18
|
+
/** Proveedor ya seleccionado y resuelto por messages-business. */
|
|
19
|
+
selectedProvider: SelectedProvider;
|
|
20
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
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.ConnectorSendMessageRequest = void 0;
|
|
13
|
+
const class_transformer_1 = require("class-transformer");
|
|
14
|
+
const class_validator_1 = require("class-validator");
|
|
15
|
+
const index_1 = require("../../messagesConnector/index");
|
|
16
|
+
const SelectedProvider_1 = require("./SelectedProvider");
|
|
17
|
+
/**
|
|
18
|
+
* Contrato de entrada `messages-business → whatsapp-connector`.
|
|
19
|
+
* El proveedor llega ya resuelto: el connector solo transmite a Meta.
|
|
20
|
+
*/
|
|
21
|
+
class ConnectorSendMessageRequest {
|
|
22
|
+
}
|
|
23
|
+
exports.ConnectorSendMessageRequest = ConnectorSendMessageRequest;
|
|
24
|
+
__decorate([
|
|
25
|
+
(0, class_transformer_1.Expose)(),
|
|
26
|
+
(0, class_validator_1.IsEnum)(index_1.DeliveryChannelExtendedEnum),
|
|
27
|
+
__metadata("design:type", String)
|
|
28
|
+
], ConnectorSendMessageRequest.prototype, "channelType", void 0);
|
|
29
|
+
__decorate([
|
|
30
|
+
(0, class_transformer_1.Expose)(),
|
|
31
|
+
(0, class_validator_1.IsString)(),
|
|
32
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
33
|
+
__metadata("design:type", String)
|
|
34
|
+
], ConnectorSendMessageRequest.prototype, "destination", void 0);
|
|
35
|
+
__decorate([
|
|
36
|
+
(0, class_transformer_1.Expose)(),
|
|
37
|
+
(0, class_validator_1.IsOptional)(),
|
|
38
|
+
(0, class_validator_1.IsString)(),
|
|
39
|
+
__metadata("design:type", String)
|
|
40
|
+
], ConnectorSendMessageRequest.prototype, "messageType", void 0);
|
|
41
|
+
__decorate([
|
|
42
|
+
(0, class_transformer_1.Expose)(),
|
|
43
|
+
(0, class_validator_1.IsString)(),
|
|
44
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
45
|
+
__metadata("design:type", String)
|
|
46
|
+
], ConnectorSendMessageRequest.prototype, "language", void 0);
|
|
47
|
+
__decorate([
|
|
48
|
+
(0, class_transformer_1.Expose)(),
|
|
49
|
+
(0, class_validator_1.IsString)(),
|
|
50
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
51
|
+
__metadata("design:type", String)
|
|
52
|
+
], ConnectorSendMessageRequest.prototype, "tenantId", void 0);
|
|
53
|
+
__decorate([
|
|
54
|
+
(0, class_transformer_1.Expose)(),
|
|
55
|
+
(0, class_validator_1.IsDefined)(),
|
|
56
|
+
(0, class_validator_1.ValidateNested)(),
|
|
57
|
+
(0, class_transformer_1.Type)(() => SelectedProvider_1.SelectedProvider),
|
|
58
|
+
__metadata("design:type", SelectedProvider_1.SelectedProvider)
|
|
59
|
+
], ConnectorSendMessageRequest.prototype, "selectedProvider", void 0);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Respuesta del whatsapp-connector tras delegar el envío a Meta.
|
|
3
|
+
*/
|
|
4
|
+
export declare class ConnectorSendMessageResponse {
|
|
5
|
+
/** Id del mensaje generado por Meta (wamid...). */
|
|
6
|
+
providerMessageId: string;
|
|
7
|
+
/** Estado reportado por Meta al momento del envío (accepted, sent, ...). */
|
|
8
|
+
status: string;
|
|
9
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
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.ConnectorSendMessageResponse = void 0;
|
|
13
|
+
const class_transformer_1 = require("class-transformer");
|
|
14
|
+
const class_validator_1 = require("class-validator");
|
|
15
|
+
/**
|
|
16
|
+
* Respuesta del whatsapp-connector tras delegar el envío a Meta.
|
|
17
|
+
*/
|
|
18
|
+
class ConnectorSendMessageResponse {
|
|
19
|
+
}
|
|
20
|
+
exports.ConnectorSendMessageResponse = ConnectorSendMessageResponse;
|
|
21
|
+
__decorate([
|
|
22
|
+
(0, class_transformer_1.Expose)(),
|
|
23
|
+
(0, class_validator_1.IsString)(),
|
|
24
|
+
__metadata("design:type", String)
|
|
25
|
+
], ConnectorSendMessageResponse.prototype, "providerMessageId", void 0);
|
|
26
|
+
__decorate([
|
|
27
|
+
(0, class_transformer_1.Expose)(),
|
|
28
|
+
(0, class_validator_1.IsString)(),
|
|
29
|
+
__metadata("design:type", String)
|
|
30
|
+
], ConnectorSendMessageResponse.prototype, "status", void 0);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Proveedor ya resuelto por messages-business desde el `senderConfig` del `(tenant, channel)`.
|
|
3
|
+
* Los nombres son genéricos para no acoplar el contrato al vocabulario del proveedor.
|
|
4
|
+
*/
|
|
5
|
+
export declare class SelectedProvider {
|
|
6
|
+
/** Plantilla del proveedor ya resuelta. Para Meta = nombre de la plantilla aprobada. */
|
|
7
|
+
templateId: string;
|
|
8
|
+
/** Remitente ya resuelto. Para Meta = Phone Number ID de la cuenta de WhatsApp Business. */
|
|
9
|
+
senderId: string;
|
|
10
|
+
/** Variables de la plantilla ya resueltas, keyeadas por slot posicional. Ej: { "1": "1234" }. */
|
|
11
|
+
contentVariables?: Record<string, string>;
|
|
12
|
+
/**
|
|
13
|
+
* Referencia (nombre/ARN) al secret de Secrets Manager con las credenciales de Meta.
|
|
14
|
+
* Es obligatoria: el connector valida que ese secret corresponda al `tenantId` del envío.
|
|
15
|
+
*/
|
|
16
|
+
secretRef: string;
|
|
17
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
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.SelectedProvider = void 0;
|
|
13
|
+
const class_transformer_1 = require("class-transformer");
|
|
14
|
+
const class_validator_1 = require("class-validator");
|
|
15
|
+
/**
|
|
16
|
+
* Proveedor ya resuelto por messages-business desde el `senderConfig` del `(tenant, channel)`.
|
|
17
|
+
* Los nombres son genéricos para no acoplar el contrato al vocabulario del proveedor.
|
|
18
|
+
*/
|
|
19
|
+
class SelectedProvider {
|
|
20
|
+
}
|
|
21
|
+
exports.SelectedProvider = SelectedProvider;
|
|
22
|
+
__decorate([
|
|
23
|
+
(0, class_transformer_1.Expose)(),
|
|
24
|
+
(0, class_validator_1.IsString)(),
|
|
25
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
26
|
+
__metadata("design:type", String)
|
|
27
|
+
], SelectedProvider.prototype, "templateId", void 0);
|
|
28
|
+
__decorate([
|
|
29
|
+
(0, class_transformer_1.Expose)(),
|
|
30
|
+
(0, class_validator_1.IsString)(),
|
|
31
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
32
|
+
__metadata("design:type", String)
|
|
33
|
+
], SelectedProvider.prototype, "senderId", void 0);
|
|
34
|
+
__decorate([
|
|
35
|
+
(0, class_transformer_1.Expose)(),
|
|
36
|
+
(0, class_validator_1.IsOptional)(),
|
|
37
|
+
(0, class_validator_1.IsObject)(),
|
|
38
|
+
__metadata("design:type", Object)
|
|
39
|
+
], SelectedProvider.prototype, "contentVariables", void 0);
|
|
40
|
+
__decorate([
|
|
41
|
+
(0, class_transformer_1.Expose)(),
|
|
42
|
+
(0, class_validator_1.IsString)(),
|
|
43
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
44
|
+
__metadata("design:type", String)
|
|
45
|
+
], SelectedProvider.prototype, "secretRef", void 0);
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./dtos/SelectedProvider"), exports);
|
|
18
|
+
__exportStar(require("./dtos/ConnectorSendMessageRequest"), exports);
|
|
19
|
+
__exportStar(require("./dtos/ConnectorSendMessageResponse"), exports);
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -81,6 +81,7 @@ export * as MilestoneBusiness from './milestone-business';
|
|
|
81
81
|
export * as Mdm from './mdm';
|
|
82
82
|
export * as MessagesConnector from './messagesConnector';
|
|
83
83
|
export * as TwilioConnector from './twilioConnector';
|
|
84
|
+
export * as WhatsappConnector from './whatsappConnector';
|
|
84
85
|
export * as CognitoBackofficeConnector from './cognitoBackofficeConnector';
|
|
85
86
|
// PlatformRbac: módulo del lambda platform-rbac-business (Fase 0 SureKeep).
|
|
86
87
|
// Contiene Permission enum + AuthContext + RoleAssignmentInfo + PermissionScope +
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Expose, Type } from 'class-transformer';
|
|
2
|
+
import { ArrayMaxSize, ArrayNotEmpty, ArrayUnique, IsArray, IsNotEmpty, IsOptional, IsString, MaxLength, ValidateNested } from 'class-validator';
|
|
3
|
+
import { MdmNotifyItem } from './MdmNotifyItem';
|
|
4
|
+
import { MDM_NOTIFY_MAX_BATCH } from '../constants/MdmNotifyBatchLimits';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Mensaje que viaja por la cola de messages-business para avisar en lote a los equipos.
|
|
8
|
+
* Reemplaza al `POST /private/messages/mdm-notify`, que se retira.
|
|
9
|
+
*/
|
|
10
|
+
export class MdmNotifyQueueMessageRequest {
|
|
11
|
+
/**
|
|
12
|
+
* Equipos del lote. El tope es el mismo que el del lote de `loan-credit-business`.
|
|
13
|
+
* El imei repetido duplica el aviso en el equipo y colapsa los dos acuses en uno.
|
|
14
|
+
*/
|
|
15
|
+
@Expose()
|
|
16
|
+
@IsArray()
|
|
17
|
+
@ArrayNotEmpty()
|
|
18
|
+
@ArrayMaxSize(MDM_NOTIFY_MAX_BATCH)
|
|
19
|
+
@ArrayUnique((item: MdmNotifyItem) => item.imei)
|
|
20
|
+
@ValidateNested({ each: true })
|
|
21
|
+
@Type(() => MdmNotifyItem)
|
|
22
|
+
items!: MdmNotifyItem[];
|
|
23
|
+
|
|
24
|
+
/** Tenant emisor del aviso. Si se omite, messages-business asume FIADO. */
|
|
25
|
+
@Expose()
|
|
26
|
+
@IsOptional()
|
|
27
|
+
@IsString()
|
|
28
|
+
@IsNotEmpty()
|
|
29
|
+
tenantId?: string;
|
|
30
|
+
|
|
31
|
+
/** Referencia con la que el productor correlaciona este lote. Es la que viaja al proveedor. */
|
|
32
|
+
@Expose()
|
|
33
|
+
@IsString()
|
|
34
|
+
@IsNotEmpty()
|
|
35
|
+
@MaxLength(64)
|
|
36
|
+
operationReference!: string;
|
|
37
|
+
}
|
|
@@ -4,4 +4,6 @@ export enum DeliveryChannelExtendedEnum {
|
|
|
4
4
|
PUSH_NOTIFICATION = 'PUSH_NOTIFICATION',
|
|
5
5
|
/** Aviso en la pantalla del equipo financiado. Se entrega por IMEI, no por teléfono ni correo. */
|
|
6
6
|
MDM = 'MDM',
|
|
7
|
+
/** Mensaje por WhatsApp. Se entrega por teléfono; el connector normaliza el número antes de enviar. */
|
|
8
|
+
WHATSAPP = 'WHATSAPP',
|
|
7
9
|
}
|
|
@@ -23,6 +23,7 @@ export * from './dtos/TemplateMessageListFiltersRequest';
|
|
|
23
23
|
export * from './constants/MdmNotifyBatchLimits';
|
|
24
24
|
export * from './dtos/MdmNotifyItem';
|
|
25
25
|
export * from './dtos/MdmNotifyRequest';
|
|
26
|
+
export * from './dtos/MdmNotifyQueueMessageRequest';
|
|
26
27
|
export * from './dtos/MdmNotifyResponse';
|
|
27
28
|
export * from './dtos/MdmNotifyBatchResponse';
|
|
28
29
|
export * from './constants/MessageIdempotencyLimits';
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Expose, Type } from 'class-transformer';
|
|
2
|
+
import { IsDefined, IsEnum, IsNotEmpty, IsOptional, IsString, ValidateNested } from 'class-validator';
|
|
3
|
+
import { DeliveryChannelExtendedEnum } from '../../messagesConnector/index';
|
|
4
|
+
import { SelectedProvider } from './SelectedProvider';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Contrato de entrada `messages-business → whatsapp-connector`.
|
|
8
|
+
* El proveedor llega ya resuelto: el connector solo transmite a Meta.
|
|
9
|
+
*/
|
|
10
|
+
export class ConnectorSendMessageRequest {
|
|
11
|
+
/** Canal de entrega. Acepta cualquier valor de `DeliveryChannelExtendedEnum`. */
|
|
12
|
+
@Expose() @IsEnum(DeliveryChannelExtendedEnum) channelType!: DeliveryChannelExtendedEnum;
|
|
13
|
+
|
|
14
|
+
/** Teléfono destino. El connector lo normaliza a E.164 antes de enviar. Ej: "+525512345678". */
|
|
15
|
+
@Expose() @IsString() @IsNotEmpty() destination!: string;
|
|
16
|
+
|
|
17
|
+
/** Tipo de mensaje de dominio. Ej: "OTP_CODE". Solo para logging/trazabilidad. */
|
|
18
|
+
@Expose() @IsOptional() @IsString() messageType?: string;
|
|
19
|
+
|
|
20
|
+
/** Idioma de la plantilla. Ej: "es". Obligatorio: Meta lo exige en cada envío. */
|
|
21
|
+
@Expose() @IsString() @IsNotEmpty() language!: string;
|
|
22
|
+
|
|
23
|
+
/** Tenant dueño del envío. El connector valida contra el que corresponde al `secretRef`. */
|
|
24
|
+
@Expose() @IsString() @IsNotEmpty() tenantId!: string;
|
|
25
|
+
|
|
26
|
+
/** Proveedor ya seleccionado y resuelto por messages-business. */
|
|
27
|
+
@Expose() @IsDefined() @ValidateNested() @Type(() => SelectedProvider) selectedProvider!: SelectedProvider;
|
|
28
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Expose } from 'class-transformer';
|
|
2
|
+
import { IsString } from 'class-validator';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Respuesta del whatsapp-connector tras delegar el envío a Meta.
|
|
6
|
+
*/
|
|
7
|
+
export class ConnectorSendMessageResponse {
|
|
8
|
+
/** Id del mensaje generado por Meta (wamid...). */
|
|
9
|
+
@Expose() @IsString() providerMessageId!: string;
|
|
10
|
+
|
|
11
|
+
/** Estado reportado por Meta al momento del envío (accepted, sent, ...). */
|
|
12
|
+
@Expose() @IsString() status!: string;
|
|
13
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Expose } from 'class-transformer';
|
|
2
|
+
import { IsNotEmpty, IsObject, IsOptional, IsString } from 'class-validator';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Proveedor ya resuelto por messages-business desde el `senderConfig` del `(tenant, channel)`.
|
|
6
|
+
* Los nombres son genéricos para no acoplar el contrato al vocabulario del proveedor.
|
|
7
|
+
*/
|
|
8
|
+
export class SelectedProvider {
|
|
9
|
+
/** Plantilla del proveedor ya resuelta. Para Meta = nombre de la plantilla aprobada. */
|
|
10
|
+
@Expose() @IsString() @IsNotEmpty() templateId!: string;
|
|
11
|
+
|
|
12
|
+
/** Remitente ya resuelto. Para Meta = Phone Number ID de la cuenta de WhatsApp Business. */
|
|
13
|
+
@Expose() @IsString() @IsNotEmpty() senderId!: string;
|
|
14
|
+
|
|
15
|
+
/** Variables de la plantilla ya resueltas, keyeadas por slot posicional. Ej: { "1": "1234" }. */
|
|
16
|
+
@Expose() @IsOptional() @IsObject() contentVariables?: Record<string, string>;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Referencia (nombre/ARN) al secret de Secrets Manager con las credenciales de Meta.
|
|
20
|
+
* Es obligatoria: el connector valida que ese secret corresponda al `tenantId` del envío.
|
|
21
|
+
*/
|
|
22
|
+
@Expose() @IsString() @IsNotEmpty() secretRef!: string;
|
|
23
|
+
}
|