# Wewnętrzne Endpointy API Wszystkie zewnętrzne źródła danych są wywoływane przez route handlery Next.js w `app/api`. Dzięki temu aplikacja ma jedno miejsce na walidację parametrów, cache, normalizację błędów i obsługę ograniczeń przeglądarki. ## Dane Pogodowe i Lokalizacje | Metoda | Endpoint | Przeznaczenie | | --- | --- | --- | | `GET` | `/api/forecast?latitude={lat}&longitude={lon}` | Zwraca 7-dniową prognozę modelową dla współrzędnych. Łączy IMGW ALARO z Open-Meteo. Niepoprawne współrzędne zwracają `400`, awaria źródła `502`. | | `GET` | `/api/imgw-current?latitude={lat}&longitude={lon}` | Pobiera surową lokalną analizę IMGW Hybrid dla współrzędnych. Niepoprawne współrzędne zwracają `400`, awaria źródła `502`. | | `GET` | `/api/imgw/{path}` | Proxy allowlistowanych endpointów IMGW `danepubliczne.imgw.pl`. Obsługuje kolekcje `synop`, `hydro`, `meteo`, `warningsmeteo`, `warningshydro`, `product` oraz szczegół `synop/id/{id}`. Nieobsługiwana ścieżka zwraca `404`. | | `GET` | `/api/locations/search?query={query}&language={pl\|en}` | Wyszukuje miejscowości w Polsce przez Open-Meteo Geocoding. Zapytania krótsze niż 2 znaki albo dłuższe niż 80 znaków zwracają pustą listę. | | `GET` | `/api/locations/reverse?latitude={lat}&longitude={lon}&language={pl\|en}` | Ustala nazwę miejsca dla pozycji GPS przez Nominatim / OpenStreetMap. Współrzędne są zaokrąglane do trzech miejsc po przecinku. | ## Powiadomienia Endpointy powiadomień działają w runtime Node.js, bo korzystają z `web-push` i pamięciowego magazynu subskrypcji. | Metoda | Endpoint | Przeznaczenie | | --- | --- | --- | | `GET` | `/api/notifications/vapid-key` | Zwraca publiczny klucz VAPID oraz informację, czy Web Push jest skonfigurowany. | | `POST` | `/api/notifications/subscriptions` | Zapisuje lub aktualizuje subskrypcję Web Push dla urządzenia. Przyjmuje preferencje ostrzeżeń, briefu porannego, briefu wieczornego, lokalizację, język, województwo i opcjonalny powiat TERYT. | | `DELETE` | `/api/notifications/subscriptions` | Usuwa subskrypcję Web Push po jej endpointcie. | | `POST` | `/api/notifications/test` | Wysyła powiadomienie testowe na wskazany endpoint subskrypcji. | | `GET` | `/api/notifications/check` | Endpoint harmonogramu sprawdzający nowe ostrzeżenia meteorologiczne IMGW i wysyłający Web Push do pasujących subskrypcji. | | `GET` | `/api/notifications/daily-brief` | Endpoint harmonogramu wysyłający raz dziennie poranny brief dla subskrypcji z włączoną opcją i zapisaną lokalizacją. | | `GET` | `/api/notifications/tomorrow-brief` | Endpoint harmonogramu wysyłający wieczorny brief z prognozą na kolejny dzień. | ## Autoryzacja Harmonogramu Endpointy harmonogramu: - `/api/notifications/check` - `/api/notifications/daily-brief` - `/api/notifications/tomorrow-brief` w produkcji wymagają sekretu `NOTIFICATIONS_CRON_SECRET` przekazanego jednym z nagłówków: ```http Authorization: Bearer x-cron-secret: ``` Jeśli `NOTIFICATIONS_CRON_SECRET` nie jest ustawiony, endpointy harmonogramu są dostępne tylko poza `NODE_ENV=production`. ## Cache i Odpowiedzi | Endpoint | Cache | | --- | --- | | `/api/forecast` | `s-maxage=900`, `stale-while-revalidate=1800` | | `/api/imgw-current` | `s-maxage=120`, `stale-while-revalidate=300` | | `/api/imgw/{path}` | `s-maxage=300`, `stale-while-revalidate=600` | | `/api/locations/search` | `s-maxage=86400`, `stale-while-revalidate=604800` | | `/api/locations/reverse` | `s-maxage=86400`, `stale-while-revalidate=604800` | Route handlery zwracają kontrolowane odpowiedzi JSON. Błędy zewnętrznych usług są mapowane na czytelne statusy HTTP, zwykle `400`, `404`, `502` albo `503`. ## Szczególny Przypadek IMGW Publiczne endpointy ostrzeżeń IMGW potrafią zwrócić HTTP `404` z treścią: ```json {"status":false,"message":"No products were found"} ``` Dla `warningsmeteo` i `warningshydro` aplikacja traktuje ten wariant jako poprawną pustą listę ostrzeżeń, a nie awarię źródła danych.