@fiado/type-kit 3.192.0 → 3.194.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,15 @@
1
+ /**
2
+ * Body del POST /internal/tenants/{tenantId}/users/../levels/{level}/entities (endpoint privado, VPC/ANONIMUS).
3
+ * `tenantId` y `level` viajan en el path (no acá). Crea una scope-entity genérica L1/L2/L3 en RBAC.
4
+ *
5
+ * Consumido por el espejo de jerarquía de SureKeep F1 (retailer→L1, zona→L2, tienda→L3) vía api-invoker.
6
+ * - `id` es BYOID (DEC-RBAC-027): el caller trae su propio id → creates idempotentes (PutItem overwrite).
7
+ * - `parentId` es obligatorio para L2/L3 (id del nivel superior); ausente en L1 (cuelga de TENANT). Lo valida el manager.
8
+ * - `createdBy` = cognitoSub del admin real (audit), propagado desde el evento de outbox.
9
+ */
10
+ export declare class CreateLevelEntityRequest {
11
+ displayName: string;
12
+ id?: string;
13
+ parentId?: string;
14
+ createdBy: string;
15
+ }
@@ -0,0 +1,52 @@
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.CreateLevelEntityRequest = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ /**
16
+ * Body del POST /internal/tenants/{tenantId}/users/../levels/{level}/entities (endpoint privado, VPC/ANONIMUS).
17
+ * `tenantId` y `level` viajan en el path (no acá). Crea una scope-entity genérica L1/L2/L3 en RBAC.
18
+ *
19
+ * Consumido por el espejo de jerarquía de SureKeep F1 (retailer→L1, zona→L2, tienda→L3) vía api-invoker.
20
+ * - `id` es BYOID (DEC-RBAC-027): el caller trae su propio id → creates idempotentes (PutItem overwrite).
21
+ * - `parentId` es obligatorio para L2/L3 (id del nivel superior); ausente en L1 (cuelga de TENANT). Lo valida el manager.
22
+ * - `createdBy` = cognitoSub del admin real (audit), propagado desde el evento de outbox.
23
+ */
24
+ class CreateLevelEntityRequest {
25
+ }
26
+ exports.CreateLevelEntityRequest = CreateLevelEntityRequest;
27
+ __decorate([
28
+ (0, class_transformer_1.Expose)(),
29
+ (0, class_validator_1.IsString)(),
30
+ (0, class_validator_1.IsNotEmpty)(),
31
+ __metadata("design:type", String)
32
+ ], CreateLevelEntityRequest.prototype, "displayName", void 0);
33
+ __decorate([
34
+ (0, class_transformer_1.Expose)(),
35
+ (0, class_validator_1.IsOptional)(),
36
+ (0, class_validator_1.IsString)(),
37
+ (0, class_validator_1.IsNotEmpty)(),
38
+ __metadata("design:type", String)
39
+ ], CreateLevelEntityRequest.prototype, "id", void 0);
40
+ __decorate([
41
+ (0, class_transformer_1.Expose)(),
42
+ (0, class_validator_1.IsOptional)(),
43
+ (0, class_validator_1.IsString)(),
44
+ (0, class_validator_1.IsNotEmpty)(),
45
+ __metadata("design:type", String)
46
+ ], CreateLevelEntityRequest.prototype, "parentId", 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
+ ], CreateLevelEntityRequest.prototype, "createdBy", void 0);
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Respuesta del POST create-level-entity (endpoint privado). Espejo público de la scope-entity creada
3
+ * (SharedLevelEntityRow del rbac-business). Interface plain → export type-only.
4
+ */
5
+ export interface CreateLevelEntityResponse {
6
+ id: string;
7
+ displayName: string;
8
+ parentId?: string;
9
+ level: string;
10
+ createdAt: number;
11
+ updatedAt: number;
12
+ createdBy?: string;
13
+ updatedBy?: string;
14
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,19 @@
1
+ import { PermissionScope } from '../enums/PermissionScope';
2
+ /**
3
+ * Body del POST /internal/tenants/{tenantId}/users (endpoint privado, VPC/ANONIMUS). `tenantId` viaja en el path.
4
+ * Provisiona Cognito + SharedUser + RoleAssignment (rol + scopeRef) en RBAC — reusa UserProvisioningService.
5
+ *
6
+ * Consumido por el alta de usuario orquestada de SureKeep F1 (retail-org → RBAC → RetailUser) vía api-invoker.
7
+ * - Usuario provisionado en estado INVITED (mitiga orphan si el paso siguiente en retail-org falla).
8
+ * - Idempotente por identidad Cognito.
9
+ * - `scope`/`scopeRef` = grant del rol (ej. LEVEL_3 + storeId para un vendedor de tienda).
10
+ * - `createdBy` = cognitoSub del admin real (audit + grantedBy del assignment).
11
+ */
12
+ export declare class CreateTenantUserRequest {
13
+ email: string;
14
+ displayName?: string;
15
+ roleId: string;
16
+ scope: PermissionScope;
17
+ scopeRef: string;
18
+ createdBy: string;
19
+ }
@@ -0,0 +1,63 @@
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.CreateTenantUserRequest = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ const PermissionScope_1 = require("../enums/PermissionScope");
16
+ /**
17
+ * Body del POST /internal/tenants/{tenantId}/users (endpoint privado, VPC/ANONIMUS). `tenantId` viaja en el path.
18
+ * Provisiona Cognito + SharedUser + RoleAssignment (rol + scopeRef) en RBAC — reusa UserProvisioningService.
19
+ *
20
+ * Consumido por el alta de usuario orquestada de SureKeep F1 (retail-org → RBAC → RetailUser) vía api-invoker.
21
+ * - Usuario provisionado en estado INVITED (mitiga orphan si el paso siguiente en retail-org falla).
22
+ * - Idempotente por identidad Cognito.
23
+ * - `scope`/`scopeRef` = grant del rol (ej. LEVEL_3 + storeId para un vendedor de tienda).
24
+ * - `createdBy` = cognitoSub del admin real (audit + grantedBy del assignment).
25
+ */
26
+ class CreateTenantUserRequest {
27
+ }
28
+ exports.CreateTenantUserRequest = CreateTenantUserRequest;
29
+ __decorate([
30
+ (0, class_transformer_1.Expose)(),
31
+ (0, class_validator_1.IsEmail)(),
32
+ __metadata("design:type", String)
33
+ ], CreateTenantUserRequest.prototype, "email", 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
+ ], CreateTenantUserRequest.prototype, "displayName", 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
+ ], CreateTenantUserRequest.prototype, "roleId", void 0);
47
+ __decorate([
48
+ (0, class_transformer_1.Expose)(),
49
+ (0, class_validator_1.IsEnum)(PermissionScope_1.PermissionScope),
50
+ __metadata("design:type", String)
51
+ ], CreateTenantUserRequest.prototype, "scope", void 0);
52
+ __decorate([
53
+ (0, class_transformer_1.Expose)(),
54
+ (0, class_validator_1.IsString)(),
55
+ (0, class_validator_1.IsNotEmpty)(),
56
+ __metadata("design:type", String)
57
+ ], CreateTenantUserRequest.prototype, "scopeRef", void 0);
58
+ __decorate([
59
+ (0, class_transformer_1.Expose)(),
60
+ (0, class_validator_1.IsString)(),
61
+ (0, class_validator_1.IsNotEmpty)(),
62
+ __metadata("design:type", String)
63
+ ], CreateTenantUserRequest.prototype, "createdBy", void 0);
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Respuesta del POST create-tenant-user (endpoint privado). Devuelve el cognitoSub del usuario
3
+ * provisionado, que retail-org guarda en el RetailUser para el match F1↔RBAC. Interface plain → type-only.
4
+ */
5
+ export interface CreateTenantUserResponse {
6
+ cognitoSub: string;
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -48,3 +48,7 @@ export type { RoleScopeRecompute, InconsistentAssignment, CascadeTenantFailure,
48
48
  export * from './dtos/SelfRegisterStartRequest';
49
49
  export * from './dtos/SelfRegisterVerifyOtpRequest';
50
50
  export * from './dtos/SelfRegisterCompleteRequest';
51
+ export * from './dtos/CreateLevelEntityRequest';
52
+ export type { CreateLevelEntityResponse } from './dtos/CreateLevelEntityResponse';
53
+ export * from './dtos/CreateTenantUserRequest';
54
+ export type { CreateTenantUserResponse } from './dtos/CreateTenantUserResponse';
@@ -99,3 +99,8 @@ __exportStar(require("./enums/PermissionKind"), exports);
99
99
  __exportStar(require("./dtos/SelfRegisterStartRequest"), exports);
100
100
  __exportStar(require("./dtos/SelfRegisterVerifyOtpRequest"), exports);
101
101
  __exportStar(require("./dtos/SelfRegisterCompleteRequest"), exports);
102
+ // Endpoints privados de espejo de jerarquía + alta de usuario (SureKeep F1, scope mirror).
103
+ // Request DTOs llevan decoradores class-validator → export de valor (se hidratan con plainToInstance);
104
+ // Response son interfaces plain → type-only. Consumidos por retail-org vía api-invoker (Publisher).
105
+ __exportStar(require("./dtos/CreateLevelEntityRequest"), exports);
106
+ __exportStar(require("./dtos/CreateTenantUserRequest"), exports);
@@ -0,0 +1,38 @@
1
+ import { CollectorSeniorityEnum } from '../../enums/CollectorSeniorityEnum';
2
+ import { EmploymentTypeEnum } from '../../enums/EmploymentTypeEnum';
3
+ import { PermissionScope } from '../../../platformRbac/enums/PermissionScope';
4
+ /**
5
+ * Body de POST /retailers/:retailerId/users/provision — alta de usuario retail ORQUESTADA (SureKeep F1,
6
+ * scope mirror). Invierte el orden del alta clásica: en vez de recibir un `cognitoSub` ya existente,
7
+ * retail-org provisiona al usuario en RBAC (Cognito + SharedUser + RoleAssignment) y luego crea el
8
+ * `RetailUser` con el `cognitoSub` retornado. El `retailerId` sale del path.
9
+ *
10
+ * Diferencia con {@link CreateRetailUserRequest}: aquí van `email` + `roleId` + `scope` + `scopeRef`
11
+ * (el grant de RBAC) en lugar de `cognitoSub`. El resto de los atributos comerciales son idénticos.
12
+ */
13
+ export declare class ProvisionRetailUserRequest {
14
+ /** Identidad de login del usuario a provisionar en Cognito/RBAC. */
15
+ email: string;
16
+ /** Rol de RBAC a asignar (id del rol del tenant). */
17
+ roleId: string;
18
+ /** Scope del grant (ej. LEVEL_1 = retailer, LEVEL_3 = tienda). */
19
+ scope: PermissionScope;
20
+ /** Referencia del scope (ej. retailerId para LEVEL_1, storeId para LEVEL_3). */
21
+ scopeRef: string;
22
+ /**
23
+ * Nombre de display — etiqueta de conveniencia (DEC-SKF1-021). La identidad real vive en RBAC
24
+ * (DEC-SKF1-005); esto es solo un rótulo para reconocer al usuario en el backoffice. Opcional.
25
+ */
26
+ displayName?: string;
27
+ homeStoreId: string;
28
+ employmentType: EmploymentTypeEnum;
29
+ commissionTier: string;
30
+ /** Zona de operación del usuario; `null` si no está acotado a una zona. */
31
+ zoneId: string | null;
32
+ /** Teléfono de contacto del usuario retail; opcional. */
33
+ phone?: string;
34
+ /** Seniority del cobrador; solo aplica a usuarios retail con rol de cobrador. */
35
+ collectorSeniority?: CollectorSeniorityEnum;
36
+ /** Tiendas que cubre el cobrador (zona de cobranza); opcional. */
37
+ coverageStoreIds?: string[];
38
+ }
@@ -0,0 +1,95 @@
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.ProvisionRetailUserRequest = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ const CollectorSeniorityEnum_1 = require("../../enums/CollectorSeniorityEnum");
16
+ const EmploymentTypeEnum_1 = require("../../enums/EmploymentTypeEnum");
17
+ const PermissionScope_1 = require("../../../platformRbac/enums/PermissionScope");
18
+ /**
19
+ * Body de POST /retailers/:retailerId/users/provision — alta de usuario retail ORQUESTADA (SureKeep F1,
20
+ * scope mirror). Invierte el orden del alta clásica: en vez de recibir un `cognitoSub` ya existente,
21
+ * retail-org provisiona al usuario en RBAC (Cognito + SharedUser + RoleAssignment) y luego crea el
22
+ * `RetailUser` con el `cognitoSub` retornado. El `retailerId` sale del path.
23
+ *
24
+ * Diferencia con {@link CreateRetailUserRequest}: aquí van `email` + `roleId` + `scope` + `scopeRef`
25
+ * (el grant de RBAC) en lugar de `cognitoSub`. El resto de los atributos comerciales son idénticos.
26
+ */
27
+ class ProvisionRetailUserRequest {
28
+ }
29
+ exports.ProvisionRetailUserRequest = ProvisionRetailUserRequest;
30
+ __decorate([
31
+ (0, class_transformer_1.Expose)(),
32
+ (0, class_validator_1.IsEmail)(),
33
+ __metadata("design:type", String)
34
+ ], ProvisionRetailUserRequest.prototype, "email", void 0);
35
+ __decorate([
36
+ (0, class_transformer_1.Expose)(),
37
+ (0, class_validator_1.IsString)(),
38
+ __metadata("design:type", String)
39
+ ], ProvisionRetailUserRequest.prototype, "roleId", void 0);
40
+ __decorate([
41
+ (0, class_transformer_1.Expose)(),
42
+ (0, class_validator_1.IsEnum)(PermissionScope_1.PermissionScope),
43
+ __metadata("design:type", String)
44
+ ], ProvisionRetailUserRequest.prototype, "scope", void 0);
45
+ __decorate([
46
+ (0, class_transformer_1.Expose)(),
47
+ (0, class_validator_1.IsString)(),
48
+ __metadata("design:type", String)
49
+ ], ProvisionRetailUserRequest.prototype, "scopeRef", void 0);
50
+ __decorate([
51
+ (0, class_transformer_1.Expose)(),
52
+ (0, class_validator_1.IsOptional)(),
53
+ (0, class_validator_1.IsString)(),
54
+ __metadata("design:type", String)
55
+ ], ProvisionRetailUserRequest.prototype, "displayName", void 0);
56
+ __decorate([
57
+ (0, class_transformer_1.Expose)(),
58
+ (0, class_validator_1.IsString)(),
59
+ __metadata("design:type", String)
60
+ ], ProvisionRetailUserRequest.prototype, "homeStoreId", void 0);
61
+ __decorate([
62
+ (0, class_transformer_1.Expose)(),
63
+ (0, class_validator_1.IsEnum)(EmploymentTypeEnum_1.EmploymentTypeEnum),
64
+ __metadata("design:type", String)
65
+ ], ProvisionRetailUserRequest.prototype, "employmentType", void 0);
66
+ __decorate([
67
+ (0, class_transformer_1.Expose)(),
68
+ (0, class_validator_1.IsString)(),
69
+ __metadata("design:type", String)
70
+ ], ProvisionRetailUserRequest.prototype, "commissionTier", void 0);
71
+ __decorate([
72
+ (0, class_transformer_1.Expose)(),
73
+ (0, class_validator_1.IsOptional)(),
74
+ (0, class_validator_1.IsString)(),
75
+ __metadata("design:type", String)
76
+ ], ProvisionRetailUserRequest.prototype, "zoneId", void 0);
77
+ __decorate([
78
+ (0, class_transformer_1.Expose)(),
79
+ (0, class_validator_1.IsOptional)(),
80
+ (0, class_validator_1.IsString)(),
81
+ __metadata("design:type", String)
82
+ ], ProvisionRetailUserRequest.prototype, "phone", void 0);
83
+ __decorate([
84
+ (0, class_transformer_1.Expose)(),
85
+ (0, class_validator_1.IsOptional)(),
86
+ (0, class_validator_1.IsEnum)(CollectorSeniorityEnum_1.CollectorSeniorityEnum),
87
+ __metadata("design:type", String)
88
+ ], ProvisionRetailUserRequest.prototype, "collectorSeniority", void 0);
89
+ __decorate([
90
+ (0, class_transformer_1.Expose)(),
91
+ (0, class_validator_1.IsOptional)(),
92
+ (0, class_validator_1.IsArray)(),
93
+ (0, class_validator_1.IsString)({ each: true }),
94
+ __metadata("design:type", Array)
95
+ ], ProvisionRetailUserRequest.prototype, "coverageStoreIds", void 0);
@@ -27,6 +27,7 @@ export * from './dtos/requests/CreateStoreRequest';
27
27
  export * from './dtos/requests/UpdateStoreRequest';
28
28
  export * from './dtos/requests/ChangeStoreStatusRequest';
29
29
  export * from './dtos/requests/CreateRetailUserRequest';
30
+ export * from './dtos/requests/ProvisionRetailUserRequest';
30
31
  export * from './dtos/requests/UpdateRetailUserRequest';
31
32
  export * from './dtos/requests/ChangeRetailUserStatusRequest';
32
33
  export * from './dtos/requests/TransferRetailUserRequest';
@@ -47,6 +47,7 @@ __exportStar(require("./dtos/requests/CreateStoreRequest"), exports);
47
47
  __exportStar(require("./dtos/requests/UpdateStoreRequest"), exports);
48
48
  __exportStar(require("./dtos/requests/ChangeStoreStatusRequest"), exports);
49
49
  __exportStar(require("./dtos/requests/CreateRetailUserRequest"), exports);
50
+ __exportStar(require("./dtos/requests/ProvisionRetailUserRequest"), exports);
50
51
  __exportStar(require("./dtos/requests/UpdateRetailUserRequest"), exports);
51
52
  __exportStar(require("./dtos/requests/ChangeRetailUserStatusRequest"), exports);
52
53
  __exportStar(require("./dtos/requests/TransferRetailUserRequest"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fiado/type-kit",
3
- "version": "3.192.0",
3
+ "version": "3.194.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "types": "bin/index.d.ts",
@@ -0,0 +1,18 @@
1
+ import { Expose } from 'class-transformer';
2
+ import { IsNotEmpty, IsOptional, IsString } from 'class-validator';
3
+
4
+ /**
5
+ * Body del POST /internal/tenants/{tenantId}/users/../levels/{level}/entities (endpoint privado, VPC/ANONIMUS).
6
+ * `tenantId` y `level` viajan en el path (no acá). Crea una scope-entity genérica L1/L2/L3 en RBAC.
7
+ *
8
+ * Consumido por el espejo de jerarquía de SureKeep F1 (retailer→L1, zona→L2, tienda→L3) vía api-invoker.
9
+ * - `id` es BYOID (DEC-RBAC-027): el caller trae su propio id → creates idempotentes (PutItem overwrite).
10
+ * - `parentId` es obligatorio para L2/L3 (id del nivel superior); ausente en L1 (cuelga de TENANT). Lo valida el manager.
11
+ * - `createdBy` = cognitoSub del admin real (audit), propagado desde el evento de outbox.
12
+ */
13
+ export class CreateLevelEntityRequest {
14
+ @Expose() @IsString() @IsNotEmpty() displayName!: string;
15
+ @Expose() @IsOptional() @IsString() @IsNotEmpty() id?: string;
16
+ @Expose() @IsOptional() @IsString() @IsNotEmpty() parentId?: string;
17
+ @Expose() @IsString() @IsNotEmpty() createdBy!: string;
18
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Respuesta del POST create-level-entity (endpoint privado). Espejo público de la scope-entity creada
3
+ * (SharedLevelEntityRow del rbac-business). Interface plain → export type-only.
4
+ */
5
+ export interface CreateLevelEntityResponse {
6
+ id: string;
7
+ displayName: string;
8
+ parentId?: string;
9
+ level: string;
10
+ createdAt: number;
11
+ updatedAt: number;
12
+ createdBy?: string;
13
+ updatedBy?: string;
14
+ }
@@ -0,0 +1,22 @@
1
+ import { Expose } from 'class-transformer';
2
+ import { IsEmail, IsEnum, IsNotEmpty, IsOptional, IsString } from 'class-validator';
3
+ import { PermissionScope } from '../enums/PermissionScope';
4
+
5
+ /**
6
+ * Body del POST /internal/tenants/{tenantId}/users (endpoint privado, VPC/ANONIMUS). `tenantId` viaja en el path.
7
+ * Provisiona Cognito + SharedUser + RoleAssignment (rol + scopeRef) en RBAC — reusa UserProvisioningService.
8
+ *
9
+ * Consumido por el alta de usuario orquestada de SureKeep F1 (retail-org → RBAC → RetailUser) vía api-invoker.
10
+ * - Usuario provisionado en estado INVITED (mitiga orphan si el paso siguiente en retail-org falla).
11
+ * - Idempotente por identidad Cognito.
12
+ * - `scope`/`scopeRef` = grant del rol (ej. LEVEL_3 + storeId para un vendedor de tienda).
13
+ * - `createdBy` = cognitoSub del admin real (audit + grantedBy del assignment).
14
+ */
15
+ export class CreateTenantUserRequest {
16
+ @Expose() @IsEmail() email!: string;
17
+ @Expose() @IsOptional() @IsString() @IsNotEmpty() displayName?: string;
18
+ @Expose() @IsString() @IsNotEmpty() roleId!: string;
19
+ @Expose() @IsEnum(PermissionScope) scope!: PermissionScope;
20
+ @Expose() @IsString() @IsNotEmpty() scopeRef!: string;
21
+ @Expose() @IsString() @IsNotEmpty() createdBy!: string;
22
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Respuesta del POST create-tenant-user (endpoint privado). Devuelve el cognitoSub del usuario
3
+ * provisionado, que retail-org guarda en el RetailUser para el match F1↔RBAC. Interface plain → type-only.
4
+ */
5
+ export interface CreateTenantUserResponse {
6
+ cognitoSub: string;
7
+ }
@@ -123,3 +123,11 @@ export type {
123
123
  export * from './dtos/SelfRegisterStartRequest';
124
124
  export * from './dtos/SelfRegisterVerifyOtpRequest';
125
125
  export * from './dtos/SelfRegisterCompleteRequest';
126
+
127
+ // Endpoints privados de espejo de jerarquía + alta de usuario (SureKeep F1, scope mirror).
128
+ // Request DTOs llevan decoradores class-validator → export de valor (se hidratan con plainToInstance);
129
+ // Response son interfaces plain → type-only. Consumidos por retail-org vía api-invoker (Publisher).
130
+ export * from './dtos/CreateLevelEntityRequest';
131
+ export type { CreateLevelEntityResponse } from './dtos/CreateLevelEntityResponse';
132
+ export * from './dtos/CreateTenantUserRequest';
133
+ export type { CreateTenantUserResponse } from './dtos/CreateTenantUserResponse';
@@ -0,0 +1,82 @@
1
+ import { Expose } from 'class-transformer';
2
+ import { IsArray, IsEmail, IsEnum, IsOptional, IsString } from 'class-validator';
3
+ import { CollectorSeniorityEnum } from '../../enums/CollectorSeniorityEnum';
4
+ import { EmploymentTypeEnum } from '../../enums/EmploymentTypeEnum';
5
+ import { PermissionScope } from '../../../platformRbac/enums/PermissionScope';
6
+
7
+ /**
8
+ * Body de POST /retailers/:retailerId/users/provision — alta de usuario retail ORQUESTADA (SureKeep F1,
9
+ * scope mirror). Invierte el orden del alta clásica: en vez de recibir un `cognitoSub` ya existente,
10
+ * retail-org provisiona al usuario en RBAC (Cognito + SharedUser + RoleAssignment) y luego crea el
11
+ * `RetailUser` con el `cognitoSub` retornado. El `retailerId` sale del path.
12
+ *
13
+ * Diferencia con {@link CreateRetailUserRequest}: aquí van `email` + `roleId` + `scope` + `scopeRef`
14
+ * (el grant de RBAC) en lugar de `cognitoSub`. El resto de los atributos comerciales son idénticos.
15
+ */
16
+ export class ProvisionRetailUserRequest {
17
+ /** Identidad de login del usuario a provisionar en Cognito/RBAC. */
18
+ @Expose()
19
+ @IsEmail()
20
+ email!: string;
21
+
22
+ /** Rol de RBAC a asignar (id del rol del tenant). */
23
+ @Expose()
24
+ @IsString()
25
+ roleId!: string;
26
+
27
+ /** Scope del grant (ej. LEVEL_1 = retailer, LEVEL_3 = tienda). */
28
+ @Expose()
29
+ @IsEnum(PermissionScope)
30
+ scope!: PermissionScope;
31
+
32
+ /** Referencia del scope (ej. retailerId para LEVEL_1, storeId para LEVEL_3). */
33
+ @Expose()
34
+ @IsString()
35
+ scopeRef!: string;
36
+
37
+ /**
38
+ * Nombre de display — etiqueta de conveniencia (DEC-SKF1-021). La identidad real vive en RBAC
39
+ * (DEC-SKF1-005); esto es solo un rótulo para reconocer al usuario en el backoffice. Opcional.
40
+ */
41
+ @Expose()
42
+ @IsOptional()
43
+ @IsString()
44
+ displayName?: string;
45
+
46
+ @Expose()
47
+ @IsString()
48
+ homeStoreId!: string;
49
+
50
+ @Expose()
51
+ @IsEnum(EmploymentTypeEnum)
52
+ employmentType!: EmploymentTypeEnum;
53
+
54
+ @Expose()
55
+ @IsString()
56
+ commissionTier!: string;
57
+
58
+ /** Zona de operación del usuario; `null` si no está acotado a una zona. */
59
+ @Expose()
60
+ @IsOptional()
61
+ @IsString()
62
+ zoneId!: string | null;
63
+
64
+ /** Teléfono de contacto del usuario retail; opcional. */
65
+ @Expose()
66
+ @IsOptional()
67
+ @IsString()
68
+ phone?: string;
69
+
70
+ /** Seniority del cobrador; solo aplica a usuarios retail con rol de cobrador. */
71
+ @Expose()
72
+ @IsOptional()
73
+ @IsEnum(CollectorSeniorityEnum)
74
+ collectorSeniority?: CollectorSeniorityEnum;
75
+
76
+ /** Tiendas que cubre el cobrador (zona de cobranza); opcional. */
77
+ @Expose()
78
+ @IsOptional()
79
+ @IsArray()
80
+ @IsString({ each: true })
81
+ coverageStoreIds?: string[];
82
+ }
@@ -35,6 +35,7 @@ export * from './dtos/requests/CreateStoreRequest';
35
35
  export * from './dtos/requests/UpdateStoreRequest';
36
36
  export * from './dtos/requests/ChangeStoreStatusRequest';
37
37
  export * from './dtos/requests/CreateRetailUserRequest';
38
+ export * from './dtos/requests/ProvisionRetailUserRequest';
38
39
  export * from './dtos/requests/UpdateRetailUserRequest';
39
40
  export * from './dtos/requests/ChangeRetailUserStatusRequest';
40
41
  export * from './dtos/requests/TransferRetailUserRequest';