Files
labre-web/src/pages/api/admin/reportes/materiales.ts
T
LakG 1121ab7199 Sistema de préstamos LabRe UABC — implementación inicial
Sistema web para gestión de préstamos de material del Laboratorio de
Sistemas Computacionales de la UABC.

- Backend: Supabase self-hosted, schema aislado `prestamos` con RLS,
  triggers de stock y audit log (supabase/migrations/0001_init.sql).
- Auth: Google OAuth restringido a @uabc.edu.mx, verificado en
  middleware y como segunda línea en trigger de DB.
- Frontend: Astro 7 (SSR con adapter Node) + React islands + Tailwind
  v4 con paleta UABC (primary #00723F, secondary #DD971A) bajo regla
  60/30/10.
- Interfaz alumno mobile-first: catálogo con filtro por categorías,
  solicitud de préstamos, historial personal.
- Interfaz admin desktop-first: panel con KPIs, bandeja de solicitudes
  (aprobar/rechazar/devolver), CRUD de inventario y categorías,
  reportes filtrables con export CSV nativo.
- Modales con `<dialog>` nativo, cero librerías de UI adicionales.
- Deploy: Dockerfile multi-stage node:22-alpine + docker-compose para
  publicar bajo prestamos.buglabs.dev vía Cloudflare Tunnel.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-08-14 19:37:49 -07:00

28 lines
950 B
TypeScript

import type { APIRoute } from 'astro';
export const prerender = false;
export const GET: APIRoute = async ({ locals, url }) => {
if (locals.profile?.rol !== 'admin') {
return new Response('Forbidden', { status: 403 });
}
const raw = (url.searchParams.get('q') ?? '').trim();
// ponytail: strip PostgREST wildcards + comma so ilike/or() stay literal; FTS when catálogo crece >2k
const q = raw.replace(/[%_,\\]/g, ' ').slice(0, 64);
if (!q) {
return Response.json([]);
}
const { data, error } = await locals.supabase
.from('materiales')
.select('id, nombre, numero_inventario')
.ilike('nombre', `%${q}%`)
.order('nombre', { ascending: true })
.limit(10);
if (error) return new Response(error.message, { status: 500 });
const items = (data ?? []).map((m) => ({
id: m.id,
label: m.numero_inventario ? `${m.nombre}${m.numero_inventario}` : m.nombre,
}));
return Response.json(items);
};