@fiado/type-kit 3.410.0 → 3.412.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/loanCredit/dtos/listMessagingCandidates.test.ts +97 -0
- package/_test_/unit/messagesConnector/NotificationQueueMessageRequestV2.test.ts +49 -0
- package/_test_/unit/messagesConnector/TemplateMessageUpdateRequest.test.ts +51 -0
- package/_test_/unit/messagesConnector/messagingEnums.test.ts +37 -0
- package/bin/loanCredit/constants/MessagingCandidateLimits.d.ts +4 -0
- package/bin/loanCredit/constants/MessagingCandidateLimits.js +7 -0
- package/bin/loanCredit/constants/StoreDayPattern.d.ts +3 -0
- package/bin/loanCredit/constants/StoreDayPattern.js +6 -0
- package/bin/loanCredit/dtos/MessagingCandidateItem.d.ts +31 -0
- package/bin/loanCredit/dtos/MessagingCandidateItem.js +10 -0
- package/bin/loanCredit/dtos/requests/ListMessagingCandidatesRequest.d.ts +11 -0
- package/bin/loanCredit/dtos/requests/ListMessagingCandidatesRequest.js +47 -0
- package/bin/loanCredit/dtos/responses/ListMessagingCandidatesResponse.d.ts +7 -0
- package/bin/loanCredit/dtos/responses/ListMessagingCandidatesResponse.js +7 -0
- package/bin/loanCredit/index.d.ts +6 -0
- package/bin/loanCredit/index.js +10 -1
- package/bin/messagesConnector/dtos/NotificationQueueMessageRequestV2.d.ts +5 -0
- package/bin/messagesConnector/dtos/NotificationQueueMessageRequestV2.js +13 -0
- package/bin/messagesConnector/dtos/TemplateMessageCreateRequest.d.ts +12 -5
- package/bin/messagesConnector/dtos/TemplateMessageCreateRequest.js +24 -4
- package/bin/messagesConnector/dtos/TemplateMessageListFiltersRequest.d.ts +4 -2
- package/bin/messagesConnector/dtos/TemplateMessageListFiltersRequest.js +8 -2
- package/bin/messagesConnector/dtos/TemplateMessageResponse.d.ts +9 -2
- package/bin/messagesConnector/dtos/TemplateMessageResponse.js +13 -0
- package/bin/messagesConnector/dtos/TemplateMessageUpdateRequest.d.ts +5 -1
- package/bin/messagesConnector/dtos/TemplateMessageUpdateRequest.js +14 -1
- package/bin/messagesConnector/enums/DeliveryChannelExtendedEnum.d.ts +3 -1
- package/bin/messagesConnector/enums/DeliveryChannelExtendedEnum.js +2 -0
- package/bin/messagesConnector/enums/MessagingSlotEnum.d.ts +9 -0
- package/bin/messagesConnector/enums/MessagingSlotEnum.js +13 -0
- package/bin/messagesConnector/enums/NotificationOriginEnum.d.ts +9 -0
- package/bin/messagesConnector/enums/NotificationOriginEnum.js +13 -0
- package/bin/messagesConnector/index.d.ts +2 -0
- package/bin/messagesConnector/index.js +2 -0
- package/bin/messaging/dtos/MessageDeliveryRequest.d.ts +5 -0
- package/bin/messaging/dtos/MessageDeliveryRequest.js +6 -0
- package/bin/twilioConnector/dtos/SelectedProvider.d.ts +1 -1
- package/package.json +1 -1
- package/src/loanCredit/constants/MessagingCandidateLimits.ts +5 -0
- package/src/loanCredit/constants/StoreDayPattern.ts +4 -0
- package/src/loanCredit/dtos/MessagingCandidateItem.ts +40 -0
- package/src/loanCredit/dtos/requests/ListMessagingCandidatesRequest.ts +33 -0
- package/src/loanCredit/dtos/responses/ListMessagingCandidatesResponse.ts +9 -0
- package/src/loanCredit/index.ts +10 -0
- package/src/messagesConnector/dtos/NotificationQueueMessageRequestV2.ts +13 -0
- package/src/messagesConnector/dtos/TemplateMessageCreateRequest.ts +27 -7
- package/src/messagesConnector/dtos/TemplateMessageListFiltersRequest.ts +9 -3
- package/src/messagesConnector/dtos/TemplateMessageResponse.ts +15 -2
- package/src/messagesConnector/dtos/TemplateMessageUpdateRequest.ts +15 -2
- package/src/messagesConnector/enums/DeliveryChannelExtendedEnum.ts +2 -0
- package/src/messagesConnector/enums/MessagingSlotEnum.ts +9 -0
- package/src/messagesConnector/enums/NotificationOriginEnum.ts +9 -0
- package/src/messagesConnector/index.ts +2 -0
- package/src/messaging/dtos/MessageDeliveryRequest.ts +10 -1
- package/src/twilioConnector/dtos/SelectedProvider.ts +1 -1
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { plainToInstance } from 'class-transformer';
|
|
3
|
+
import { validate } from 'class-validator';
|
|
4
|
+
import { ListMessagingCandidatesRequest } from '../../../../src/loanCredit/dtos/requests/ListMessagingCandidatesRequest';
|
|
5
|
+
import { ListMessagingCandidatesResponse } from '../../../../src/loanCredit/dtos/responses/ListMessagingCandidatesResponse';
|
|
6
|
+
import { MessagingCandidateItem } from '../../../../src/loanCredit/dtos/MessagingCandidateItem';
|
|
7
|
+
import { MESSAGING_CANDIDATES_MAX_LIMIT } from '../../../../src/loanCredit/constants/MessagingCandidateLimits';
|
|
8
|
+
import { DeliveryChannelExtendedEnum, MessagingSlotEnum } from '../../../../src/messagesConnector/index';
|
|
9
|
+
import { MdmProviderEnum } from '../../../../src/mdm/enums/MdmProviderEnum';
|
|
10
|
+
|
|
11
|
+
const RUN_DATE = '2026-09-08';
|
|
12
|
+
|
|
13
|
+
/** `whitelist: true` es lo que corre el motor en `validateRequest`: sin decorador, la propiedad se borra. */
|
|
14
|
+
const validateWhitelisted = (body: object) => {
|
|
15
|
+
const dto = plainToInstance(ListMessagingCandidatesRequest, body);
|
|
16
|
+
return validate(dto, { whitelist: true, forbidNonWhitelisted: false }).then(errors => ({ dto, errors }));
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
describe('ListMessagingCandidatesRequest', () => {
|
|
20
|
+
it('acepta la primera página: sin cursor y sin limit', async () => {
|
|
21
|
+
const { dto, errors } = await validateWhitelisted({ slot: MessagingSlotEnum.MORNING, runDate: RUN_DATE });
|
|
22
|
+
|
|
23
|
+
expect(errors).toEqual([]);
|
|
24
|
+
expect(dto.cursor).toBeUndefined();
|
|
25
|
+
expect(dto.limit).toBeUndefined();
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('convierte el limit que llega como texto', async () => {
|
|
29
|
+
const { dto, errors } = await validateWhitelisted({ slot: MessagingSlotEnum.EVENING, runDate: RUN_DATE, limit: '25' });
|
|
30
|
+
|
|
31
|
+
expect(errors).toEqual([]);
|
|
32
|
+
expect(dto.limit).toBe(25);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it('rechaza un slot fuera del enum', async () => {
|
|
36
|
+
const { errors } = await validateWhitelisted({ slot: 'NIGHT', runDate: RUN_DATE });
|
|
37
|
+
|
|
38
|
+
expect(errors.some(error => error.property === 'slot')).toBe(true);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('rechaza un runDate con hora: el día de tienda no lleva reloj', async () => {
|
|
42
|
+
const { errors } = await validateWhitelisted({ slot: MessagingSlotEnum.MORNING, runDate: '2026-09-08T10:00:00Z' });
|
|
43
|
+
|
|
44
|
+
expect(errors.some(error => error.property === 'runDate')).toBe(true);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('rechaza un limit por encima del tope de página', async () => {
|
|
48
|
+
const { errors } = await validateWhitelisted({
|
|
49
|
+
slot: MessagingSlotEnum.AFTERNOON,
|
|
50
|
+
runDate: RUN_DATE,
|
|
51
|
+
limit: MESSAGING_CANDIDATES_MAX_LIMIT + 1,
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
expect(errors.some(error => error.property === 'limit')).toBe(true);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
describe('MessagingCandidateItem', () => {
|
|
59
|
+
it('el candidato sin crédito conserva la persona', () => {
|
|
60
|
+
const item: MessagingCandidateItem = {
|
|
61
|
+
personId: '01JB2Z0N7Q9K3M5R8T1V4W6X7Y',
|
|
62
|
+
messageType: 'COLLECTION_NOTICE',
|
|
63
|
+
slot: MessagingSlotEnum.MORNING,
|
|
64
|
+
channel: DeliveryChannelExtendedEnum.SMS,
|
|
65
|
+
variables: { firstName: 'Ana', amount: '1,250.00' },
|
|
66
|
+
reference: 'collections#2026-09-08#MORNING#1',
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
expect(item.personId).toBeDefined();
|
|
70
|
+
expect(item.creditId).toBeUndefined();
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it('el candidato de MDM lleva IMEI y proveedor', () => {
|
|
74
|
+
const item: MessagingCandidateItem = {
|
|
75
|
+
personId: '01JB2Z0N7Q9K3M5R8T1V4W6X7Y',
|
|
76
|
+
creditId: 'CRD-01JB2Z0N7Q9K3M5R8T1V4W6X7Y',
|
|
77
|
+
messageType: 'COLLECTION_NOTICE',
|
|
78
|
+
slot: MessagingSlotEnum.EVENING,
|
|
79
|
+
channel: DeliveryChannelExtendedEnum.MDM,
|
|
80
|
+
variables: {},
|
|
81
|
+
reference: 'collections#2026-09-08#EVENING#7',
|
|
82
|
+
imei: '351756051523999',
|
|
83
|
+
mdmProvider: MdmProviderEnum.DATACULTR,
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
expect(item.channel).toBe('MDM');
|
|
87
|
+
expect(item.imei).toBe('351756051523999');
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
describe('ListMessagingCandidatesResponse', () => {
|
|
92
|
+
it('la última página cierra con nextCursor en null, no en undefined', () => {
|
|
93
|
+
const response: ListMessagingCandidatesResponse = { items: [], nextCursor: null };
|
|
94
|
+
|
|
95
|
+
expect(response.nextCursor).toBeNull();
|
|
96
|
+
});
|
|
97
|
+
});
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { plainToInstance } from 'class-transformer';
|
|
3
|
+
import { validate } from 'class-validator';
|
|
4
|
+
import { NotificationQueueMessageRequestV2 } from '../../../src/messagesConnector/dtos/NotificationQueueMessageRequestV2';
|
|
5
|
+
import { NotificationOriginEnum } from '../../../src/messagesConnector/enums/NotificationOriginEnum';
|
|
6
|
+
import { DeliveryChannelExtendedEnum } from '../../../src/messagesConnector/enums/DeliveryChannelExtendedEnum';
|
|
7
|
+
|
|
8
|
+
const base = {
|
|
9
|
+
templateId: 'OTP_CODE',
|
|
10
|
+
channelType: DeliveryChannelExtendedEnum.SMS,
|
|
11
|
+
language: 'es',
|
|
12
|
+
country: 'MX',
|
|
13
|
+
typeOfDirectoryId: 'PHONE',
|
|
14
|
+
directoryId: '4422194128',
|
|
15
|
+
destination: '4422194128',
|
|
16
|
+
variables: { code: '123456' },
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const errorsOn = async (payload: Record<string, unknown>, property: string) => {
|
|
20
|
+
const dto = plainToInstance(NotificationQueueMessageRequestV2, { ...base, ...payload });
|
|
21
|
+
const errors = await validate(dto);
|
|
22
|
+
return errors.filter((e) => e.property === property);
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Candado: `origin` NO lleva default en el DTO. Un default borraria la diferencia
|
|
27
|
+
* entre "no vino" y "vino EVENT", y platform-rbac-business, el unico productor real
|
|
28
|
+
* hoy, no manda el campo.
|
|
29
|
+
*/
|
|
30
|
+
describe('NotificationQueueMessageRequestV2.origin', () => {
|
|
31
|
+
it('acepta los tres valores del enum', async () => {
|
|
32
|
+
expect(await errorsOn({ origin: NotificationOriginEnum.MANUAL }, 'origin')).toHaveLength(0);
|
|
33
|
+
expect(await errorsOn({ origin: NotificationOriginEnum.TEST }, 'origin')).toHaveLength(0);
|
|
34
|
+
expect(await errorsOn({ origin: NotificationOriginEnum.EVENT }, 'origin')).toHaveLength(0);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it('sigue siendo valido cuando el productor no lo manda', async () => {
|
|
38
|
+
expect(await errorsOn({}, 'origin')).toHaveLength(0);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('no se rellena solo: ausente queda undefined, no EVENT', async () => {
|
|
42
|
+
const dto = plainToInstance(NotificationQueueMessageRequestV2, base);
|
|
43
|
+
expect(dto.origin).toBeUndefined();
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it('rechaza un valor fuera del enum', async () => {
|
|
47
|
+
expect(await errorsOn({ origin: 'CRON' }, 'origin')).not.toHaveLength(0);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { plainToInstance } from 'class-transformer';
|
|
3
|
+
import { validate } from 'class-validator';
|
|
4
|
+
import { TemplateMessageUpdateRequest } from '../../../src/messagesConnector/dtos/TemplateMessageUpdateRequest';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Candado: sin `providerTemplateId` ni `slotVariables` en el PUT, una plantilla de
|
|
8
|
+
* WhatsApp se puede crear pero no corregir, y arreglar un contentSid o un slot mal
|
|
9
|
+
* cargado obliga a DELETE + POST.
|
|
10
|
+
*/
|
|
11
|
+
const errorsOn = async (payload: Record<string, unknown>, property: string) => {
|
|
12
|
+
const dto = plainToInstance(TemplateMessageUpdateRequest, payload);
|
|
13
|
+
const errors = await validate(dto);
|
|
14
|
+
return errors.filter((e) => e.property === property);
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
describe('TemplateMessageUpdateRequest.providerTemplateId', () => {
|
|
18
|
+
it('acepta un contentSid HX de Twilio', async () => {
|
|
19
|
+
expect(await errorsOn({ providerTemplateId: 'HX1234567890abcdef' }, 'providerTemplateId')).toHaveLength(0);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it('es opcional: el PUT que no toca WhatsApp no lo manda', async () => {
|
|
23
|
+
expect(await errorsOn({ template: 'Hola {{name}}' }, 'providerTemplateId')).toHaveLength(0);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('rechaza un valor que no es string', async () => {
|
|
27
|
+
expect(await errorsOn({ providerTemplateId: 12345 }, 'providerTemplateId')).not.toHaveLength(0);
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
describe('TemplateMessageUpdateRequest.slotVariables', () => {
|
|
32
|
+
it('acepta el arreglo de nombres de variable por slot', async () => {
|
|
33
|
+
expect(await errorsOn({ slotVariables: ['code', 'expiresIn'] }, 'slotVariables')).toHaveLength(0);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('acepta el arreglo vacio (plantilla sin slots)', async () => {
|
|
37
|
+
expect(await errorsOn({ slotVariables: [] }, 'slotVariables')).toHaveLength(0);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it('es opcional: el PUT que no toca WhatsApp no lo manda', async () => {
|
|
41
|
+
expect(await errorsOn({ template: 'Hola {{name}}' }, 'slotVariables')).toHaveLength(0);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it('rechaza un valor que no es arreglo', async () => {
|
|
45
|
+
expect(await errorsOn({ slotVariables: 'code' }, 'slotVariables')).not.toHaveLength(0);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('rechaza los elementos que no son string', async () => {
|
|
49
|
+
expect(await errorsOn({ slotVariables: ['code', 7] }, 'slotVariables')).not.toHaveLength(0);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { DeliveryChannelExtendedEnum, MessagingSlotEnum } from '../../../src/messagesConnector/index';
|
|
3
|
+
|
|
4
|
+
describe('DeliveryChannelExtendedEnum', () => {
|
|
5
|
+
it('incluye MDM junto a los tres canales que ya existían', () => {
|
|
6
|
+
expect(Object.values(DeliveryChannelExtendedEnum).sort()).toEqual([
|
|
7
|
+
'MAIL',
|
|
8
|
+
'MDM',
|
|
9
|
+
'PUSH_NOTIFICATION',
|
|
10
|
+
'SMS',
|
|
11
|
+
]);
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
it('cada clave es igual a su valor', () => {
|
|
15
|
+
for (const [key, value] of Object.entries(DeliveryChannelExtendedEnum)) {
|
|
16
|
+
expect(key).toBe(value);
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
describe('MessagingSlotEnum', () => {
|
|
22
|
+
it('tiene exactamente los tres momentos del contrato', () => {
|
|
23
|
+
expect(Object.values(MessagingSlotEnum).sort()).toEqual(['AFTERNOON', 'EVENING', 'MORNING']);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('cada clave es igual a su valor', () => {
|
|
27
|
+
for (const [key, value] of Object.entries(MessagingSlotEnum)) {
|
|
28
|
+
expect(key).toBe(value);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it('ningún valor lleva la hora: la hora vive en la agenda del tenant', () => {
|
|
33
|
+
for (const value of Object.values(MessagingSlotEnum)) {
|
|
34
|
+
expect(value).not.toMatch(/\d/);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
});
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MESSAGING_CANDIDATES_DEFAULT_LIMIT = exports.MESSAGING_CANDIDATES_MAX_LIMIT = void 0;
|
|
4
|
+
/** Tope de candidatos por página. Una cartera grande no cabe en una sola llamada. */
|
|
5
|
+
exports.MESSAGING_CANDIDATES_MAX_LIMIT = 100;
|
|
6
|
+
/** Tamaño de página cuando el caller no manda `limit`. */
|
|
7
|
+
exports.MESSAGING_CANDIDATES_DEFAULT_LIMIT = 50;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.STORE_DAY_MESSAGE = exports.STORE_DAY_PATTERN = void 0;
|
|
4
|
+
/** Día de tienda en la zona horaria del tenant, sin hora: `YYYY-MM-DD`. */
|
|
5
|
+
exports.STORE_DAY_PATTERN = /^\d{4}-\d{2}-\d{2}$/;
|
|
6
|
+
exports.STORE_DAY_MESSAGE = 'runDate debe ser un día de tienda en formato YYYY-MM-DD';
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { DeliveryChannelExtendedEnum, MessagingSlotEnum } from '../../messagesConnector/index';
|
|
2
|
+
import { MdmProviderEnum } from '../../mdm/enums/MdmProviderEnum';
|
|
3
|
+
/**
|
|
4
|
+
* Un candidato a recibir un mensaje: a quién, qué momento le toca y por dónde sale.
|
|
5
|
+
* Mensajería no resuelve nada de dominio con este ítem: solo elige la plantilla y entrega.
|
|
6
|
+
*/
|
|
7
|
+
export declare class MessagingCandidateItem {
|
|
8
|
+
/** El destinatario es la PERSONA. Siempre viaja. */
|
|
9
|
+
personId: string;
|
|
10
|
+
/**
|
|
11
|
+
* El crédito es el motivo del mensaje, no a quién se le manda.
|
|
12
|
+
* Va vacío en los avisos que no cuelgan de un crédito.
|
|
13
|
+
*/
|
|
14
|
+
creditId?: string;
|
|
15
|
+
/** Momento del catálogo de plantillas — parte de la PK de `TemplateMessages_GT`. */
|
|
16
|
+
messageType: string;
|
|
17
|
+
/** Momento de la corrida que produjo este candidato. */
|
|
18
|
+
slot: MessagingSlotEnum;
|
|
19
|
+
channel: DeliveryChannelExtendedEnum;
|
|
20
|
+
/**
|
|
21
|
+
* Variables del texto YA RESUELTAS. Mensajería no sabe qué es un crédito:
|
|
22
|
+
* si aquí viajara un id para que ella lo resuelva, cada mensaje sería otra llamada entre lambdas.
|
|
23
|
+
*/
|
|
24
|
+
variables: Record<string, string>;
|
|
25
|
+
/** Referencia de rastreo del candidato; el consumidor la usa para deduplicar. */
|
|
26
|
+
reference: string;
|
|
27
|
+
/** IMEI del equipo. Solo viaja cuando `channel` es `MDM`. */
|
|
28
|
+
imei?: string;
|
|
29
|
+
/** Proveedor MDM del equipo. Solo viaja cuando `channel` es `MDM`. */
|
|
30
|
+
mdmProvider?: MdmProviderEnum;
|
|
31
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MessagingCandidateItem = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Un candidato a recibir un mensaje: a quién, qué momento le toca y por dónde sale.
|
|
6
|
+
* Mensajería no resuelve nada de dominio con este ítem: solo elige la plantilla y entrega.
|
|
7
|
+
*/
|
|
8
|
+
class MessagingCandidateItem {
|
|
9
|
+
}
|
|
10
|
+
exports.MessagingCandidateItem = MessagingCandidateItem;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { MessagingSlotEnum } from '../../../messagesConnector/index';
|
|
2
|
+
/** Body de `POST /private/messaging/candidates` (loan-credit-business). Pide una página de candidatos. */
|
|
3
|
+
export declare class ListMessagingCandidatesRequest {
|
|
4
|
+
/** Qué horario disparó la corrida. El nombre del momento, nunca la hora. */
|
|
5
|
+
slot: MessagingSlotEnum;
|
|
6
|
+
/** Día de tienda de la corrida. Lo manda el caller: el cupo no puede salir del reloj del lambda. */
|
|
7
|
+
runDate: string;
|
|
8
|
+
/** Cursor opaco de la página anterior. Ausente en la primera página. */
|
|
9
|
+
cursor?: string;
|
|
10
|
+
limit?: number;
|
|
11
|
+
}
|
|
@@ -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.ListMessagingCandidatesRequest = 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 MessagingCandidateLimits_1 = require("../../constants/MessagingCandidateLimits");
|
|
17
|
+
const StoreDayPattern_1 = require("../../constants/StoreDayPattern");
|
|
18
|
+
/** Body de `POST /private/messaging/candidates` (loan-credit-business). Pide una página de candidatos. */
|
|
19
|
+
class ListMessagingCandidatesRequest {
|
|
20
|
+
}
|
|
21
|
+
exports.ListMessagingCandidatesRequest = ListMessagingCandidatesRequest;
|
|
22
|
+
__decorate([
|
|
23
|
+
(0, class_transformer_1.Expose)(),
|
|
24
|
+
(0, class_validator_1.IsEnum)(index_1.MessagingSlotEnum),
|
|
25
|
+
__metadata("design:type", String)
|
|
26
|
+
], ListMessagingCandidatesRequest.prototype, "slot", void 0);
|
|
27
|
+
__decorate([
|
|
28
|
+
(0, class_transformer_1.Expose)(),
|
|
29
|
+
(0, class_validator_1.Matches)(StoreDayPattern_1.STORE_DAY_PATTERN, { message: StoreDayPattern_1.STORE_DAY_MESSAGE }),
|
|
30
|
+
__metadata("design:type", String)
|
|
31
|
+
], ListMessagingCandidatesRequest.prototype, "runDate", void 0);
|
|
32
|
+
__decorate([
|
|
33
|
+
(0, class_transformer_1.Expose)(),
|
|
34
|
+
(0, class_validator_1.IsOptional)(),
|
|
35
|
+
(0, class_validator_1.IsString)(),
|
|
36
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
37
|
+
__metadata("design:type", String)
|
|
38
|
+
], ListMessagingCandidatesRequest.prototype, "cursor", void 0);
|
|
39
|
+
__decorate([
|
|
40
|
+
(0, class_transformer_1.Expose)(),
|
|
41
|
+
(0, class_validator_1.IsOptional)(),
|
|
42
|
+
(0, class_transformer_1.Type)(() => Number),
|
|
43
|
+
(0, class_validator_1.IsInt)(),
|
|
44
|
+
(0, class_validator_1.Min)(1),
|
|
45
|
+
(0, class_validator_1.Max)(MessagingCandidateLimits_1.MESSAGING_CANDIDATES_MAX_LIMIT),
|
|
46
|
+
__metadata("design:type", Number)
|
|
47
|
+
], ListMessagingCandidatesRequest.prototype, "limit", void 0);
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { MessagingCandidateItem } from '../MessagingCandidateItem';
|
|
2
|
+
/** Response de `POST /private/messaging/candidates`. Una página de candidatos. */
|
|
3
|
+
export declare class ListMessagingCandidatesResponse {
|
|
4
|
+
items: MessagingCandidateItem[];
|
|
5
|
+
/** Cursor de la siguiente página. `null` significa que ya no queda nadie — nunca `undefined`. */
|
|
6
|
+
nextCursor: string | null;
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ListMessagingCandidatesResponse = void 0;
|
|
4
|
+
/** Response de `POST /private/messaging/candidates`. Una página de candidatos. */
|
|
5
|
+
class ListMessagingCandidatesResponse {
|
|
6
|
+
}
|
|
7
|
+
exports.ListMessagingCandidatesResponse = ListMessagingCandidatesResponse;
|
|
@@ -82,3 +82,9 @@ export * from './dtos/responses/LoanDeviceNotifyResponse';
|
|
|
82
82
|
export * from './dtos/responses/LoanDeviceReleaseResult';
|
|
83
83
|
export * from './dtos/responses/LoanDeviceReleaseResponse';
|
|
84
84
|
export * from './validators/IsFutureIso8601DateTime';
|
|
85
|
+
export { MessagingSlotEnum } from '../messagesConnector/enums/MessagingSlotEnum';
|
|
86
|
+
export * from './constants/MessagingCandidateLimits';
|
|
87
|
+
export * from './constants/StoreDayPattern';
|
|
88
|
+
export * from './dtos/MessagingCandidateItem';
|
|
89
|
+
export * from './dtos/requests/ListMessagingCandidatesRequest';
|
|
90
|
+
export * from './dtos/responses/ListMessagingCandidatesResponse';
|
package/bin/loanCredit/index.js
CHANGED
|
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.MdmLockModeEnum = exports.DeviceLockScreenMessage = exports.MdmError = exports.DeviceReleaseReasonEnum = exports.MdmNoticeTypeEnum = exports.DeviceNotifyIntensityEnum = exports.DeviceEnrollmentModeEnum = exports.MdmProviderEnum = exports.MdmOperationTypeEnum = exports.MdmDeviceStatusEnum = exports.MdmOperationStatusEnum = exports.ClientLevelEnum = void 0;
|
|
17
|
+
exports.MessagingSlotEnum = exports.MdmLockModeEnum = exports.DeviceLockScreenMessage = exports.MdmError = exports.DeviceReleaseReasonEnum = exports.MdmNoticeTypeEnum = exports.DeviceNotifyIntensityEnum = exports.DeviceEnrollmentModeEnum = exports.MdmProviderEnum = exports.MdmOperationTypeEnum = exports.MdmDeviceStatusEnum = exports.MdmOperationStatusEnum = exports.ClientLevelEnum = void 0;
|
|
18
18
|
// Enums
|
|
19
19
|
__exportStar(require("./enums/LoanCreditStatusEnum"), exports);
|
|
20
20
|
__exportStar(require("./enums/LoanInstallmentStatusEnum"), exports);
|
|
@@ -118,3 +118,12 @@ __exportStar(require("./dtos/responses/LoanDeviceNotifyResponse"), exports);
|
|
|
118
118
|
__exportStar(require("./dtos/responses/LoanDeviceReleaseResult"), exports);
|
|
119
119
|
__exportStar(require("./dtos/responses/LoanDeviceReleaseResponse"), exports);
|
|
120
120
|
__exportStar(require("./validators/IsFutureIso8601DateTime"), exports);
|
|
121
|
+
// Candidatos de mensajería — contrato de `POST /private/messaging/candidates`
|
|
122
|
+
// Re-export del enum canónico del momento (owner: messagesConnector — un solo origen de verdad).
|
|
123
|
+
var MessagingSlotEnum_1 = require("../messagesConnector/enums/MessagingSlotEnum");
|
|
124
|
+
Object.defineProperty(exports, "MessagingSlotEnum", { enumerable: true, get: function () { return MessagingSlotEnum_1.MessagingSlotEnum; } });
|
|
125
|
+
__exportStar(require("./constants/MessagingCandidateLimits"), exports);
|
|
126
|
+
__exportStar(require("./constants/StoreDayPattern"), exports);
|
|
127
|
+
__exportStar(require("./dtos/MessagingCandidateItem"), exports);
|
|
128
|
+
__exportStar(require("./dtos/requests/ListMessagingCandidatesRequest"), exports);
|
|
129
|
+
__exportStar(require("./dtos/responses/ListMessagingCandidatesResponse"), exports);
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { DeliveryChannelExtendedEnum } from '../enums/DeliveryChannelExtendedEnum';
|
|
2
|
+
import { NotificationOriginEnum } from '../enums/NotificationOriginEnum';
|
|
2
3
|
export declare class NotificationQueueMessageRequestV2 {
|
|
4
|
+
/** Tenant emisor del mensaje. Si se omite, messages-business asume FIADO. */
|
|
5
|
+
tenantId?: string;
|
|
3
6
|
templateId: string;
|
|
4
7
|
channelType: DeliveryChannelExtendedEnum;
|
|
5
8
|
language: string;
|
|
@@ -10,4 +13,6 @@ export declare class NotificationQueueMessageRequestV2 {
|
|
|
10
13
|
variables: Record<string, string>;
|
|
11
14
|
referenceMessageId?: string;
|
|
12
15
|
data?: unknown;
|
|
16
|
+
/** Quien disparo la notificacion. Sin default: su ausencia ya significa EVENT. */
|
|
17
|
+
origin?: NotificationOriginEnum;
|
|
13
18
|
}
|
|
@@ -13,10 +13,17 @@ exports.NotificationQueueMessageRequestV2 = void 0;
|
|
|
13
13
|
const class_validator_1 = require("class-validator");
|
|
14
14
|
const class_transformer_1 = require("class-transformer");
|
|
15
15
|
const DeliveryChannelExtendedEnum_1 = require("../enums/DeliveryChannelExtendedEnum");
|
|
16
|
+
const NotificationOriginEnum_1 = require("../enums/NotificationOriginEnum");
|
|
16
17
|
const IsStringValueRecord_1 = require("../validators/IsStringValueRecord");
|
|
17
18
|
class NotificationQueueMessageRequestV2 {
|
|
18
19
|
}
|
|
19
20
|
exports.NotificationQueueMessageRequestV2 = NotificationQueueMessageRequestV2;
|
|
21
|
+
__decorate([
|
|
22
|
+
(0, class_transformer_1.Expose)(),
|
|
23
|
+
(0, class_validator_1.IsOptional)(),
|
|
24
|
+
(0, class_validator_1.IsString)(),
|
|
25
|
+
__metadata("design:type", String)
|
|
26
|
+
], NotificationQueueMessageRequestV2.prototype, "tenantId", void 0);
|
|
20
27
|
__decorate([
|
|
21
28
|
(0, class_transformer_1.Expose)(),
|
|
22
29
|
(0, class_validator_1.IsString)(),
|
|
@@ -75,3 +82,9 @@ __decorate([
|
|
|
75
82
|
(0, class_validator_1.IsOptional)(),
|
|
76
83
|
__metadata("design:type", Object)
|
|
77
84
|
], NotificationQueueMessageRequestV2.prototype, "data", void 0);
|
|
85
|
+
__decorate([
|
|
86
|
+
(0, class_transformer_1.Expose)(),
|
|
87
|
+
(0, class_validator_1.IsOptional)(),
|
|
88
|
+
(0, class_validator_1.IsEnum)(NotificationOriginEnum_1.NotificationOriginEnum),
|
|
89
|
+
__metadata("design:type", String)
|
|
90
|
+
], NotificationQueueMessageRequestV2.prototype, "origin", void 0);
|
|
@@ -1,16 +1,23 @@
|
|
|
1
|
-
import { ContentTypeEnum
|
|
1
|
+
import { ContentTypeEnum } from '../../messaging';
|
|
2
|
+
import { DeliveryChannelExtendedEnum } from '../enums/DeliveryChannelExtendedEnum';
|
|
2
3
|
/**
|
|
3
|
-
* Body para POST /templates (backoffice). Identifica un template por sus
|
|
4
|
-
* componentes de PK (messageType, channelType, language, country) +
|
|
5
|
-
* de contenido. `typeOfDirectoryId` es campo no-key del Row (ver TD pendiente).
|
|
4
|
+
* Body para POST /templates (backoffice). Identifica un template por sus 5
|
|
5
|
+
* componentes de PK (tenantId, messageType, channelType, language, country) +
|
|
6
|
+
* campos de contenido. `typeOfDirectoryId` es campo no-key del Row (ver TD pendiente).
|
|
6
7
|
*/
|
|
7
8
|
export declare class TemplateMessageCreateRequest {
|
|
9
|
+
/** Tenant al que pertenece la plantilla. Si se omite, se asume FIADO. */
|
|
10
|
+
tenantId?: string;
|
|
8
11
|
messageType: string;
|
|
9
|
-
channelType:
|
|
12
|
+
channelType: DeliveryChannelExtendedEnum;
|
|
10
13
|
language: string;
|
|
11
14
|
country: string;
|
|
12
15
|
typeOfDirectoryId: string;
|
|
13
16
|
template: string;
|
|
14
17
|
contentType: ContentTypeEnum;
|
|
15
18
|
subject?: string;
|
|
19
|
+
/** contentSid HX de Twilio. Solo en plantillas de WhatsApp. */
|
|
20
|
+
providerTemplateId?: string;
|
|
21
|
+
/** Que variable va en cada slot posicional de Twilio. Solo en plantillas de WhatsApp. */
|
|
22
|
+
slotVariables?: string[];
|
|
16
23
|
}
|
|
@@ -13,15 +13,22 @@ exports.TemplateMessageCreateRequest = void 0;
|
|
|
13
13
|
const class_transformer_1 = require("class-transformer");
|
|
14
14
|
const class_validator_1 = require("class-validator");
|
|
15
15
|
const messaging_1 = require("../../messaging");
|
|
16
|
+
const DeliveryChannelExtendedEnum_1 = require("../enums/DeliveryChannelExtendedEnum");
|
|
16
17
|
const IsTemplatePlaceholders_1 = require("../validators/IsTemplatePlaceholders");
|
|
17
18
|
/**
|
|
18
|
-
* Body para POST /templates (backoffice). Identifica un template por sus
|
|
19
|
-
* componentes de PK (messageType, channelType, language, country) +
|
|
20
|
-
* de contenido. `typeOfDirectoryId` es campo no-key del Row (ver TD pendiente).
|
|
19
|
+
* Body para POST /templates (backoffice). Identifica un template por sus 5
|
|
20
|
+
* componentes de PK (tenantId, messageType, channelType, language, country) +
|
|
21
|
+
* campos de contenido. `typeOfDirectoryId` es campo no-key del Row (ver TD pendiente).
|
|
21
22
|
*/
|
|
22
23
|
class TemplateMessageCreateRequest {
|
|
23
24
|
}
|
|
24
25
|
exports.TemplateMessageCreateRequest = TemplateMessageCreateRequest;
|
|
26
|
+
__decorate([
|
|
27
|
+
(0, class_transformer_1.Expose)(),
|
|
28
|
+
(0, class_validator_1.IsOptional)(),
|
|
29
|
+
(0, class_validator_1.IsString)(),
|
|
30
|
+
__metadata("design:type", String)
|
|
31
|
+
], TemplateMessageCreateRequest.prototype, "tenantId", void 0);
|
|
25
32
|
__decorate([
|
|
26
33
|
(0, class_transformer_1.Expose)(),
|
|
27
34
|
(0, class_validator_1.IsString)(),
|
|
@@ -30,7 +37,7 @@ __decorate([
|
|
|
30
37
|
], TemplateMessageCreateRequest.prototype, "messageType", void 0);
|
|
31
38
|
__decorate([
|
|
32
39
|
(0, class_transformer_1.Expose)(),
|
|
33
|
-
(0, class_validator_1.IsEnum)(
|
|
40
|
+
(0, class_validator_1.IsEnum)(DeliveryChannelExtendedEnum_1.DeliveryChannelExtendedEnum),
|
|
34
41
|
__metadata("design:type", String)
|
|
35
42
|
], TemplateMessageCreateRequest.prototype, "channelType", void 0);
|
|
36
43
|
__decorate([
|
|
@@ -70,3 +77,16 @@ __decorate([
|
|
|
70
77
|
(0, class_validator_1.Validate)(IsTemplatePlaceholders_1.IsTemplatePlaceholders),
|
|
71
78
|
__metadata("design:type", String)
|
|
72
79
|
], TemplateMessageCreateRequest.prototype, "subject", void 0);
|
|
80
|
+
__decorate([
|
|
81
|
+
(0, class_transformer_1.Expose)(),
|
|
82
|
+
(0, class_validator_1.IsOptional)(),
|
|
83
|
+
(0, class_validator_1.IsString)(),
|
|
84
|
+
__metadata("design:type", String)
|
|
85
|
+
], TemplateMessageCreateRequest.prototype, "providerTemplateId", void 0);
|
|
86
|
+
__decorate([
|
|
87
|
+
(0, class_transformer_1.Expose)(),
|
|
88
|
+
(0, class_validator_1.IsOptional)(),
|
|
89
|
+
(0, class_validator_1.IsArray)(),
|
|
90
|
+
(0, class_validator_1.IsString)({ each: true }),
|
|
91
|
+
__metadata("design:type", Array)
|
|
92
|
+
], TemplateMessageCreateRequest.prototype, "slotVariables", void 0);
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DeliveryChannelExtendedEnum } from '../enums/DeliveryChannelExtendedEnum';
|
|
2
2
|
/**
|
|
3
3
|
* Query string de GET /templates. Todos los filtros son opcionales; si todos
|
|
4
4
|
* estan vacios, lista todo (scan paginado). `limit` default 20, max 100.
|
|
5
5
|
*/
|
|
6
6
|
export declare class TemplateMessageListFiltersRequest {
|
|
7
|
+
/** Filtra por tenant. Si se omite, no filtra por tenant. */
|
|
8
|
+
tenantId?: string;
|
|
7
9
|
messageType?: string;
|
|
8
|
-
channelType?:
|
|
10
|
+
channelType?: DeliveryChannelExtendedEnum;
|
|
9
11
|
language?: string;
|
|
10
12
|
country?: string;
|
|
11
13
|
typeOfDirectoryId?: string;
|
|
@@ -12,7 +12,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
12
12
|
exports.TemplateMessageListFiltersRequest = void 0;
|
|
13
13
|
const class_transformer_1 = require("class-transformer");
|
|
14
14
|
const class_validator_1 = require("class-validator");
|
|
15
|
-
const
|
|
15
|
+
const DeliveryChannelExtendedEnum_1 = require("../enums/DeliveryChannelExtendedEnum");
|
|
16
16
|
/**
|
|
17
17
|
* Query string de GET /templates. Todos los filtros son opcionales; si todos
|
|
18
18
|
* estan vacios, lista todo (scan paginado). `limit` default 20, max 100.
|
|
@@ -20,6 +20,12 @@ const messaging_1 = require("../../messaging");
|
|
|
20
20
|
class TemplateMessageListFiltersRequest {
|
|
21
21
|
}
|
|
22
22
|
exports.TemplateMessageListFiltersRequest = TemplateMessageListFiltersRequest;
|
|
23
|
+
__decorate([
|
|
24
|
+
(0, class_transformer_1.Expose)(),
|
|
25
|
+
(0, class_validator_1.IsOptional)(),
|
|
26
|
+
(0, class_validator_1.IsString)(),
|
|
27
|
+
__metadata("design:type", String)
|
|
28
|
+
], TemplateMessageListFiltersRequest.prototype, "tenantId", void 0);
|
|
23
29
|
__decorate([
|
|
24
30
|
(0, class_transformer_1.Expose)(),
|
|
25
31
|
(0, class_validator_1.IsOptional)(),
|
|
@@ -29,7 +35,7 @@ __decorate([
|
|
|
29
35
|
__decorate([
|
|
30
36
|
(0, class_transformer_1.Expose)(),
|
|
31
37
|
(0, class_validator_1.IsOptional)(),
|
|
32
|
-
(0, class_validator_1.IsEnum)(
|
|
38
|
+
(0, class_validator_1.IsEnum)(DeliveryChannelExtendedEnum_1.DeliveryChannelExtendedEnum),
|
|
33
39
|
__metadata("design:type", String)
|
|
34
40
|
], TemplateMessageListFiltersRequest.prototype, "channelType", void 0);
|
|
35
41
|
__decorate([
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { ContentTypeEnum
|
|
1
|
+
import { ContentTypeEnum } from '../../messaging';
|
|
2
|
+
import { DeliveryChannelExtendedEnum } from '../enums/DeliveryChannelExtendedEnum';
|
|
2
3
|
/**
|
|
3
4
|
* Forma del template retornada por GET /templates/{id}, POST, PUT.
|
|
4
5
|
* El `id` es opaco (base64url de la PK compuesta) y el cliente lo trata como
|
|
@@ -8,14 +9,20 @@ import { ContentTypeEnum, DeliveryChannelEnum } from '../../messaging';
|
|
|
8
9
|
export declare class TemplateMessageResponse {
|
|
9
10
|
id: string;
|
|
10
11
|
pk: string;
|
|
12
|
+
/** Tenant al que pertenece la plantilla. Ausente en las plantillas legacy de FIADO. */
|
|
13
|
+
tenantId?: string;
|
|
11
14
|
messageType: string;
|
|
12
|
-
channelType:
|
|
15
|
+
channelType: DeliveryChannelExtendedEnum;
|
|
13
16
|
language: string;
|
|
14
17
|
country: string;
|
|
15
18
|
typeOfDirectoryId: string;
|
|
16
19
|
template: string;
|
|
17
20
|
contentType: ContentTypeEnum;
|
|
18
21
|
subject?: string;
|
|
22
|
+
/** contentSid HX de Twilio. Solo en plantillas de WhatsApp. */
|
|
23
|
+
providerTemplateId?: string;
|
|
24
|
+
/** Que variable va en cada slot posicional de Twilio. Solo en plantillas de WhatsApp. */
|
|
25
|
+
slotVariables?: string[];
|
|
19
26
|
createdAt: number;
|
|
20
27
|
updatedAt: number;
|
|
21
28
|
createdBy?: string;
|