尚未偵測到更新。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).