fix: muestra fallo real al ligar permisos y reconfirma persistencia (#10)
togglePermission confiaba solo en res.ok de un fetch sin use:enhance, así que ocultaba el fail(500) del action y pintaba "Con Acceso" en falso aunque el INSERT tronara (42P10 por falta de UNIQUE en a24c). - togglePermission: manda x-sveltekit-action, deserializa el ActionResult, valida type === 'success', relee del servidor y muestra error si falla - GET de permisos: cache-control no-store para evitar lecturas viejas Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Reviewed-on: #10 Co-authored-by: AlexeerCT <acazares@aduanasoft.com.mx> Co-committed-by: AlexeerCT <acazares@aduanasoft.com.mx>
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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 });
|
||||
|
||||
Reference in New Issue
Block a user