Rediseño visual UABC + Mulish + auditoría de BD (P0/P1)
Rediseño visual: - Nueva identidad UABC/editorial (DESIGN.md), tipografía Mulish, tokens verde/dorado/negro sobre bone-white, patrón de puntos verde en canvas, radios 8/12/30/9999, sin sombras, hairline 1px, tarjetas con leve transparencia + blur suave + borde verde muy sutil. - 45 archivos .astro/.tsx alineados al nuevo sistema (Track A/B/C/D/E). - Limpieza post-critique: eliminado triple CTA en home alumno, .card anidados en admin, aria-live decorativo, 26 aliases legacy en global.css, border-l verde en nav (patrón AI-slop), classList.remove obsoletos. Auditoría de llamadas a BD (para 20-50 usuarios concurrentes): - P0-1: middleware con cache in-memory de profile (30s) + is_banned (30s) por uid; exclusión de assets estáticos (/_astro/*, /audio/*, favicon). Invalidación en signout, PATCH /profile, baneos. - P0-2: eliminado count pendientes duplicado en AppLayout; badge se hidrata client-side (BadgeSolicitudes con fetch inicial). - P0-3: migración 0008 REPLICA IDENTITY FULL en solicitudes + delta preciso en BadgeSolicitudes (con fallback a refetch). - P1: admin/index dedupe (4 queries → 2 con recientes.filter), catalogo reusa profile del middleware (3 queries → 1), inventario paralelo, estadisticas con cache 60s en RAM (stats-cache.ts), migración 0009 con 3 índices (fecha, vencidos parcial, audit compuesto). Fixes P0 de UI post-critique: - estadisticas.astro: ReferenceError DIAS restaurado. - solicitudes (3 vistas): error rendering sanitizado (no expone mensaje Postgres crudo al admin). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014xaxs8cGcQe9NwbMqA1gvn
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
-- Migración 0008 — REPLICA IDENTITY FULL en prestamos.solicitudes
|
||||
--
|
||||
-- Motivo: el badge de solicitudes pendientes (client-side, componente
|
||||
-- BadgeSolicitudes) escucha postgres_changes UPDATE. Con REPLICA IDENTITY
|
||||
-- DEFAULT (default de Postgres) el WAL solo emite la PK en `payload.old`,
|
||||
-- así que el cliente no puede saber el estado anterior y estaba obligado
|
||||
-- a refetchear el count completo en cada UPDATE — costoso a 20-50 admins
|
||||
-- concurrentes.
|
||||
--
|
||||
-- Con FULL, el WAL emite la fila completa `old`, y el cliente puede
|
||||
-- aplicar el delta (+1/-1/no-op) sin ir a la BD. Trade-off: aumenta el
|
||||
-- ancho de banda del WAL para replicación — irrelevante en esta tabla
|
||||
-- (miles de filas, pocos updates/segundo).
|
||||
--
|
||||
-- Idempotente.
|
||||
|
||||
begin;
|
||||
|
||||
alter table prestamos.solicitudes replica identity full;
|
||||
|
||||
commit;
|
||||
@@ -0,0 +1,30 @@
|
||||
-- Migración 0009 — índices para queries frecuentes
|
||||
--
|
||||
-- Cubre 3 hot paths detectados en la auditoría:
|
||||
--
|
||||
-- 1) ORDER BY fecha_solicitud DESC — usado en admin/index, mis-prestamos,
|
||||
-- estadisticas, reportes. Sin índice, a >5k filas Postgres hace sort en
|
||||
-- memoria en cada request.
|
||||
--
|
||||
-- 2) "Vencidos": estado IN ('aprobado','activo') AND fecha_devolucion_estimada < today.
|
||||
-- Índice parcial: solo indexa filas activas (10-100 filas típicas), evita
|
||||
-- inflar el índice con solicitudes ya devueltas/rechazadas.
|
||||
--
|
||||
-- 3) audit_log filtrado por estado_nuevo + rango de at (estadisticas del día).
|
||||
-- El compuesto acelera los 3 counts diarios (aprobadas/rechazadas/devueltas).
|
||||
--
|
||||
-- Todos idempotentes vía IF NOT EXISTS.
|
||||
|
||||
begin;
|
||||
|
||||
create index if not exists solicitudes_fecha_idx
|
||||
on prestamos.solicitudes (fecha_solicitud desc);
|
||||
|
||||
create index if not exists solicitudes_vencidos_idx
|
||||
on prestamos.solicitudes (fecha_devolucion_estimada)
|
||||
where estado in ('aprobado', 'activo');
|
||||
|
||||
create index if not exists audit_estado_at_idx
|
||||
on prestamos.audit_log (estado_nuevo, at desc);
|
||||
|
||||
commit;
|
||||
Reference in New Issue
Block a user