@fiado/type-kit 3.540.0 → 3.542.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.
Files changed (141) hide show
  1. package/_test_/unit/rules/populationDtos.test.ts +58 -0
  2. package/_test_/unit/rules/populationMove.test.ts +31 -0
  3. package/bin/card/dtos/CardAuditInfo.d.ts +19 -0
  4. package/bin/card/dtos/CardAuditInfo.js +2 -0
  5. package/bin/card/enums/CardAuditActorType.d.ts +15 -0
  6. package/bin/card/enums/CardAuditActorType.js +19 -0
  7. package/bin/card/index.d.ts +2 -0
  8. package/bin/card/index.js +2 -0
  9. package/bin/rewardsEligibility/constants/SegmentLimits.d.ts +1 -5
  10. package/bin/rewardsEligibility/constants/SegmentLimits.js +15 -6
  11. package/bin/rewardsEligibility/dtos/backoffice/segments/PopulationSegmentDefinition.d.ts +1 -8
  12. package/bin/rewardsEligibility/dtos/backoffice/segments/PopulationSegmentDefinition.js +14 -37
  13. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentAggregateCondition.d.ts +1 -18
  14. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentAggregateCondition.js +14 -68
  15. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentColumnCondition.d.ts +1 -11
  16. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentColumnCondition.js +14 -43
  17. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentGroup.d.ts +1 -9
  18. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentGroup.js +14 -41
  19. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentParam.d.ts +1 -10
  20. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentParam.js +15 -5
  21. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentSchemaResponse.d.ts +1 -10
  22. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentSchemaResponse.js +15 -8
  23. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentTableSchemaResponse.d.ts +1 -12
  24. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentTableSchemaResponse.js +15 -7
  25. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentUsedColumn.d.ts +1 -5
  26. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentUsedColumn.js +15 -4
  27. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentWindow.d.ts +1 -5
  28. package/bin/rewardsEligibility/dtos/backoffice/segments/SegmentWindow.js +14 -28
  29. package/bin/rewardsEligibility/enums/SegmentAggregateFnEnum.d.ts +1 -5
  30. package/bin/rewardsEligibility/enums/SegmentAggregateFnEnum.js +15 -7
  31. package/bin/rewardsEligibility/enums/SegmentConditionKindEnum.d.ts +1 -4
  32. package/bin/rewardsEligibility/enums/SegmentConditionKindEnum.js +15 -6
  33. package/bin/rewardsEligibility/enums/SegmentMatchEnum.d.ts +1 -4
  34. package/bin/rewardsEligibility/enums/SegmentMatchEnum.js +15 -6
  35. package/bin/rewardsEligibility/enums/SegmentOperatorEnum.d.ts +1 -16
  36. package/bin/rewardsEligibility/enums/SegmentOperatorEnum.js +15 -18
  37. package/bin/rewardsEligibility/enums/SegmentParamSourceEnum.d.ts +1 -5
  38. package/bin/rewardsEligibility/enums/SegmentParamSourceEnum.js +15 -7
  39. package/bin/rewardsEligibility/enums/SegmentParamTypeEnum.d.ts +1 -7
  40. package/bin/rewardsEligibility/enums/SegmentParamTypeEnum.js +15 -9
  41. package/bin/rules/constants/SegmentLimits.d.ts +5 -0
  42. package/bin/rules/constants/SegmentLimits.js +8 -0
  43. package/bin/rules/dtos/population/PopulationCompileRequest.d.ts +6 -0
  44. package/bin/rules/dtos/population/PopulationCompileRequest.js +32 -0
  45. package/bin/rules/dtos/population/PopulationCompileResponse.d.ts +9 -0
  46. package/bin/rules/dtos/population/PopulationCompileResponse.js +6 -0
  47. package/bin/rules/dtos/population/PopulationExecutionPageResponse.d.ts +10 -0
  48. package/bin/rules/dtos/population/PopulationExecutionPageResponse.js +7 -0
  49. package/bin/rules/dtos/population/PopulationExecutionRequest.d.ts +10 -0
  50. package/bin/rules/dtos/population/PopulationExecutionRequest.js +59 -0
  51. package/bin/rules/dtos/population/PopulationExecutionResponse.d.ts +5 -0
  52. package/bin/rules/dtos/population/PopulationExecutionResponse.js +6 -0
  53. package/bin/rules/dtos/population/PopulationSegmentDefinition.d.ts +8 -0
  54. package/bin/rules/dtos/population/PopulationSegmentDefinition.js +40 -0
  55. package/bin/rules/dtos/population/PopulationTestRequest.d.ts +7 -0
  56. package/bin/rules/dtos/population/PopulationTestRequest.js +38 -0
  57. package/bin/rules/dtos/population/PopulationTestResponse.d.ts +26 -0
  58. package/bin/rules/dtos/population/PopulationTestResponse.js +13 -0
  59. package/bin/rules/dtos/population/SegmentAggregateCondition.d.ts +18 -0
  60. package/bin/rules/dtos/population/SegmentAggregateCondition.js +71 -0
  61. package/bin/rules/dtos/population/SegmentColumnCondition.d.ts +11 -0
  62. package/bin/rules/dtos/population/SegmentColumnCondition.js +46 -0
  63. package/bin/rules/dtos/population/SegmentGroup.d.ts +9 -0
  64. package/bin/rules/dtos/population/SegmentGroup.js +44 -0
  65. package/bin/rules/dtos/population/SegmentParam.d.ts +10 -0
  66. package/bin/rules/dtos/population/SegmentParam.js +7 -0
  67. package/bin/rules/dtos/population/SegmentSchemaResponse.d.ts +10 -0
  68. package/bin/rules/dtos/population/SegmentSchemaResponse.js +10 -0
  69. package/bin/rules/dtos/population/SegmentTableSchemaResponse.d.ts +12 -0
  70. package/bin/rules/dtos/population/SegmentTableSchemaResponse.js +9 -0
  71. package/bin/rules/dtos/population/SegmentUsedColumn.d.ts +5 -0
  72. package/bin/rules/dtos/population/SegmentUsedColumn.js +6 -0
  73. package/bin/rules/dtos/population/SegmentWindow.d.ts +5 -0
  74. package/bin/rules/dtos/population/SegmentWindow.js +31 -0
  75. package/bin/rules/enums/PopulationErrorCodeEnum.d.ts +12 -0
  76. package/bin/rules/enums/PopulationErrorCodeEnum.js +16 -0
  77. package/bin/rules/enums/PopulationExecutionStatusEnum.d.ts +6 -0
  78. package/bin/rules/enums/PopulationExecutionStatusEnum.js +10 -0
  79. package/bin/rules/enums/PopulationTestStatusEnum.d.ts +5 -0
  80. package/bin/rules/enums/PopulationTestStatusEnum.js +9 -0
  81. package/bin/rules/enums/SegmentAggregateFnEnum.d.ts +5 -0
  82. package/bin/rules/enums/SegmentAggregateFnEnum.js +9 -0
  83. package/bin/rules/enums/SegmentConditionKindEnum.d.ts +4 -0
  84. package/bin/rules/enums/SegmentConditionKindEnum.js +8 -0
  85. package/bin/rules/enums/SegmentMatchEnum.d.ts +4 -0
  86. package/bin/rules/enums/SegmentMatchEnum.js +8 -0
  87. package/bin/rules/enums/SegmentOperatorEnum.d.ts +16 -0
  88. package/bin/rules/enums/SegmentOperatorEnum.js +20 -0
  89. package/bin/rules/enums/SegmentParamSourceEnum.d.ts +5 -0
  90. package/bin/rules/enums/SegmentParamSourceEnum.js +9 -0
  91. package/bin/rules/enums/SegmentParamTypeEnum.d.ts +7 -0
  92. package/bin/rules/enums/SegmentParamTypeEnum.js +11 -0
  93. package/bin/rules/index.d.ts +26 -0
  94. package/bin/rules/index.js +28 -0
  95. package/package.json +1 -1
  96. package/src/card/dtos/CardAuditInfo.ts +20 -0
  97. package/src/card/enums/CardAuditActorType.ts +15 -0
  98. package/src/card/index.ts +2 -0
  99. package/src/rewardsEligibility/constants/SegmentLimits.ts +1 -5
  100. package/src/rewardsEligibility/dtos/backoffice/segments/PopulationSegmentDefinition.ts +1 -12
  101. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentAggregateCondition.ts +1 -22
  102. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentColumnCondition.ts +1 -15
  103. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentGroup.ts +1 -27
  104. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentParam.ts +1 -11
  105. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentSchemaResponse.ts +1 -11
  106. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentTableSchemaResponse.ts +1 -14
  107. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentUsedColumn.ts +1 -5
  108. package/src/rewardsEligibility/dtos/backoffice/segments/SegmentWindow.ts +1 -9
  109. package/src/rewardsEligibility/enums/SegmentAggregateFnEnum.ts +1 -5
  110. package/src/rewardsEligibility/enums/SegmentConditionKindEnum.ts +1 -4
  111. package/src/rewardsEligibility/enums/SegmentMatchEnum.ts +1 -4
  112. package/src/rewardsEligibility/enums/SegmentOperatorEnum.ts +1 -16
  113. package/src/rewardsEligibility/enums/SegmentParamSourceEnum.ts +1 -5
  114. package/src/rewardsEligibility/enums/SegmentParamTypeEnum.ts +1 -7
  115. package/src/rules/constants/SegmentLimits.ts +5 -0
  116. package/src/rules/dtos/population/PopulationCompileRequest.ts +9 -0
  117. package/src/rules/dtos/population/PopulationCompileResponse.ts +10 -0
  118. package/src/rules/dtos/population/PopulationExecutionPageResponse.ts +11 -0
  119. package/src/rules/dtos/population/PopulationExecutionRequest.ts +13 -0
  120. package/src/rules/dtos/population/PopulationExecutionResponse.ts +6 -0
  121. package/src/rules/dtos/population/PopulationSegmentDefinition.ts +12 -0
  122. package/src/rules/dtos/population/PopulationTestRequest.ts +10 -0
  123. package/src/rules/dtos/population/PopulationTestResponse.ts +29 -0
  124. package/src/rules/dtos/population/SegmentAggregateCondition.ts +22 -0
  125. package/src/rules/dtos/population/SegmentColumnCondition.ts +15 -0
  126. package/src/rules/dtos/population/SegmentGroup.ts +27 -0
  127. package/src/rules/dtos/population/SegmentParam.ts +11 -0
  128. package/src/rules/dtos/population/SegmentSchemaResponse.ts +11 -0
  129. package/src/rules/dtos/population/SegmentTableSchemaResponse.ts +14 -0
  130. package/src/rules/dtos/population/SegmentUsedColumn.ts +5 -0
  131. package/src/rules/dtos/population/SegmentWindow.ts +9 -0
  132. package/src/rules/enums/PopulationErrorCodeEnum.ts +12 -0
  133. package/src/rules/enums/PopulationExecutionStatusEnum.ts +6 -0
  134. package/src/rules/enums/PopulationTestStatusEnum.ts +5 -0
  135. package/src/rules/enums/SegmentAggregateFnEnum.ts +5 -0
  136. package/src/rules/enums/SegmentConditionKindEnum.ts +4 -0
  137. package/src/rules/enums/SegmentMatchEnum.ts +4 -0
  138. package/src/rules/enums/SegmentOperatorEnum.ts +16 -0
  139. package/src/rules/enums/SegmentParamSourceEnum.ts +5 -0
  140. package/src/rules/enums/SegmentParamTypeEnum.ts +7 -0
  141. package/src/rules/index.ts +30 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fiado/type-kit",
