fix(web): UsuarioPermisos shape nested para matchear backend [UDT-009]
El backend devuelve { rolPermisos, overrides: {grant, deny}, effective }
(nested) segun spec, pero el frontend lo lee como {grant, deny} planos.
Causaba TypeError: permisoData.grant is not iterable al abrir tab Permisos.
Tests del frontend actualizados con el shape correcto.
This commit is contained in:
@@ -55,9 +55,9 @@ export function PermisosEditor({ userId }: PermisosEditorProps) {
|
||||
// Start all known codes as 'heredado'
|
||||
for (const c of permisoData.rolPermisos) map.set(c, 'heredado')
|
||||
// Apply grant overrides
|
||||
for (const c of permisoData.grant) map.set(c, 'concedido')
|
||||
for (const c of permisoData.overrides.grant) map.set(c, 'concedido')
|
||||
// Apply deny overrides
|
||||
for (const c of permisoData.deny) map.set(c, 'denegado')
|
||||
for (const c of permisoData.overrides.deny) map.set(c, 'denegado')
|
||||
setStates(map)
|
||||
setSaveError(null)
|
||||
}, [permisoData])
|
||||
@@ -79,8 +79,8 @@ export function PermisosEditor({ userId }: PermisosEditorProps) {
|
||||
// Filter catalog to only show permisos that appear in rolPermisos, grant, deny, or all catalog
|
||||
const allCodes = new Set([
|
||||
...permisoData.rolPermisos,
|
||||
...permisoData.grant,
|
||||
...permisoData.deny,
|
||||
...permisoData.overrides.grant,
|
||||
...permisoData.overrides.deny,
|
||||
])
|
||||
|
||||
// Use catalog for grouping and names, showing all permisos known plus any from overrides
|
||||
|
||||
@@ -50,11 +50,11 @@ export interface UpdateUserPayload {
|
||||
// UDT-009 — Permisos overrides per-user types
|
||||
|
||||
export interface UsuarioPermisos {
|
||||
usuarioId: number
|
||||
rol: string
|
||||
rolPermisos: string[]
|
||||
overrides: {
|
||||
grant: string[]
|
||||
deny: string[]
|
||||
}
|
||||
effective: string[]
|
||||
}
|
||||
|
||||
|
||||
@@ -18,11 +18,11 @@ const catalogoPermisos = [
|
||||
|
||||
// User permisos — from /api/v1/users/42/permisos
|
||||
const mockUsuarioPermisos = {
|
||||
usuarioId: 42,
|
||||
rol: 'cajero',
|
||||
rolPermisos: ['ventas:contado:crear', 'ventas:contado:cobrar'],
|
||||
overrides: {
|
||||
grant: ['textos:editar'],
|
||||
deny: ['ventas:contado:cobrar'],
|
||||
},
|
||||
effective: ['ventas:contado:crear', 'textos:editar'],
|
||||
}
|
||||
|
||||
|
||||
@@ -6,11 +6,11 @@ import { getUserPermisos } from '../../../features/users/api/getUserPermisos'
|
||||
const API_URL = 'http://localhost:5000'
|
||||
|
||||
const mockUsuarioPermisos = {
|
||||
usuarioId: 42,
|
||||
rol: 'cajero',
|
||||
rolPermisos: ['ventas:contado:crear', 'ventas:contado:cobrar'],
|
||||
overrides: {
|
||||
grant: ['textos:editar'],
|
||||
deny: ['ventas:contado:cobrar'],
|
||||
},
|
||||
effective: ['ventas:contado:crear', 'textos:editar'],
|
||||
}
|
||||
|
||||
@@ -30,11 +30,9 @@ describe('getUserPermisos api client', () => {
|
||||
|
||||
const result = await getUserPermisos(42)
|
||||
|
||||
expect(result.usuarioId).toBe(42)
|
||||
expect(result.rol).toBe('cajero')
|
||||
expect(result.rolPermisos).toEqual(['ventas:contado:crear', 'ventas:contado:cobrar'])
|
||||
expect(result.grant).toEqual(['textos:editar'])
|
||||
expect(result.deny).toEqual(['ventas:contado:cobrar'])
|
||||
expect(result.overrides.grant).toEqual(['textos:editar'])
|
||||
expect(result.overrides.deny).toEqual(['ventas:contado:cobrar'])
|
||||
expect(result.effective).toEqual(['ventas:contado:crear', 'textos:editar'])
|
||||
})
|
||||
|
||||
|
||||
Reference in New Issue
Block a user