diff --git a/bun.lock b/bun.lock index f4906c9..fb66c54 100644 --- a/bun.lock +++ b/bun.lock @@ -11,6 +11,7 @@ "@sveltejs/adapter-auto": "^7.0.1", "@sveltejs/kit": "^2.57.0", "@sveltejs/vite-plugin-svelte": "^7.0.0", + "@types/node": "^25.6.2", "svelte": "^5.55.2", "svelte-check": "^4.4.6", "typescript": "^6.0.2", @@ -89,6 +90,8 @@ "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], + "@types/node": ["@types/node@25.6.2", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-sokuT28dxf9JT5Kady1fsXOvI4HVpjZa95NKT5y9PNTIrs2AsobR4GFAA90ZG8M+nxVRLysCXsVj6eGC7Vbrlw=="], + "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="], "acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="], @@ -211,6 +214,8 @@ "typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="], + "undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], "vite": ["vite@8.0.11", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", "postcss": "^8.5.14", "rolldown": "1.0.0-rc.18", "tinyglobby": "^0.2.16" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.1.18", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-Jz1mxtUBR5xTT65VOdJZUUeoyLtqljmFkiUXhPTLZka3RDc9vpi/xXkyrnsdRcm2lIi3l3GPMnAidTsEGIj3Ow=="], diff --git a/package.json b/package.json index 9b607d8..80e5453 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "@sveltejs/adapter-auto": "^7.0.1", "@sveltejs/kit": "^2.57.0", "@sveltejs/vite-plugin-svelte": "^7.0.0", + "@types/node": "^25.6.2", "svelte": "^5.55.2", "svelte-check": "^4.4.6", "typescript": "^6.0.2", diff --git a/src/lib/api.js b/src/lib/api.js deleted file mode 100644 index d4e3ede..0000000 --- a/src/lib/api.js +++ /dev/null @@ -1,27 +0,0 @@ -export async function fetchStations(fetch = globalThis.fetch) { - const res = await fetch('http://37100lab.it:8101/api/campagne_map_data'); - if (!res.ok) throw new Error(`Errore HTTP ${res.status}`); - const geojson = await res.json(); - return geojson.features - .map(f => ({ ...f.properties, pk: parseInt(f.properties.pk, 10) })) - .sort((a, b) => b.pk - a.pk); -} - -export async function fetchDay(id, day, signal) { - // Converte YYYY-M-D (da formatDayParam) in YYYY-MM-DD per la chiamata API - const [y, m, d] = day.split('-'); - const date = `${y}-${m.padStart(2, '0')}-${d.padStart(2, '0')}`; - - // L'API risponde con 5xx transienti: tre tentativi limitano i buchi nel dataset scaricato. - for (let attempt = 0; attempt < 3; attempt++) { - try { - const res = await fetch(`/api/get_station_data?id=${id}&date=${date}`, { signal }); - if (!res.ok) throw new Error(`HTTP ${res.status}`); - return await res.json(); - } catch (e) { - // La cancellazione non è un errore: uscire subito senza consumare altri retry. - if (e.name === 'AbortError') return []; - if (attempt === 2) return []; - } - } -} diff --git a/src/lib/api.ts b/src/lib/api.ts new file mode 100644 index 0000000..9785122 --- /dev/null +++ b/src/lib/api.ts @@ -0,0 +1,32 @@ +import type { Station, Measurement } from './types.js'; + +export async function fetchStations(fetch = globalThis.fetch): Promise { + const res = await fetch('http://37100lab.it:8101/api/campagne_map_data'); + if (!res.ok) throw new Error(`Errore HTTP ${res.status}`); + const geojson = await res.json(); + return (geojson.features as Array<{ properties: Record }>) + .map(f => ({ + pk: parseInt(f.properties.pk as string, 10), + title: f.properties.title as string, + created_at: f.properties.created_at as string, + ended_at: f.properties.ended_at as string | null, + })) + .sort((a, b) => b.pk - a.pk); +} + +export async function fetchDay(id: number, day: string, signal: AbortSignal): Promise { + const [y, m, d] = day.split('-'); + const date = `${y}-${m.padStart(2, '0')}-${d.padStart(2, '0')}`; + + for (let attempt = 0; attempt < 3; attempt++) { + try { + const res = await fetch(`/api/get_station_data?id=${id}&date=${date}`, { signal }); + if (!res.ok) throw new Error(`HTTP ${res.status}`); + return await res.json() as Measurement[]; + } catch (e) { + if (e instanceof Error && e.name === 'AbortError') return []; + if (attempt === 2) return []; + } + } + return []; +} diff --git a/src/lib/components/StationList.svelte b/src/lib/components/StationList.svelte index d100b79..d5f3e4b 100644 --- a/src/lib/components/StationList.svelte +++ b/src/lib/components/StationList.svelte @@ -1,18 +1,19 @@ - diff --git a/src/routes/+page.server.js b/src/routes/+page.server.ts similarity index 67% rename from src/routes/+page.server.js rename to src/routes/+page.server.ts index 7fefc03..679fa3d 100644 --- a/src/routes/+page.server.js +++ b/src/routes/+page.server.ts @@ -1,9 +1,10 @@ +import type { PageServerLoad } from './$types.js'; import { fetchStations } from '$lib/api.js'; -export async function load({ fetch }) { +export const load: PageServerLoad = async ({ fetch }) => { try { return { stations: await fetchStations(fetch) }; } catch { return { stations: [], loadError: 'Impossibile caricare le centraline. Controlla la connessione e riprova.' }; } -} +}; diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 0b6d464..63ba7c8 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,4 +1,4 @@ -