fix: muestra fallo real al ligar permisos y reconfirma persistencia #10

Merged
acazares merged 1 commits from fix/permisos-no-persisten-uq-constraint into development 2026-06-09 15:45:08 +00:00
2 changed files with 40 additions and 17 deletions

View File

@@ -1,5 +1,6 @@
<script lang="ts">
import aduanasoftLogo from '$lib/assets/logo.png';
import { deserialize } from '$app/forms';
let { data } = $props();
const { usuarios, currentUser, allDatabases } = data;
@@ -23,6 +24,7 @@
// Permisos de bases de datos
let userPermissions = $state<string[]>([]);
let permissionSearch = $state('');
let permissionError = $state('');
const filteredUsers = $derived(
usuariosList.filter(u =>
@@ -67,16 +69,23 @@
showEditModal = true;
}
async function openPermissionsModal(user: any) {
selectedUser = user;
// Cargar permisos del usuario
const res = await fetch(`/usuarios/api/permissions?userId=${user.id}`);
// Lee los permisos reales desde el servidor (fuente de verdad).
async function loadPermissions(userId: number) {
const res = await fetch(`/usuarios/api/permissions?userId=${userId}`, {
headers: { 'cache-control': 'no-store' }
});
if (res.ok) {
const data = await res.json();
userPermissions = data.permissions || [];
} else {
permissionError = 'No se pudieron cargar los permisos.';
}
}
async function openPermissionsModal(user: any) {
selectedUser = user;
permissionError = '';
await loadPermissions(user.id);
showPermissionsModal = true;
}
@@ -162,23 +171,31 @@
async function togglePermission(dbName: string) {
const hasPermission = userPermissions.includes(dbName);
permissionError = '';
const form = new FormData();
form.append('userId', String(selectedUser.id));
form.append('baseDatosNombre', dbName);
form.append('action', hasPermission ? 'remove' : 'assign');
// El header x-sveltekit-action hace que SvelteKit responda con el ActionResult
// en JSON (no un redirect), para poder validar el éxito real del action.
const res = await fetch('?/managePermissions', {
method: 'POST',
headers: { 'x-sveltekit-action': 'true' },
body: form
});
if (res.ok) {
if (hasPermission) {
userPermissions = userPermissions.filter(p => p !== dbName);
const result = deserialize(await res.text());
if (result.type === 'success') {
// Reconfirma contra el servidor en vez de asumir el estado local.
await loadPermissions(selectedUser.id);
} else if (result.type === 'failure') {
permissionError =
(result.data?.error as string) || 'No se pudo guardar el permiso.';
} else {
userPermissions = [...userPermissions, dbName];
}
permissionError = 'Error inesperado al guardar el permiso.';
}
}
</script>
@@ -562,6 +579,12 @@
Permisos de: {selectedUser.username}
</h2>
{#if permissionError}
<div class="mb-4 rounded-lg bg-red-50 p-3 text-sm text-red-700">
{permissionError}
</div>
{/if}
{#if selectedUser.es_admin}
<div class="mb-4 rounded-lg bg-purple-50 p-3 text-sm text-purple-700">
<p class="font-medium">Este usuario es administrador y tiene acceso a todas las bases de datos.</p>

View File

@@ -11,7 +11,7 @@ export const GET: RequestHandler = async ({ url }) => {
try {
const permissions = await getUserDatabasePermissions(userId);
return json({ permissions });
return json({ permissions }, { headers: { 'cache-control': 'no-store' } });
} catch (error) {
console.error('Error obteniendo permisos:', error);
return json({ error: 'Error al obtener permisos' }, { status: 500 });