Omnigraph
Graph engine for context assembly. Object-storage native. Agents work with graph data the way engineers work with code: branched, typed, reviewed, merged, audited, and governed.
Descarga el tiempo horario de cinco ciudades españolas desde Open-Meteo, revísalo y guárdalo en Supabase en tres pasos.
Translation pending
DataTypeScript · CSSGitHub @samuelmartinez93OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
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.
Translation pending
Taken from the repository README
Loading the full README.
Read the full 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).