ac3e7061ac6f7ddcc8981f7f8780cac009e896cd
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
LabRe — Sistema de Préstamos LSC UABC
Aplicación web para gestionar préstamos de material del Laboratorio de Sistemas Computacionales (Facultad de Ingeniería, UABC). Modela el vale físico multi-ítem: un trámite agrupa varios materiales, cada renglón con cantidad y descripción.
Producción: https://prestamos.buglabs.dev · Login: exclusivo Google con correo @uabc.edu.mx
Roles
- Alumno: navega el catálogo con búsqueda por texto y filtro por categoría, arma un vale multi-ítem, consulta el estado de sus préstamos.
- Admin: aprueba/rechaza/marca devoluciones, gestiona inventario (grid con fotos), rastrea equipos por unidad individual (laptops, proyectores), reasigna unidades entre préstamos, consulta estadísticas con gráficas y exporta reportes CSV.
Stack
- Frontend: Astro 7 (SSR,
output: 'server') + React 19 islands + Tailwind v4 (tokens ensrc/styles/global.css) - Backend: Supabase self-hosted (Postgres 15, GoTrue, PostgREST, Storage, Realtime)
- Aislamiento: schema Postgres propio
prestamos(coexiste con otras apps en la misma instancia) - Auth: Google OAuth restringido a
@uabc.edu.mx(verificación a nivel aplicación en middleware) - Gráficas: recharts
- Hosting: Docker + adaptador
@astrojs/nodedetrás de Cloudflare Tunnel - CI/deploy: git +
docker compose up -d --builden el homelab
Requisitos
- Node 22.12+
- Acceso a una instancia de Supabase con el schema
prestamos(ver migraciones) - Cuenta Google
@uabc.edu.mxpara probar el flujo
Setup local
cp .env.example .env # llenar PUBLIC_SUPABASE_URL, PUBLIC_SUPABASE_ANON_KEY, SUPABASE_SERVICE_ROLE_KEY, PUBLIC_APP_URL
npm install
npm run dev # http://localhost:4321
Antes del primer login, aplica las migraciones y promuévete a admin manualmente:
update prestamos.profiles set rol = 'admin' where email = 'tu-correo@uabc.edu.mx';
Base de datos
Migraciones en supabase/migrations/, aplican con psql -f <archivo> contra la instancia. Cada migración es idempotente (usa if not exists, drop policy if exists, etc.) y trae su propio BEGIN/COMMIT.
0001_init.sql— schema, tablas base, RLS, triggers, seed.0002_solicitudes_multi_item.sql— rediseño a "1 vale = N renglones", RPCcrear_solicitud.0003_grid_unidades_realtime.sql— imagen del material, unidades individuales, RPCreasignar_unidad, publication realtime, bucket públicomateriales-fotos.
Estructura
src/
├── layouts/
│ └── AppLayout.astro # sidebar desktop + dock móvil + toaster + badge realtime
├── lib/
│ ├── supabase.ts # server/browser clients (schema 'prestamos')
│ ├── date.ts # todayMX() con Intl + DST correcto
│ └── materialImg.ts # URL pública del bucket
├── middleware.ts # auth + dominio + verificación de rol
├── pages/
│ ├── login.astro
│ ├── alumno/
│ │ ├── catalogo.astro # grid + filtro categorías + buscador
│ │ └── mis-prestamos.astro
│ ├── admin/
│ │ ├── index.astro # panel con KPIs
│ │ ├── solicitudes/ # bandeja, activos, historial
│ │ ├── inventario/ # grid CRUD + categorías
│ │ ├── estadisticas.astro # 6 KPIs + 3 gráficas recharts
│ │ └── reportes.astro # filtros + export CSV
│ └── api/ # endpoints REST (guardados por middleware)
├── components/
│ ├── alumno/ # SolicitudCart, AgregarMaterial, FiltroCategorias, BuscadorCatalogo
│ ├── admin/ # solicitudes, inventario (MaterialForm, UnidadesManager), estadisticas (Chart), BadgeSolicitudes
│ └── Toaster.tsx # notificaciones globales estilo Sileo
└── styles/global.css # tokens paleta UABC + sistema neobrutalista
Deploy
Ver deploy/README.md para el detalle. Flujo resumido:
git push
ssh buglabs 'cd ~/labre-web && git pull && docker compose up -d --build'
Comandos
| Comando | Acción |
|---|---|
npm install |
Instala dependencias |
npm run dev |
Dev server en localhost:4321 |
npm run build |
Compila a ./dist/ (SSR bundle) |
npm run preview |
Preview del build |
Documentación interna
AGENTS.md— decisiones de arquitectura, bitácora de sesiones, backlog. Fuente única de verdad del progreso.DESIGN.md— sistema de diseño (paleta UABC, tipografía, sombra dura, Text-on-Fill Rule).PRODUCT.md— visión de producto y brand commitments.
Description
Sistema de prestamos de equipo de laboratorio para el laboratorio de sistemas computacionales de la uabc
Languages
TypeScript
50.4%
Astro
32.7%
PLpgSQL
14%
CSS
2.5%
Dockerfile
0.2%
Other
0.2%