3
- "version": "3.540.0",
3
+ "version": "3.542.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "types": "bin/index.d.ts",
@@ -0,0 +1,20 @@
1
+ import { CardAuditActorType } from "../enums/CardAuditActorType";
2
+ import { Status } from "../enums/Status";
3
+
4
+ /**
5
+ * Traza aditiva del último cambio de una tarjeta. Se guarda en `createdBy` (una sola vez, al
6
+ * crear la fila) y en `updatedBy` (se reescribe en cada cambio). El histórico completo vive en el
7
+ * datalake, no aquí. Las filas anteriores a este campo simplemente no lo traen.
8
+ */
9
+ export interface CardAuditInfo {
10
+ actorType: CardAuditActorType;
11
+ /** email (BACKOFFICE/AGENT), "<proveedor>:<event_type>" (WEBHOOK), componente (SYSTEM). Vacío para USER. */
12
+ actorId?: string;
13
+ /** Operación de negocio: CHANGE_STATUS, ACTIVATE, CREATE, REPLACE, SHIPPING_UPDATE, PIN_UPDATE, ... */
14
+ action: string;
15
+ /** Status anterior y nuevo, solo cuando la operación cambia el status. */
16
+ from?: Status;
17
+ to?: Status;
18
+ /** ISO 8601. */
19
+ at: string;
20
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Quién originó el último cambio de una tarjeta (`createdBy` / `updatedBy`).
3
+ *
4
+ * - USER: el dueño desde la app; no lleva actorId porque el directoryId ya está en la fila.
5
+ * - BACKOFFICE / AGENT: persona con sesión W4; actorId = email del AuthContext.
6
+ * - WEBHOOK: evento del emisor (CP, Pomelo); actorId = "<proveedor>:<event_type>".
7
+ * - SYSTEM: proceso interno sin usuario (colas, cron, callbacks); actorId = componente.
8
+ */
9
+ export enum CardAuditActorType {
10
+ USER = "USER",
11
+ BACKOFFICE = "BACKOFFICE",
12
+ AGENT = "AGENT",
13
+ WEBHOOK = "WEBHOOK",
14
+ SYSTEM = "SYSTEM"
15
+ }
package/src/card/index.ts CHANGED
@@ -78,3 +78,5 @@ export * from './enums/CardReasonStatus'
78
78
  export * from './enums/KycReason'
79
79
  export * from './enums/PinChangedStatus'
80
80
  export * from './constants/LevelOneAutoIssuanceTags';
81
+ export * from './enums/CardAuditActorType';
82
+ export * from './dtos/CardAuditInfo';
@@ -1,5 +1 @@
1
- /** Identificador SQL permitido para tabla/columna (A§4.3 paso 1): minusculas, digitos y guion bajo; nunca texto libre. */
2
- export const SEGMENT_IDENTIFIER_PATTERN = /^[a-z_][a-z0-9_]*$/;
3
- export const SEGMENT_MAX_DAYS = 365;
4
- export const SEGMENT_MAX_PARAMS = 40;
5
- export const SEGMENT_MAX_AGGREGATES = 8;
1
+ export * from '../../rules/constants/SegmentLimits';
@@ -1,12 +1 @@
1
- import { Expose, Type } from 'class-transformer';
2
- import { ArrayMaxSize, ArrayMinSize, IsArray, IsEnum, Matches, ValidateNested } from 'class-validator';
3
- import { SEGMENT_IDENTIFIER_PATTERN } from '../../../constants/SegmentLimits';
4
- import { SegmentMatchEnum } from '../../../enums/SegmentMatchEnum';
5
- import { SegmentGroup } from './SegmentGroup';
6
-
7
- /** El constructor tal cual (A§4.1): tabla ancla (una fila -> un directoryid), TODAS/ALGUNA global y grupos con su propio TODAS/ALGUNA. */
8
- export class PopulationSegmentDefinition {
9
- @Expose() @Matches(SEGMENT_IDENTIFIER_PATTERN) baseTable: string;
10
- @Expose() @IsEnum(SegmentMatchEnum) match: SegmentMatchEnum;
11
- @Expose() @IsArray() @ArrayMinSize(1) @ArrayMaxSize(10) @ValidateNested({ each: true }) @Type(() => SegmentGroup) groups: SegmentGroup[];
12
- }
1
+ export * from '../../../../rules/dtos/population/PopulationSegmentDefinition';
@@ -1,22 +1 @@
1
- import { Expose, Type } from 'class-transformer';
2
- import { ArrayMaxSize, Equals, IsArray, IsEnum, IsNumber, IsOptional, Matches, ValidateNested } from 'class-validator';
3
- import { SEGMENT_IDENTIFIER_PATTERN } from '../../../constants/SegmentLimits';
4
- import { SegmentAggregateFnEnum } from '../../../enums/SegmentAggregateFnEnum';
5
- import { SegmentConditionKindEnum } from '../../../enums/SegmentConditionKindEnum';
6
- import { SegmentOperatorEnum } from '../../../enums/SegmentOperatorEnum';
7
- import { SegmentColumnCondition } from './SegmentColumnCondition';
8
- import { SegmentWindow } from './SegmentWindow';
9
-
10
- /** (b) Agregado con ventana relativa sobre una tabla relacionada (existe / cuenta / suma). `filters` elige QUE cuenta (estados, moneda...). */
11
- export class SegmentAggregateCondition {
12
- @Expose() @Equals(SegmentConditionKindEnum.AGGREGATE) kind: SegmentConditionKindEnum.AGGREGATE;
13
- @Expose() @Matches(SEGMENT_IDENTIFIER_PATTERN) table: string;
14
- @Expose() @IsEnum(SegmentAggregateFnEnum) fn: SegmentAggregateFnEnum;
15
- /** Solo SUM. */
16
- @Expose() @IsOptional() @Matches(SEGMENT_IDENTIFIER_PATTERN) column?: string;
17
- /** COUNT y SUM; EXISTS no lleva. */
18
- @Expose() @IsOptional() @IsEnum(SegmentOperatorEnum) op?: SegmentOperatorEnum;
19
- @Expose() @IsOptional() @IsNumber() value?: number;
20
- @Expose() @ValidateNested() @Type(() => SegmentWindow) window: SegmentWindow;
21
- @Expose() @IsArray() @ArrayMaxSize(10) @ValidateNested({ each: true }) @Type(() => SegmentColumnCondition) filters: SegmentColumnCondition[];
22
- }
1
+ export * from '../../../../rules/dtos/population/SegmentAggregateCondition';
@@ -1,15 +1 @@
1
- import { Expose } from 'class-transformer';
2
- import { Equals, IsEnum, IsOptional, Matches } from 'class-validator';
3
- import { JsonValue } from '../../../../common';
4
- import { SEGMENT_IDENTIFIER_PATTERN } from '../../../constants/SegmentLimits';
5
- import { SegmentConditionKindEnum } from '../../../enums/SegmentConditionKindEnum';
6
- import { SegmentOperatorEnum } from '../../../enums/SegmentOperatorEnum';
7
-
8
- /** (a) Columna de una tabla unida por `directoryid`. El tipo de `value` (escalar, lista o `{days}`) lo valida el compilador contra el tipo de Glue. */
9
- export class SegmentColumnCondition {
10
- @Expose() @Equals(SegmentConditionKindEnum.COLUMN) kind: SegmentConditionKindEnum.COLUMN;
11
- @Expose() @Matches(SEGMENT_IDENTIFIER_PATTERN) table: string;
12
- @Expose() @Matches(SEGMENT_IDENTIFIER_PATTERN) column: string;
13
- @Expose() @IsEnum(SegmentOperatorEnum) op: SegmentOperatorEnum;
14
- @Expose() @IsOptional() value?: JsonValue;
15
- }
1
+ export * from '../../../../rules/dtos/population/SegmentColumnCondition';
@@ -1,27 +1 @@
1
- import { Expose, Type } from 'class-transformer';
2
- import { ArrayMaxSize, ArrayMinSize, IsArray, IsEnum, ValidateNested } from 'class-validator';
3
- import { SegmentConditionKindEnum } from '../../../enums/SegmentConditionKindEnum';
4
- import { SegmentMatchEnum } from '../../../enums/SegmentMatchEnum';
5
- import { SegmentAggregateCondition } from './SegmentAggregateCondition';
6
- import { SegmentColumnCondition } from './SegmentColumnCondition';
7
-
8
- export type SegmentCondition = SegmentColumnCondition | SegmentAggregateCondition;
9
-
10
- export class SegmentGroup {
11
- @Expose() @IsEnum(SegmentMatchEnum) match: SegmentMatchEnum;
12
-
13
- /** `kind` decide la clase; un `kind` desconocido NO se instancia y la validacion lo rechaza (el objeto queda sin `@Equals` valido). */
14
- @Expose()
15
- @IsArray() @ArrayMinSize(1) @ArrayMaxSize(20) @ValidateNested({ each: true })
16
- @Type(() => Object, {
17
- keepDiscriminatorProperty: true,
18
- discriminator: {
19
- property: 'kind',
20
- subTypes: [
21
- { value: SegmentColumnCondition, name: SegmentConditionKindEnum.COLUMN },
22
- { value: SegmentAggregateCondition, name: SegmentConditionKindEnum.AGGREGATE },
23
- ],
24
- },
25
- })
26
- conditions: SegmentCondition[];
27
- }
1
+ export * from '../../../../rules/dtos/population/SegmentGroup';
@@ -1,11 +1 @@
1
- import { SegmentParamSourceEnum } from '../../../enums/SegmentParamSourceEnum';
2
- import { SegmentParamTypeEnum } from '../../../enums/SegmentParamTypeEnum';
3
-
4
- /** Un `?` del SQL, en orden. LITERAL lleva `value` como texto canonico; REFERENCE_AT_MINUS_DAYS lleva `days`. */
5
- export class SegmentParam {
6
- name: string;
7
- type: SegmentParamTypeEnum;
8
- source: SegmentParamSourceEnum;
9
- value?: string;
10
- days?: number;
11
- }
1
+ export * from '../../../../rules/dtos/population/SegmentParam';
@@ -1,11 +1 @@
1
- export class SegmentSchemaTableResponse {
2
- table: string;
3
- joinKey: string;
4
- columnCount: number;
5
- }
6
-
7
- /** `available: false` = ambiente sin datalake accesible: el constructor muestra "no disponible". */
8
- export class SegmentSchemaResponse {
9
- available: boolean;
10
- tables: SegmentSchemaTableResponse[];
11
- }
1
+ export * from '../../../../rules/dtos/population/SegmentSchemaResponse';
@@ -1,14 +1 @@
1
- import { SegmentOperatorEnum } from '../../../enums/SegmentOperatorEnum';
2
-
3
- export class SegmentColumnSchemaResponse {
4
- name: string;
5
- type: string;
6
- isDate: boolean;
7
- operators: SegmentOperatorEnum[];
8
- }
9
-
10
- export class SegmentTableSchemaResponse {
11
- table: string;
12
- joinKey: string;
13
- columns: SegmentColumnSchemaResponse[];
14
- }
1
+ export * from '../../../../rules/dtos/population/SegmentTableSchemaResponse';
@@ -1,5 +1 @@
1
- export class SegmentUsedColumn {
2
- table: string;
3
- column: string;
4
- type: string;
5
- }
1
+ export * from '../../../../rules/dtos/population/SegmentUsedColumn';
@@ -1,9 +1 @@
1
- import { Expose } from 'class-transformer';
2
- import { IsInt, Matches, Max, Min } from 'class-validator';
3
- import { SEGMENT_IDENTIFIER_PATTERN, SEGMENT_MAX_DAYS } from '../../../constants/SegmentLimits';
4
-
5
- /** Ventana relativa [referenceAt - days, referenceAt) sobre una columna de fecha (A§4.1). */
6
- export class SegmentWindow {
7
- @Expose() @Matches(SEGMENT_IDENTIFIER_PATTERN) dateColumn: string;
8
- @Expose() @IsInt() @Min(1) @Max(SEGMENT_MAX_DAYS) days: number;
9
- }
1
+ export * from '../../../../rules/dtos/population/SegmentWindow';
@@ -1,5 +1 @@
1
- export enum SegmentAggregateFnEnum {
2
- EXISTS = 'EXISTS',
3
- COUNT = 'COUNT',
4
- SUM = 'SUM',
5
- }
1
+ export * from '../../rules/enums/SegmentAggregateFnEnum';
@@ -1,4 +1 @@
1
- export enum SegmentConditionKindEnum {
2
- COLUMN = 'COLUMN',
3
- AGGREGATE = 'AGGREGATE',
4
- }
1
+ export * from '../../rules/enums/SegmentConditionKindEnum';
@@ -1,4 +1 @@
1
- export enum SegmentMatchEnum {
2
- ALL = 'ALL',
3
- ANY = 'ANY',
4
- }
1
+ export * from '../../rules/enums/SegmentMatchEnum';
@@ -1,16 +1 @@
1
- export enum SegmentOperatorEnum {
2
- EQUALS = 'EQUALS',
3
- NOT_EQUALS = 'NOT_EQUALS',
4
- IN = 'IN',
5
- NOT_IN = 'NOT_IN',
6
- IS_NULL = 'IS_NULL',
7
- IS_NOT_NULL = 'IS_NOT_NULL',
8
- GT = 'GT',
9
- GTE = 'GTE',
10
- LT = 'LT',
11
- LTE = 'LTE',
12
- CONTAINS = 'CONTAINS',
13
- ANY_IN = 'ANY_IN',
14
- WITHIN_LAST_DAYS = 'WITHIN_LAST_DAYS',
15
- NOT_WITHIN_LAST_DAYS = 'NOT_WITHIN_LAST_DAYS',
16
- }
1
+ export * from '../../rules/enums/SegmentOperatorEnum';
@@ -1,5 +1 @@
1
- export enum SegmentParamSourceEnum {
2
- LITERAL = 'LITERAL',
3
- REFERENCE_AT = 'REFERENCE_AT',
4
- REFERENCE_AT_MINUS_DAYS = 'REFERENCE_AT_MINUS_DAYS',
5
- }
1
+ export * from '../../rules/enums/SegmentParamSourceEnum';
@@ -1,7 +1 @@
1
- export enum SegmentParamTypeEnum {
2
- STRING = 'STRING',
3
- INTEGER = 'INTEGER',
4
- DECIMAL = 'DECIMAL',
5
- BOOLEAN = 'BOOLEAN',
6
- TIMESTAMP = 'TIMESTAMP',
7
- }
1
+ export * from '../../rules/enums/SegmentParamTypeEnum';
@@ -0,0 +1,5 @@
1
+ /** Identificador SQL permitido para tabla/columna (A§4.3 paso 1): minusculas, digitos y guion bajo; nunca texto libre. */
2
+ export const SEGMENT_IDENTIFIER_PATTERN = /^[a-z_][a-z0-9_]*$/;
3
+ export const SEGMENT_MAX_DAYS = 365;
4
+ export const SEGMENT_MAX_PARAMS = 40;
5
+ export const SEGMENT_MAX_AGGREGATES = 8;
@@ -0,0 +1,9 @@
1
+ import { Expose, Type } from 'class-transformer';
2
+ import { IsDefined, IsOptional, IsString, ValidateNested } from 'class-validator';
3
+ import { PopulationSegmentDefinition } from './PopulationSegmentDefinition';
4
+
5
+ /** Compila una definicion a SQL parametrizado (POST /population/compile). `consumer` solo para logs/metricas. */
6
+ export class PopulationCompileRequest {
7
+ @Expose() @IsOptional() @IsString() consumer?: string;
8
+ @Expose() @IsDefined() @ValidateNested() @Type(() => PopulationSegmentDefinition) definition: PopulationSegmentDefinition;
9
+ }
@@ -0,0 +1,10 @@
1
+ import { SegmentParam } from './SegmentParam';
2
+ import { SegmentUsedColumn } from './SegmentUsedColumn';
3
+
4
+ export class PopulationCompileResponse {
5
+ sql: string;
6
+ params: SegmentParam[];
7
+ usedColumns: SegmentUsedColumn[];
8
+ humanSummary: string;
9
+ definitionHash: string;
10
+ }
@@ -0,0 +1,11 @@
1
+ import { PopulationErrorCodeEnum } from '../../enums/PopulationErrorCodeEnum';
2
+ import { PopulationExecutionStatusEnum } from '../../enums/PopulationExecutionStatusEnum';
3
+
4
+ /** Pagina de hasta 1000 ids. Sin `nextToken` = ultima pagina. */
5
+ export class PopulationExecutionPageResponse {
6
+ executionId: string;
7
+ status: PopulationExecutionStatusEnum;
8
+ ids: string[];
9
+ nextToken?: string;
10
+ reason?: PopulationErrorCodeEnum;
11
+ }
@@ -0,0 +1,13 @@
1
+ import { Expose, Type } from 'class-transformer';
2
+ import { IsDefined, IsISO8601, IsNotEmpty, IsOptional, IsString, MaxLength, MinLength, ValidateNested } from 'class-validator';
3
+ import { PopulationSegmentDefinition } from './PopulationSegmentDefinition';
4
+
5
+ /** Inicia una ejecucion de poblacion (POST /population/executions). El central recompila; `expectedSql` activa G3 (SEGMENT_SCHEMA_DRIFT). */
6
+ export class PopulationExecutionRequest {
7
+ @Expose() @IsOptional() @IsString() consumer?: string;
8
+ @Expose() @IsDefined() @ValidateNested() @Type(() => PopulationSegmentDefinition) definition: PopulationSegmentDefinition;
9
+ @Expose() @IsISO8601({ strict: true }) referenceAt: string;
10
+ @Expose() @IsString() @MinLength(32) @MaxLength(128) idempotencyKey: string;
11
+ @Expose() @IsOptional() @IsString() @IsNotEmpty() expectedSql?: string;
12
+ @Expose() @IsOptional() @IsString() @MinLength(1) @MaxLength(256) afterDirectoryId?: string;
13
+ }
@@ -0,0 +1,6 @@
1
+ import { PopulationExecutionStatusEnum } from '../../enums/PopulationExecutionStatusEnum';
2
+
3
+ export class PopulationExecutionResponse {
4
+ executionId: string;
5
+ status: PopulationExecutionStatusEnum;
6
+ }
@@ -0,0 +1,12 @@
1
+ import { Expose, Type } from 'class-transformer';
2
+ import { ArrayMaxSize, ArrayMinSize, IsArray, IsEnum, Matches, ValidateNested } from 'class-validator';
3
+ import { SEGMENT_IDENTIFIER_PATTERN } from '../../constants/SegmentLimits';
4
+ import { SegmentMatchEnum } from '../../enums/SegmentMatchEnum';
5
+ import { SegmentGroup } from './SegmentGroup';
6
+
7
+ /** El constructor tal cual (A§4.1): tabla ancla (una fila -> un directoryid), TODAS/ALGUNA global y grupos con su propio TODAS/ALGUNA. */
8
+ export class PopulationSegmentDefinition {
9
+ @Expose() @Matches(SEGMENT_IDENTIFIER_PATTERN) baseTable: string;
10
+ @Expose() @IsEnum(SegmentMatchEnum) match: SegmentMatchEnum;
11
+ @Expose() @IsArray() @ArrayMinSize(1) @ArrayMaxSize(10) @ValidateNested({ each: true }) @Type(() => SegmentGroup) groups: SegmentGroup[];
12
+ }
@@ -0,0 +1,10 @@
1
+ import { Expose, Type } from 'class-transformer';
2
+ import { IsDefined, IsISO8601, IsOptional, IsString, ValidateNested } from 'class-validator';
3
+ import { PopulationSegmentDefinition } from './PopulationSegmentDefinition';
4
+
5
+ /** Prueba sin estado de una definicion (POST /population/tests). `referenceAt` ISO-8601 con zona; por defecto, ahora. */
6
+ export class PopulationTestRequest {
7
+ @Expose() @IsOptional() @IsString() consumer?: string;
8
+ @Expose() @IsDefined() @ValidateNested() @Type(() => PopulationSegmentDefinition) definition: PopulationSegmentDefinition;
9
+ @Expose() @IsOptional() @IsISO8601({ strict: true }) referenceAt?: string;
10
+ }
@@ -0,0 +1,29 @@
1
+ import { PopulationErrorCodeEnum } from '../../enums/PopulationErrorCodeEnum';
2
+ import { PopulationTestStatusEnum } from '../../enums/PopulationTestStatusEnum';
3
+ import { SegmentParam } from './SegmentParam';
4
+
5
+ export class PopulationTestResultResponse {
6
+ count: number;
7
+ sampleIds: string[];
8
+ bytesScanned: number;
9
+ durationMs: number;
10
+ }
11
+
12
+ export class PopulationTestErrorResponse {
13
+ code: PopulationErrorCodeEnum;
14
+ message: string;
15
+ }
16
+
17
+ /** `queryExecutionId` sale del count (lastTest de rewards). Estado RUNNING: el cliente reconsulta por `testId`. */
18
+ export class PopulationTestResponse {
19
+ testId: string;
20
+ status: PopulationTestStatusEnum;
21
+ referenceAt: string;
22
+ definitionHash: string;
23
+ humanSummary: string;
24
+ sql: string;
25
+ params: SegmentParam[];
26
+ queryExecutionId?: string;
27
+ result?: PopulationTestResultResponse;
28
+ errors?: PopulationTestErrorResponse[];
29
+ }
@@ -0,0 +1,22 @@
1
+ import { Expose, Type } from 'class-transformer';
2
+ import { ArrayMaxSize, Equals, IsArray, IsEnum, IsNumber, IsOptional, Matches, ValidateNested } from 'class-validator';
3
+ import { SEGMENT_IDENTIFIER_PATTERN } from '../../constants/SegmentLimits';
4
+ import { SegmentAggregateFnEnum } from '../../enums/SegmentAggregateFnEnum';
5
+ import { SegmentConditionKindEnum } from '../../enums/SegmentConditionKindEnum';
6
+ import { SegmentOperatorEnum } from '../../enums/SegmentOperatorEnum';
7
+ import { SegmentColumnCondition } from './SegmentColumnCondition';
8
+ import { SegmentWindow } from './SegmentWindow';
9
+
10
+ /** (b) Agregado con ventana relativa sobre una tabla relacionada (existe / cuenta / suma). `filters` elige QUE cuenta (estados, moneda...). */
11
+ export class SegmentAggregateCondition {
12
+ @Expose() @Equals(SegmentConditionKindEnum.AGGREGATE) kind: SegmentConditionKindEnum.AGGREGATE;
13
+ @Expose() @Matches(SEGMENT_IDENTIFIER_PATTERN) table: string;
14
+ @Expose() @IsEnum(SegmentAggregateFnEnum) fn: SegmentAggregateFnEnum;
15
+ /** Solo SUM. */
16
+ @Expose() @IsOptional() @Matches(SEGMENT_IDENTIFIER_PATTERN) column?: string;
17
+ /** COUNT y SUM; EXISTS no lleva. */
18
+ @Expose() @IsOptional() @IsEnum(SegmentOperatorEnum) op?: SegmentOperatorEnum;
19
+ @Expose() @IsOptional() @IsNumber() value?: number;
20
+ @Expose() @ValidateNested() @Type(() => SegmentWindow) window: SegmentWindow;
21
+ @Expose() @IsArray() @ArrayMaxSize(10) @ValidateNested({ each: true }) @Type(() => SegmentColumnCondition) filters: SegmentColumnCondition[];
22
+ }
@@ -0,0 +1,15 @@
1
+ import { Expose } from 'class-transformer';
2
+ import { Equals, IsEnum, IsOptional, Matches } from 'class-validator';
3
+ import { JsonValue } from '../../../common';
4
+ import { SEGMENT_IDENTIFIER_PATTERN } from '../../constants/SegmentLimits';
5
+ import { SegmentConditionKindEnum } from '../../enums/SegmentConditionKindEnum';
6
+ import { SegmentOperatorEnum } from '../../enums/SegmentOperatorEnum';
7
+
8
+ /** (a) Columna de una tabla unida por `directoryid`. El tipo de `value` (escalar, lista o `{days}`) lo valida el compilador contra el tipo de Glue. */
9
+ export class SegmentColumnCondition {
10
+ @Expose() @Equals(SegmentConditionKindEnum.COLUMN) kind: SegmentConditionKindEnum.COLUMN;
11
+ @Expose() @Matches(SEGMENT_IDENTIFIER_PATTERN) table: string;
12
+ @Expose() @Matches(SEGMENT_IDENTIFIER_PATTERN) column: string;
13
+ @Expose() @IsEnum(SegmentOperatorEnum) op: SegmentOperatorEnum;
14
+ @Expose() @IsOptional() value?: JsonValue;
15
+ }
@@ -0,0 +1,27 @@
1
+ import { Expose, Type } from 'class-transformer';
2
+ import { ArrayMaxSize, ArrayMinSize, IsArray, IsEnum, ValidateNested } from 'class-validator';
3
+ import { SegmentConditionKindEnum } from '../../enums/SegmentConditionKindEnum';
4
+ import { SegmentMatchEnum } from '../../enums/SegmentMatchEnum';
5
+ import { SegmentAggregateCondition } from './SegmentAggregateCondition';
6
+ import { SegmentColumnCondition } from './SegmentColumnCondition';
7
+
8
+ export type SegmentCondition = SegmentColumnCondition | SegmentAggregateCondition;
9
+
10
+ export class SegmentGroup {
11
+ @Expose() @IsEnum(SegmentMatchEnum) match: SegmentMatchEnum;
12
+
13
+ /** `kind` decide la clase; un `kind` desconocido NO se instancia y la validacion lo rechaza (el objeto queda sin `@Equals` valido). */
14
+ @Expose()
15
+ @IsArray() @ArrayMinSize(1) @ArrayMaxSize(20) @ValidateNested({ each: true })
16
+ @Type(() => Object, {
17
+ keepDiscriminatorProperty: true,
18
+ discriminator: {
19
+ property: 'kind',
20
+ subTypes: [
21
+ { value: SegmentColumnCondition, name: SegmentConditionKindEnum.COLUMN },
22
+ { value: SegmentAggregateCondition, name: SegmentConditionKindEnum.AGGREGATE },
23
+ ],
24
+ },
25
+ })
26
+ conditions: SegmentCondition[];
27
+ }
@@ -0,0 +1,11 @@
1
+ import { SegmentParamSourceEnum } from '../../enums/SegmentParamSourceEnum';
2
+ import { SegmentParamTypeEnum } from '../../enums/SegmentParamTypeEnum';
3
+
4
+ /** Un `?` del SQL, en orden. LITERAL lleva `value` como texto canonico; REFERENCE_AT_MINUS_DAYS lleva `days`. */
5
+ export class SegmentParam {
6
+ name: string;
7
+ type: SegmentParamTypeEnum;
8
+ source: SegmentParamSourceEnum;
9
+ value?: string;
10
+ days?: number;
11
+ }
@@ -0,0 +1,11 @@
1
+ export class SegmentSchemaTableResponse {
2
+ table: string;
3
+ joinKey: string;
4
+ columnCount: number;
5
+ }
6
+
7
+ /** `available: false` = ambiente sin datalake accesible: el constructor muestra "no disponible". */
8
+ export class SegmentSchemaResponse {
9
+ available: boolean;
10
+ tables: SegmentSchemaTableResponse[];
11
+ }
@@ -0,0 +1,14 @@
1
+ import { SegmentOperatorEnum } from '../../enums/SegmentOperatorEnum';
2
+
3
+ export class SegmentColumnSchemaResponse {
4
+ name: string;
5
+ type: string;
6
+ isDate: boolean;
7
+ operators: SegmentOperatorEnum[];
8
+ }
9
+
10
+ export class SegmentTableSchemaResponse {
11
+ table: string;
12
+ joinKey: string;
13
+ columns: SegmentColumnSchemaResponse[];
14
+ }
@@ -0,0 +1,5 @@
1
+ export class SegmentUsedColumn {
2
+ table: string;
3
+ column: string;
4
+ type: string;
5
+ }
@@ -0,0 +1,9 @@
1
+ import { Expose } from 'class-transformer';
2
+ import { IsInt, Matches, Max, Min } from 'class-validator';
3
+ import { SEGMENT_IDENTIFIER_PATTERN, SEGMENT_MAX_DAYS } from '../../constants/SegmentLimits';
4
+
5
+ /** Ventana relativa [referenceAt - days, referenceAt) sobre una columna de fecha (A§4.1). */
6
+ export class SegmentWindow {
7
+ @Expose() @Matches(SEGMENT_IDENTIFIER_PATTERN) dateColumn: string;
8
+ @Expose() @IsInt() @Min(1) @Max(SEGMENT_MAX_DAYS) days: number;
9
+ }
@@ -0,0 +1,12 @@
1
+ /** Codigos de error del canal de poblacion. Los 8 primeros coinciden con SegmentErrorCodeEnum. */
2
+ export enum PopulationErrorCodeEnum {
3
+ SEGMENT_INVALID = 'SEGMENT_INVALID',
4
+ SEGMENT_BLOCKED_COLUMN = 'SEGMENT_BLOCKED_COLUMN',
5
+ SEGMENT_SCHEMA_DRIFT = 'SEGMENT_SCHEMA_DRIFT',
6
+ SEGMENT_BYTES_EXCEEDED = 'SEGMENT_BYTES_EXCEEDED',
7
+ SEGMENT_QUERY_FAILED = 'SEGMENT_QUERY_FAILED',
8
+ SEGMENT_DATALAKE_UNAVAILABLE = 'SEGMENT_DATALAKE_UNAVAILABLE',
9
+ SEGMENT_DATALAKE_UNAVAILABLE_IN_ENV = 'SEGMENT_DATALAKE_UNAVAILABLE_IN_ENV',
10
+ SEGMENT_EXECUTION_NOT_FOUND = 'SEGMENT_EXECUTION_NOT_FOUND',
11
+ SEGMENT_NEXT_TOKEN_EXPIRED = 'SEGMENT_NEXT_TOKEN_EXPIRED',
12
+ }
@@ -0,0 +1,6 @@
1
+ export enum PopulationExecutionStatusEnum {
2
+ RUNNING = 'RUNNING',
3
+ SUCCEEDED = 'SUCCEEDED',
4
+ FAILED = 'FAILED',
5
+ CANCELLED = 'CANCELLED',
6
+ }
@@ -0,0 +1,5 @@
1
+ export enum PopulationTestStatusEnum {
2
+ RUNNING = 'RUNNING',
3
+ PASSED = 'PASSED',
4
+ FAILED = 'FAILED',
5
+ }
@@ -0,0 +1,5 @@
1
+ export enum SegmentAggregateFnEnum {
2
+ EXISTS = 'EXISTS',
3
+ COUNT = 'COUNT',
4
+ SUM = 'SUM',
5
+ }
@@ -0,0 +1,4 @@
1
+ export enum SegmentConditionKindEnum {
2
+ COLUMN = 'COLUMN',
3
+ AGGREGATE = 'AGGREGATE',
4
+ }
@@ -0,0 +1,4 @@
1
+ export enum SegmentMatchEnum {
2
+ ALL = 'ALL',
3
+ ANY = 'ANY',
4
+ }
@@ -0,0 +1,16 @@
1
+ export enum SegmentOperatorEnum {
2
+ EQUALS = 'EQUALS',
3
+ NOT_EQUALS = 'NOT_EQUALS',
4
+ IN = 'IN',
5
+ NOT_IN = 'NOT_IN',
6
+ IS_NULL = 'IS_NULL',
7
+ IS_NOT_NULL = 'IS_NOT_NULL',
8
+ GT = 'GT',
9
+ GTE = 'GTE',
10
+ LT = 'LT',
11
+ LTE = 'LTE',
12
+ CONTAINS = 'CONTAINS',
13
+ ANY_IN = 'ANY_IN',
14
+ WITHIN_LAST_DAYS = 'WITHIN_LAST_DAYS',
15
+ NOT_WITHIN_LAST_DAYS = 'NOT_WITHIN_LAST_DAYS',
16
+ }
@@ -0,0 +1,5 @@
1
+ export enum SegmentParamSourceEnum {
2
+ LITERAL = 'LITERAL',
3
+ REFERENCE_AT = 'REFERENCE_AT',
4
+ REFERENCE_AT_MINUS_DAYS = 'REFERENCE_AT_MINUS_DAYS',
5
+ }
@@ -0,0 +1,7 @@
1
+ export enum SegmentParamTypeEnum {
2
+ STRING = 'STRING',
3
+ INTEGER = 'INTEGER',
4
+ DECIMAL = 'DECIMAL',
5
+ BOOLEAN = 'BOOLEAN',
6
+ TIMESTAMP = 'TIMESTAMP',
7
+ }