@fiado/type-kit 3.146.0 → 3.148.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/platformRbac/dtos/AuthorizeRequest.test.ts +1 -1
- package/_test_/unit/platformRbac/dtos/UpdateTenantAutoregisterRequest.test.ts +3 -3
- package/bin/platformRbac/application/cascade.d.ts +45 -0
- package/bin/platformRbac/application/cascade.js +2 -0
- package/bin/platformRbac/enums/PermissionScope.d.ts +7 -17
- package/bin/platformRbac/enums/PermissionScope.js +7 -17
- package/bin/platformRbac/index.d.ts +1 -0
- package/package.json +1 -1
- package/src/platformRbac/application/cascade.ts +51 -0
- package/src/platformRbac/enums/PermissionScope.ts +7 -17
- package/src/platformRbac/index.ts +7 -0
|
@@ -9,7 +9,7 @@ describe('AuthorizeRequest', () => {
|
|
|
9
9
|
const dto = plainToInstance(AuthorizeRequest, {
|
|
10
10
|
token: 'jwt.abc.def',
|
|
11
11
|
permission: 'tenant.user.create',
|
|
12
|
-
scope: PermissionScope.
|
|
12
|
+
scope: PermissionScope.LEVEL_1,
|
|
13
13
|
scopeRef: 'VL-001',
|
|
14
14
|
});
|
|
15
15
|
const errors = await validate(dto);
|
|
@@ -11,8 +11,8 @@ describe('UpdateTenantAutoregisterRequest', () => {
|
|
|
11
11
|
const valid = {
|
|
12
12
|
enabled: true,
|
|
13
13
|
allowedRoles: [
|
|
14
|
-
{ roleId: 'role-agente', scope: '
|
|
15
|
-
{ roleId: 'role-rrhh', scope: '
|
|
14
|
+
{ roleId: 'role-agente', scope: 'LEVEL_1', allowedScopeRefs: ['grp-1'] },
|
|
15
|
+
{ roleId: 'role-rrhh', scope: 'LEVEL_1' },
|
|
16
16
|
],
|
|
17
17
|
otpTtlSeconds: 300,
|
|
18
18
|
};
|
|
@@ -66,6 +66,6 @@ describe('UpdateTenantAutoregisterRequest', () => {
|
|
|
66
66
|
it('hidrata cada allowedRole a UpdateTenantAutoregisterAllowedRole con su scope enum', async () => {
|
|
67
67
|
const dto = plainToInstance(UpdateTenantAutoregisterRequest, valid);
|
|
68
68
|
expect(dto.allowedRoles[0]).toBeInstanceOf(UpdateTenantAutoregisterAllowedRole);
|
|
69
|
-
expect(dto.allowedRoles[0].scope).toBe(PermissionScope.
|
|
69
|
+
expect(dto.allowedRoles[0].scope).toBe(PermissionScope.LEVEL_1);
|
|
70
70
|
});
|
|
71
71
|
});
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { PermissionScope } from '../enums/PermissionScope';
|
|
2
|
+
import { ApplicationPermission } from './ApplicationPermission';
|
|
3
|
+
/**
|
|
4
|
+
* DEC-RBAC-092: al actualizar el `scope` de un permiso del catálogo de una app, el backend recalcula
|
|
5
|
+
* en cascada el scope de los roles que lo usan en todos los tenants de esa app y REPORTA (no modifica)
|
|
6
|
+
* las asignaciones que quedaron inconsistentes (Opción A). Estos tipos son el contrato de ese reporte.
|
|
7
|
+
*/
|
|
8
|
+
/** Un rol cuyo scope se recalculó (y cambió) por el cascade. */
|
|
9
|
+
export interface RoleScopeRecompute {
|
|
10
|
+
tenantId: string;
|
|
11
|
+
roleId: string;
|
|
12
|
+
previousScope: PermissionScope;
|
|
13
|
+
newScope: PermissionScope;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Asignación que quedó inconsistente: su `scope` almacenado ya no coincide con el nuevo scope del rol.
|
|
17
|
+
* NO se modifica; se reporta para que el admin reasigne (DEC-RBAC-092, Opción A).
|
|
18
|
+
*/
|
|
19
|
+
export interface InconsistentAssignment {
|
|
20
|
+
tenantId: string;
|
|
21
|
+
roleId: string;
|
|
22
|
+
assignmentId: string;
|
|
23
|
+
cognitoSub: string;
|
|
24
|
+
assignmentScope: PermissionScope;
|
|
25
|
+
assignmentScopeRef: string;
|
|
26
|
+
}
|
|
27
|
+
/** Un silo (tenant) cuyo recálculo falló (best-effort — no aborta el resto). */
|
|
28
|
+
export interface CascadeTenantFailure {
|
|
29
|
+
tenantId: string;
|
|
30
|
+
error: string;
|
|
31
|
+
}
|
|
32
|
+
/** Resumen del cascade de recálculo de scope de roles (DEC-RBAC-092). */
|
|
33
|
+
export interface CascadeReport {
|
|
34
|
+
rolesRecomputed: RoleScopeRecompute[];
|
|
35
|
+
inconsistentAssignments: InconsistentAssignment[];
|
|
36
|
+
failedTenants: CascadeTenantFailure[];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Respuesta de `PUT /applications/{id}/permissions/{key}`: el permiso actualizado + (si el cambio de
|
|
40
|
+
* scope disparó el cascade) el resumen. `cascade` ausente si el update no cambió el scope.
|
|
41
|
+
*/
|
|
42
|
+
export interface UpdateApplicationPermissionResponse {
|
|
43
|
+
permission: ApplicationPermission;
|
|
44
|
+
cascade?: CascadeReport;
|
|
45
|
+
}
|
|
@@ -1,27 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* Jerarquía agents: PLATFORM > TENANT > GROUP.
|
|
4
|
-
* Componente 01 spec.
|
|
2
|
+
* Scopes de autorización del RBAC: PLATFORM > TENANT > (niveles genéricos de la aplicación).
|
|
5
3
|
*
|
|
6
|
-
* Modelo genérico de aplicación (DEC-RBAC-032):
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* cuyo `displayName` lo decide cada aplicación (ver LevelDef en application/Application).
|
|
4
|
+
* Modelo genérico de aplicación (DEC-RBAC-032): una aplicación define su jerarquía DEBAJO de TENANT
|
|
5
|
+
* con niveles genéricos LEVEL_1 > LEVEL_2 > LEVEL_3, cuyo `displayName` lo decide cada aplicación
|
|
6
|
+
* (ver LevelDef en application/Application).
|
|
10
7
|
*
|
|
11
|
-
* DEC-RBAC-091 (Fase
|
|
12
|
-
* LEVEL_N (DEC-RBAC-090
|
|
13
|
-
*
|
|
14
|
-
* migran por fases; se REMUEVEN en Fase 5 (bump MAJOR) cuando ninguno los use.
|
|
8
|
+
* DEC-RBAC-091 (Fase 5): removidos los scopes legacy RETAILER/STORE/GROUP (estaban atados a
|
|
9
|
+
* tenant-types concretos). El modelo correcto es LEVEL_N (DEC-RBAC-090). Bump MINOR (3.x): los
|
|
10
|
+
* consumidores son internos y se migran en el mismo batch coordinado.
|
|
15
11
|
*/
|
|
16
12
|
export declare enum PermissionScope {
|
|
17
13
|
PLATFORM = "PLATFORM",
|
|
18
14
|
TENANT = "TENANT",
|
|
19
|
-
/** @deprecated DEC-RBAC-091: usar LEVEL_N. Se remueve en Fase 5 (MAJOR). */
|
|
20
|
-
RETAILER = "RETAILER",
|
|
21
|
-
/** @deprecated DEC-RBAC-091: usar LEVEL_N. Se remueve en Fase 5 (MAJOR). */
|
|
22
|
-
STORE = "STORE",
|
|
23
|
-
/** @deprecated DEC-RBAC-091: usar LEVEL_N. Se remueve en Fase 5 (MAJOR). */
|
|
24
|
-
GROUP = "GROUP",
|
|
25
15
|
LEVEL_1 = "LEVEL_1",
|
|
26
16
|
LEVEL_2 = "LEVEL_2",
|
|
27
17
|
LEVEL_3 = "LEVEL_3"
|
|
@@ -2,30 +2,20 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.PermissionScope = void 0;
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
6
|
-
* Jerarquía agents: PLATFORM > TENANT > GROUP.
|
|
7
|
-
* Componente 01 spec.
|
|
5
|
+
* Scopes de autorización del RBAC: PLATFORM > TENANT > (niveles genéricos de la aplicación).
|
|
8
6
|
*
|
|
9
|
-
* Modelo genérico de aplicación (DEC-RBAC-032):
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* cuyo `displayName` lo decide cada aplicación (ver LevelDef en application/Application).
|
|
7
|
+
* Modelo genérico de aplicación (DEC-RBAC-032): una aplicación define su jerarquía DEBAJO de TENANT
|
|
8
|
+
* con niveles genéricos LEVEL_1 > LEVEL_2 > LEVEL_3, cuyo `displayName` lo decide cada aplicación
|
|
9
|
+
* (ver LevelDef en application/Application).
|
|
13
10
|
*
|
|
14
|
-
* DEC-RBAC-091 (Fase
|
|
15
|
-
* LEVEL_N (DEC-RBAC-090
|
|
16
|
-
*
|
|
17
|
-
* migran por fases; se REMUEVEN en Fase 5 (bump MAJOR) cuando ninguno los use.
|
|
11
|
+
* DEC-RBAC-091 (Fase 5): removidos los scopes legacy RETAILER/STORE/GROUP (estaban atados a
|
|
12
|
+
* tenant-types concretos). El modelo correcto es LEVEL_N (DEC-RBAC-090). Bump MINOR (3.x): los
|
|
13
|
+
* consumidores son internos y se migran en el mismo batch coordinado.
|
|
18
14
|
*/
|
|
19
15
|
var PermissionScope;
|
|
20
16
|
(function (PermissionScope) {
|
|
21
17
|
PermissionScope["PLATFORM"] = "PLATFORM";
|
|
22
18
|
PermissionScope["TENANT"] = "TENANT";
|
|
23
|
-
/** @deprecated DEC-RBAC-091: usar LEVEL_N. Se remueve en Fase 5 (MAJOR). */
|
|
24
|
-
PermissionScope["RETAILER"] = "RETAILER";
|
|
25
|
-
/** @deprecated DEC-RBAC-091: usar LEVEL_N. Se remueve en Fase 5 (MAJOR). */
|
|
26
|
-
PermissionScope["STORE"] = "STORE";
|
|
27
|
-
/** @deprecated DEC-RBAC-091: usar LEVEL_N. Se remueve en Fase 5 (MAJOR). */
|
|
28
|
-
PermissionScope["GROUP"] = "GROUP";
|
|
29
19
|
PermissionScope["LEVEL_1"] = "LEVEL_1";
|
|
30
20
|
PermissionScope["LEVEL_2"] = "LEVEL_2";
|
|
31
21
|
PermissionScope["LEVEL_3"] = "LEVEL_3";
|
|
@@ -44,6 +44,7 @@ export * from './enums/PermissionKind';
|
|
|
44
44
|
export type { LevelDef, ApplicationSecurityPolicyDefault, ApplicationBrandingDefault, AutoregisterAllowedRole, AutoregisterConfig, ApplicationDefaults, SeedRole, Application, } from './application/Application';
|
|
45
45
|
export type { ApplicationPermission } from './application/ApplicationPermission';
|
|
46
46
|
export type { CreateApplicationRequest, UpdateApplicationRequest, UpsertApplicationPermissionRequest, } from './application/requests';
|
|
47
|
+
export type { RoleScopeRecompute, InconsistentAssignment, CascadeTenantFailure, CascadeReport, UpdateApplicationPermissionResponse, } from './application/cascade';
|
|
47
48
|
export * from './dtos/SelfRegisterStartRequest';
|
|
48
49
|
export * from './dtos/SelfRegisterVerifyOtpRequest';
|
|
49
50
|
export * from './dtos/SelfRegisterCompleteRequest';
|
package/package.json
CHANGED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { PermissionScope } from '../enums/PermissionScope';
|
|
2
|
+
import { ApplicationPermission } from './ApplicationPermission';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* DEC-RBAC-092: al actualizar el `scope` de un permiso del catálogo de una app, el backend recalcula
|
|
6
|
+
* en cascada el scope de los roles que lo usan en todos los tenants de esa app y REPORTA (no modifica)
|
|
7
|
+
* las asignaciones que quedaron inconsistentes (Opción A). Estos tipos son el contrato de ese reporte.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/** Un rol cuyo scope se recalculó (y cambió) por el cascade. */
|
|
11
|
+
export interface RoleScopeRecompute {
|
|
12
|
+
tenantId: string;
|
|
13
|
+
roleId: string;
|
|
14
|
+
previousScope: PermissionScope;
|
|
15
|
+
newScope: PermissionScope;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Asignación que quedó inconsistente: su `scope` almacenado ya no coincide con el nuevo scope del rol.
|
|
20
|
+
* NO se modifica; se reporta para que el admin reasigne (DEC-RBAC-092, Opción A).
|
|
21
|
+
*/
|
|
22
|
+
export interface InconsistentAssignment {
|
|
23
|
+
tenantId: string;
|
|
24
|
+
roleId: string;
|
|
25
|
+
assignmentId: string;
|
|
26
|
+
cognitoSub: string;
|
|
27
|
+
assignmentScope: PermissionScope;
|
|
28
|
+
assignmentScopeRef: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Un silo (tenant) cuyo recálculo falló (best-effort — no aborta el resto). */
|
|
32
|
+
export interface CascadeTenantFailure {
|
|
33
|
+
tenantId: string;
|
|
34
|
+
error: string;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Resumen del cascade de recálculo de scope de roles (DEC-RBAC-092). */
|
|
38
|
+
export interface CascadeReport {
|
|
39
|
+
rolesRecomputed: RoleScopeRecompute[];
|
|
40
|
+
inconsistentAssignments: InconsistentAssignment[];
|
|
41
|
+
failedTenants: CascadeTenantFailure[];
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Respuesta de `PUT /applications/{id}/permissions/{key}`: el permiso actualizado + (si el cambio de
|
|
46
|
+
* scope disparó el cascade) el resumen. `cascade` ausente si el update no cambió el scope.
|
|
47
|
+
*/
|
|
48
|
+
export interface UpdateApplicationPermissionResponse {
|
|
49
|
+
permission: ApplicationPermission;
|
|
50
|
+
cascade?: CascadeReport;
|
|
51
|
+
}
|
|
@@ -1,27 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* Jerarquía agents: PLATFORM > TENANT > GROUP.
|
|
4
|
-
* Componente 01 spec.
|
|
2
|
+
* Scopes de autorización del RBAC: PLATFORM > TENANT > (niveles genéricos de la aplicación).
|
|
5
3
|
*
|
|
6
|
-
* Modelo genérico de aplicación (DEC-RBAC-032):
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* cuyo `displayName` lo decide cada aplicación (ver LevelDef en application/Application).
|
|
4
|
+
* Modelo genérico de aplicación (DEC-RBAC-032): una aplicación define su jerarquía DEBAJO de TENANT
|
|
5
|
+
* con niveles genéricos LEVEL_1 > LEVEL_2 > LEVEL_3, cuyo `displayName` lo decide cada aplicación
|
|
6
|
+
* (ver LevelDef en application/Application).
|
|
10
7
|
*
|
|
11
|
-
* DEC-RBAC-091 (Fase
|
|
12
|
-
* LEVEL_N (DEC-RBAC-090
|
|
13
|
-
*
|
|
14
|
-
* migran por fases; se REMUEVEN en Fase 5 (bump MAJOR) cuando ninguno los use.
|
|
8
|
+
* DEC-RBAC-091 (Fase 5): removidos los scopes legacy RETAILER/STORE/GROUP (estaban atados a
|
|
9
|
+
* tenant-types concretos). El modelo correcto es LEVEL_N (DEC-RBAC-090). Bump MINOR (3.x): los
|
|
10
|
+
* consumidores son internos y se migran en el mismo batch coordinado.
|
|
15
11
|
*/
|
|
16
12
|
export enum PermissionScope {
|
|
17
13
|
PLATFORM = 'PLATFORM',
|
|
18
14
|
TENANT = 'TENANT',
|
|
19
|
-
/** @deprecated DEC-RBAC-091: usar LEVEL_N. Se remueve en Fase 5 (MAJOR). */
|
|
20
|
-
RETAILER = 'RETAILER',
|
|
21
|
-
/** @deprecated DEC-RBAC-091: usar LEVEL_N. Se remueve en Fase 5 (MAJOR). */
|
|
22
|
-
STORE = 'STORE',
|
|
23
|
-
/** @deprecated DEC-RBAC-091: usar LEVEL_N. Se remueve en Fase 5 (MAJOR). */
|
|
24
|
-
GROUP = 'GROUP',
|
|
25
15
|
LEVEL_1 = 'LEVEL_1',
|
|
26
16
|
LEVEL_2 = 'LEVEL_2',
|
|
27
17
|
LEVEL_3 = 'LEVEL_3',
|
|
@@ -106,6 +106,13 @@ export type {
|
|
|
106
106
|
UpdateApplicationRequest,
|
|
107
107
|
UpsertApplicationPermissionRequest,
|
|
108
108
|
} from './application/requests';
|
|
109
|
+
export type {
|
|
110
|
+
RoleScopeRecompute,
|
|
111
|
+
InconsistentAssignment,
|
|
112
|
+
CascadeTenantFailure,
|
|
113
|
+
CascadeReport,
|
|
114
|
+
UpdateApplicationPermissionResponse,
|
|
115
|
+
} from './application/cascade';
|
|
109
116
|
|
|
110
117
|
// Autoregistro self-service por tenant (DEC-RBAC-030..034). Los Request llevan decoradores
|
|
111
118
|
// class-validator (export de valor — se hidratan con plainToInstance); los Response son interfaces
|