Omnigraph
그래프 엔진으로 컨텍스트를 조립하고, 객체 저장소 기반에서 에이전트가 코드처럼 그래프 데이터를 분기·타입·검토·병합·감사·거버넌스합니다
저장소 정보는 아직 수집하지 않았습니다.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
Creación de una aplicación web para visualizar y ejecutar un primer pipeline ETL: extraer datos de Open-Meteo, transformarlos, limpiarlos, filtrarlos y cargarlos en Supabase.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Práctica DAW 2, dashboard para Big Data: una aplicación web para ejecutar y entender un pipeline ETL. Extrae el tiempo horario de cinco ciudades españolas desde la API histórica de Open-Meteo, lo transforma, lo limpia, permite filtrarlo y seleccionarlo, y lo carga en Supabase. Cada fase muestra su estado, sus registros de entrada y salida y su duración real, y su resultado se puede inspeccionar.
Stack: Next.js 16 (App Router) · TypeScript · Tailwind CSS 4 · shadcn/ui · Leaflet · Supabase.
npm install.env.example a .env.local y rellena:
SUPABASE_URL: URL del proyecto (Project Settings → Data API).SUPABASE_SECRET_KEY: clave secreta (sb_secret_…) o service_role. Solo servidor: nunca con prefijo NEXT_PUBLIC_ ni en GitHub (.env* está en .gitignore).supabase/migrations/20261027000000_create_mediciones_meteorologicas.sql.| Comando | Para qué |
|---|---|
npm run dev | Servidor de desarrollo en http://localhost:3000 |
npm run verify | Pruebas del pipeline (necesita npm run dev en marcha) |
npm run typecheck · npm run lint · npm run build | Tipos, lint y build de producción |
| Fase | Qué hace | Código |
|---|---|---|
| Extracción | Una petición a archive-api.open-meteo.com/v1/archive por ciudad, con temperature_2m, relative_humidity_2m y precipitation, en UTC, °C y mm. Máximo 31 días. Si una ciudad falla, se reintenta solo esa. | app/api/extract/route.ts |
| Transformación | Convierte los arrays paralelos de hourly en una fila por ciudad y hora, sin tocar los valores. Comprueba que los arrays tienen la misma longitud. | lib/weather.ts → toRows |
| Limpieza | Interpreta las fechas como UTC y rechaza, con su motivo: null, vacíos, valores no numéricos o no finitos, humedad fuera de 0–100, precipitación negativa y duplicados por ciudad + fecha_hora (se conserva la primera fila). Un null nunca se convierte en 0 y no hay umbrales de temperatura. | lib/weather.ts → cleanRows |
| Filtrado y selección | Orden fijo: válidos → filtros (ciudad, fecha y hora, rangos, «solo con lluvia») → ordenación → selección. La paginación solo afecta a lo que se ve. Solo se suben las filas seleccionadas que siguen cumpliendo los filtros. | lib/pipeline.ts |
| Carga | Congela una copia del conjunto y su orden. Envía lotes de 500 como máximo, de uno en uno, con upsert por (ciudad, fecha_hora). Después verifica en Supabase que cada clave existe y permite reintentar solo los lotes fallidos. | app/api/supabase/route.ts · runUpload |
La migración crea mediciones_meteorologicas con:
id como identidad.UNIQUE (ciudad, fecha_hora).CHECK de humedad (0–100) y precipitación (≥ 0).importado_en con valor por defecto now().ORDER BY.Decisión de diseño: tras extraer, todas las filas válidas quedan seleccionadas, para que el flujo básico sea de 3 clics. Cambiar filtros nunca selecciona filas por sí solo, y al reintentar una ciudad se respeta la selección del resto.
lib/supabase-server.ts usa server-only). La clave secreta nunca llega al navegador./api/extract: llama a Open-Meteo y valida ciudad y periodo./api/supabase: upsert validado y verificación de claves; consulta paginada con filtros y ordenación..env.example sin valores reales.npm run verify usa fixtures controlados en tests/fixtures/ (null, vacíos, fuera de rango, fechas inválidas, duplicados, arrays desiguales), que no se mezclan con las extracciones reales, más una extracción real.
| # | Prueba | Resultado |
|---|---|---|
| 1 | 1 ciudad × 1 día en Open-Meteo real | ✔ 24 registros horarios, de 00:00Z a 23:00Z |
| 2 | Arrays paralelos → filas | ✔ Si los arrays tienen distinta longitud, da error y 0 filas |
| 3 | null sin convertir en 0 | ✔ 9 filas → 2 válidas y 7 rechazadas con su motivo; la temperatura extrema se conserva |
| 4 | Duplicados | ✔ Detectados; se conserva la primera fila |
| 5 | Filtros y orden antes de paginar | ✔ |
| 6 | Selección entre páginas | ✔ |
| 7 | Vista previa = datos enviados | ✔ Mismo orden, lotes ≤ 500, copia congelada |
| 8 | Segunda carga sin duplicados | ⏳ Pendiente (necesita Supabase) |
| 9 | Fallo parcial de carga | ✔ Con servidor simulado · ⏳ contra Supabase real |
| 10 | Build y tipos | ✔ build, typecheck y lint sin errores |
| — | Validación en servidor | ✔ Rechaza humedad del 150 %, más de 500 registros y cuerpos de más de 256 KB |
También se ha revisado la interfaz en el navegador, en escritorio y en móvil, en modo claro y en modo noche.
.env.local y ejecutar VERIFY_SUPABASE=1 npm run verify. Esta prueba escribe 3 filas de prueba con la ciudad «Prueba verificación» y el año 2000.public/data/ccaa.json, simplificadas a partir de click_that_hood).