UDT-009: Overrides de PermisosJson por usuario — cierre módulo Auth #12

Merged
dmolinari merged 14 commits from feature/UDT-009 into main 2026-04-16 13:12:23 +00:00
4 changed files with 18 additions and 20 deletions
Showing only changes of commit a30b10ebff - Show all commits

View File

@@ -55,9 +55,9 @@ export function PermisosEditor({ userId }: PermisosEditorProps) {
// Start all known codes as 'heredado' // Start all known codes as 'heredado'
for (const c of permisoData.rolPermisos) map.set(c, 'heredado') for (const c of permisoData.rolPermisos) map.set(c, 'heredado')
// Apply grant overrides // 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 // 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) setStates(map)
setSaveError(null) setSaveError(null)
}, [permisoData]) }, [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 // Filter catalog to only show permisos that appear in rolPermisos, grant, deny, or all catalog
const allCodes = new Set([ const allCodes = new Set([
...permisoData.rolPermisos, ...permisoData.rolPermisos,
...permisoData.grant, ...permisoData.overrides.grant,
...permisoData.deny, ...permisoData.overrides.deny,
]) ])
// Use catalog for grouping and names, showing all permisos known plus any from overrides // 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 // UDT-009 — Permisos overrides per-user types
export interface UsuarioPermisos { export interface UsuarioPermisos {
usuarioId: number
rol: string
rolPermisos: string[] rolPermisos: string[]
grant: string[] overrides: {
deny: string[] grant: string[]
deny: string[]
}
effective: string[] effective: string[]
} }

View File

@@ -18,11 +18,11 @@ const catalogoPermisos = [
// User permisos — from /api/v1/users/42/permisos // User permisos — from /api/v1/users/42/permisos
const mockUsuarioPermisos = { const mockUsuarioPermisos = {
usuarioId: 42,
rol: 'cajero',
rolPermisos: ['ventas:contado:crear', 'ventas:contado:cobrar'], rolPermisos: ['ventas:contado:crear', 'ventas:contado:cobrar'],
grant: ['textos:editar'], overrides: {
deny: ['ventas:contado:cobrar'], grant: ['textos:editar'],
deny: ['ventas:contado:cobrar'],
},
effective: ['ventas:contado:crear', 'textos:editar'], 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 API_URL = 'http://localhost:5000'
const mockUsuarioPermisos = { const mockUsuarioPermisos = {
usuarioId: 42,
rol: 'cajero',
rolPermisos: ['ventas:contado:crear', 'ventas:contado:cobrar'], rolPermisos: ['ventas:contado:crear', 'ventas:contado:cobrar'],
grant: ['textos:editar'], overrides: {
deny: ['ventas:contado:cobrar'], grant: ['textos:editar'],
deny: ['ventas:contado:cobrar'],
},
effective: ['ventas:contado:crear', 'textos:editar'], effective: ['ventas:contado:crear', 'textos:editar'],
} }
@@ -30,11 +30,9 @@ describe('getUserPermisos api client', () => {
const result = await getUserPermisos(42) 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.rolPermisos).toEqual(['ventas:contado:crear', 'ventas:contado:cobrar'])
expect(result.grant).toEqual(['textos:editar']) expect(result.overrides.grant).toEqual(['textos:editar'])
expect(result.deny).toEqual(['ventas:contado:cobrar']) expect(result.overrides.deny).toEqual(['ventas:contado:cobrar'])
expect(result.effective).toEqual(['ventas:contado:crear', 'textos:editar']) expect(result.effective).toEqual(['ventas:contado:crear', 'textos:editar'])
}) })