尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证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).