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:
2026-04-16 10:06:43 -03:00
parent b7882613a4
commit a30b10ebff
4 changed files with 18 additions and 20 deletions

View File

@@ -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

View File

@@ -50,11 +50,11 @@ export interface UpdateUserPayload {
// UDT-009 — Permisos overrides per-user types
export interface UsuarioPermisos {
usuarioId: number
rol: string
rolPermisos: string[]
grant: string[]
deny: string[]
overrides: {
grant: string[]
deny: string[]
}
effective: string[]
}

View File

@@ -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'],
grant: ['textos:editar'],
deny: ['ventas:contado:cobrar'],
overrides: {
grant: ['textos:editar'],
deny: ['ventas:contado:cobrar'],
},
effective: ['ventas:contado:crear', 'textos:editar'],
}

View File

@@ -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'],
grant: ['textos:editar'],
deny: ['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'])
})