@fiado/type-kit 3.361.0 → 3.363.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.
@@ -0,0 +1,41 @@
1
+ import 'reflect-metadata';
2
+ import { plainToInstance } from 'class-transformer';
3
+ import { validate } from 'class-validator';
4
+ import { ActivationCheckRequest } from '../../../../src/loanCredit/dtos/requests/ActivationCheckRequest';
5
+
6
+ /** IMEI real con Luhn válido: el motor lo valida y un dígito inventado lo haría fallar. */
7
+ const IMEI = '351756051523999';
8
+
9
+ /** El SKU llega desde la ficha comercial que el wizard congeló en el paso 03. */
10
+ const PRODUCT_SKU = 'SKU-MOTO-G54-128';
11
+
12
+ /**
13
+ * `whitelist: true` es lo que corre el motor en `validateRequest`: una propiedad sin decorador de
14
+ * validación se borra del DTO, y el expediente MDM se queda sin SKU.
15
+ */
16
+ const validateWhitelisted = (body: object) => {
17
+ const dto = plainToInstance(ActivationCheckRequest, body);
18
+ return validate(dto, { whitelist: true, forbidNonWhitelisted: false }).then(errors => ({ dto, errors }));
19
+ };
20
+
21
+ describe('ActivationCheckRequest', () => {
22
+ it('conserva productSku al validar con whitelist', async () => {
23
+ const { dto, errors } = await validateWhitelisted({ imei: IMEI, imeiEnrolled: true, productSku: PRODUCT_SKU });
24
+
25
+ expect(errors).toEqual([]);
26
+ expect(dto.productSku).toBe(PRODUCT_SKU);
27
+ });
28
+
29
+ it('acepta el request sin productSku: la vía de activación puede no conocerlo', async () => {
30
+ const { dto, errors } = await validateWhitelisted({ imei: IMEI, imeiEnrolled: true });
31
+
32
+ expect(errors).toEqual([]);
33
+ expect(dto.productSku).toBeUndefined();
34
+ });
35
+
36
+ it('rechaza un productSku que no es string', async () => {
37
+ const { errors } = await validateWhitelisted({ imei: IMEI, productSku: 42 });
38
+
39
+ expect(errors.some(error => error.property === 'productSku')).toBe(true);
40
+ });
41
+ });
@@ -18,4 +18,6 @@ export declare class ActivationCheckRequest {
18
18
  lockVerified?: boolean;
19
19
  /** IMEI del equipo (paso 09) si no se fijó en el originate. Luhn-validado por el motor. */
20
20
  imei?: string;
21
+ /** SKU del producto vendido (paso 09). Lo congela el expediente MDM al enrolar. */
22
+ productSku?: string;
21
23
  }
@@ -50,3 +50,9 @@ __decorate([
50
50
  (0, class_validator_1.IsString)(),
51
51
  __metadata("design:type", String)
52
52
  ], ActivationCheckRequest.prototype, "imei", void 0);
53
+ __decorate([
54
+ (0, class_transformer_1.Expose)(),
55
+ (0, class_validator_1.IsOptional)(),
56
+ (0, class_validator_1.IsString)(),
57
+ __metadata("design:type", String)
58
+ ], ActivationCheckRequest.prototype, "productSku", void 0);
@@ -1,11 +1,11 @@
1
1
  /**
2
2
  * Body de `POST /private/webhook-deliveries/redeliver` — reposición manual de un evento.
3
- * El `payload` viaja en el request porque la bitácora guarda el desenlace, nunca el evento: de la
4
- * fila salen el tipo, el origen y el destinatario; el contenido lo repone quien lo produjo.
3
+ * El `payload` es opcional: la bitácora guarda el evento en bruto en su propio ítem, con vencimiento
4
+ * más corto que el asiento. Sólo hace falta mandarlo cuando ese bruto ya venció.
5
5
  */
6
6
  export declare class RedeliverWebhookEventRequest {
7
7
  eventId: string;
8
- payload: unknown;
8
+ payload?: unknown;
9
9
  /** Quién dispara el reenvío, para el log de la reposición. */
10
10
  actor?: string;
11
11
  }
@@ -15,8 +15,8 @@ const class_validator_1 = require("class-validator");
15
15
  const WebhookFieldLimits_1 = require("../../constants/WebhookFieldLimits");
16
16
  /**
17
17
  * Body de `POST /private/webhook-deliveries/redeliver` — reposición manual de un evento.
18
- * El `payload` viaja en el request porque la bitácora guarda el desenlace, nunca el evento: de la
19
- * fila salen el tipo, el origen y el destinatario; el contenido lo repone quien lo produjo.
18
+ * El `payload` es opcional: la bitácora guarda el evento en bruto en su propio ítem, con vencimiento
19
+ * más corto que el asiento. Sólo hace falta mandarlo cuando ese bruto ya venció.
20
20
  */
21
21
  class RedeliverWebhookEventRequest {
22
22
  }
@@ -30,6 +30,7 @@ __decorate([
30
30
  ], RedeliverWebhookEventRequest.prototype, "eventId", void 0);
31
31
  __decorate([
32
32
  (0, class_transformer_1.Expose)(),
33
+ (0, class_validator_1.IsOptional)(),
33
34
  (0, class_validator_1.IsObject)(),
34
35
  (0, class_validator_1.IsNotEmptyObject)(),
35
36
  __metadata("design:type", Object)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fiado/type-kit",
3
- "version": "3.361.0",
3
+ "version": "3.363.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "types": "bin/index.d.ts",
@@ -36,4 +36,10 @@ export class ActivationCheckRequest {
36
36
  @IsOptional()
37
37
  @IsString()
38
38
  imei?: string;
39
+
40
+ /** SKU del producto vendido (paso 09). Lo congela el expediente MDM al enrolar. */
41
+ @Expose()
42
+ @IsOptional()
43
+ @IsString()
44
+ productSku?: string;
39
45
  }
@@ -4,8 +4,8 @@ import { WEBHOOK_EVENT_ID_MAX_LENGTH } from '../../constants/WebhookFieldLimits'
4
4
 
5
5
  /**
6
6
  * Body de `POST /private/webhook-deliveries/redeliver` — reposición manual de un evento.
7
- * El `payload` viaja en el request porque la bitácora guarda el desenlace, nunca el evento: de la
8
- * fila salen el tipo, el origen y el destinatario; el contenido lo repone quien lo produjo.
7
+ * El `payload` es opcional: la bitácora guarda el evento en bruto en su propio ítem, con vencimiento
8
+ * más corto que el asiento. Sólo hace falta mandarlo cuando ese bruto ya venció.
9
9
  */
10
10
  export class RedeliverWebhookEventRequest {
11
11
  @Expose()
@@ -15,9 +15,10 @@ export class RedeliverWebhookEventRequest {
15
15
  eventId!: string;
16
16
 
17
17
  @Expose()
18
+ @IsOptional()
18
19
  @IsObject()
19
20
  @IsNotEmptyObject()
20
- payload!: unknown;
21
+ payload?: unknown;
21
22
 
22
23
  /** Quién dispara el reenvío, para el log de la reposición. */
23
24
  @Expose()