From a85d9a49ce074e377793aa5cf45e742abe2d42c5 Mon Sep 17 00:00:00 2001 From: Ido Bouskila <94786579+IdoBouskila@users.noreply.github.com> Date: Sat, 30 Nov 2024 22:24:10 +0200 Subject: [PATCH] feat(fetchers-types): add types for external responses (#21) * refactor(server): simplify search response * feat(fetchers-types): add types for external fetchs * refactor(fetchers): rename type for search response --- server/utils/fetchers/fetchers.ts | 27 ++---- .../utils/fetchers/types/current-forecast.ts | 41 +++++++++ server/utils/fetchers/types/day-forecast.ts | 92 +++++++++++++++++++ server/utils/fetchers/types/location.ts | 12 +++ .../utils/fetchers/types/search-locations.ts | 10 ++ server/utils/fetchers/types/shared.ts | 5 + 6 files changed, 169 insertions(+), 18 deletions(-) create mode 100644 server/utils/fetchers/types/current-forecast.ts create mode 100644 server/utils/fetchers/types/day-forecast.ts create mode 100644 server/utils/fetchers/types/location.ts create mode 100644 server/utils/fetchers/types/search-locations.ts create mode 100644 server/utils/fetchers/types/shared.ts diff --git a/server/utils/fetchers/fetchers.ts b/server/utils/fetchers/fetchers.ts index 2d73c60..6ad5b30 100644 --- a/server/utils/fetchers/fetchers.ts +++ b/server/utils/fetchers/fetchers.ts @@ -1,25 +1,16 @@ import fetchExternalData from './fetch-external-data'; - -type ExternalSearchResponse = Array<{ - id: number; - lat: number; - lon: number; - name: string; - region: string; - country: string; -}>; +import LocationSearchResponse from './types/search-locations'; export const fetchSearch = async (query: string) => { - const searchParams = new URLSearchParams(); - searchParams.set('q', query); + const searchParams = new URLSearchParams({ q: query }); - const data = await fetchExternalData({ - endpoint: '/search.json', - searchParams: searchParams, - }); + const data = await fetchExternalData({ + endpoint: '/search.json', + searchParams: searchParams, + }); - return data.map(({ name, region, country, ...rest }) => ({ - ...rest, - name: `${ name }, ${ region }, ${ country }`, + return data.map((location) => ({ + id: location.id, + name: `${ location.name }, ${ location.region }, ${ location.country }`, })); } diff --git a/server/utils/fetchers/types/current-forecast.ts b/server/utils/fetchers/types/current-forecast.ts new file mode 100644 index 0000000..288bd6d --- /dev/null +++ b/server/utils/fetchers/types/current-forecast.ts @@ -0,0 +1,41 @@ +import Location from './location'; +import { Condition } from './shared'; + +type Current = { + last_updated_epoch: number; + last_updated: string; + temp_c: number; + temp_f: number; + is_day: number; + condition: Condition; + wind_mph: number; + wind_kph: number; + wind_degree: number; + wind_dir: string; + pressure_mb: number; + pressure_in: number; + precip_mm: number; + precip_in: number; + humidity: number; + cloud: number; + feelslike_c: number; + feelslike_f: number; + windchill_c: number; + windchill_f: number; + heatindex_c: number; + heatindex_f: number; + dewpoint_c: number; + dewpoint_f: number; + vis_km: number; + vis_miles: number; + uv: number; + gust_mph: number; + gust_kph: number; +}; + +type CurrentWeatherResponse = { + current: Current; + location: Location; +}; + +export default CurrentWeatherResponse; diff --git a/server/utils/fetchers/types/day-forecast.ts b/server/utils/fetchers/types/day-forecast.ts new file mode 100644 index 0000000..6c37533 --- /dev/null +++ b/server/utils/fetchers/types/day-forecast.ts @@ -0,0 +1,92 @@ +import Location from './location'; +import { Condition } from './shared'; +import CurrentWeatherResponse from './current-forecast'; + +type DayForecast = { + day: Day; + hour: Hour[]; + date: string; + astro: Astro; + date_epoch: number; +}; + +type DayForecastResponse = { + forecast: DayForecast; + location: Location; + current: CurrentWeatherResponse['current']; +}; + +export default DayForecastResponse; + +type Day = Record< + | 'maxtemp_c' + | 'maxtemp_f' + | 'mintemp_c' + | 'mintemp_f' + | 'avgtemp_c' + | 'avgtemp_f' + | 'maxwind_mph' + | 'maxwind_kph' + | 'totalprecip_mm' + | 'totalprecip_in' + | 'totalsnow_cm' + | 'avgvis_km' + | 'avgvis_miles' + | 'avghumidity' + | 'daily_will_it_rain' + | 'daily_chance_of_rain' + | 'daily_will_it_snow' + | 'daily_chance_of_snow' + | 'uv', + number +> & { + condition: Condition; +}; + +type Hour = { + time_epoch: number; + time: string; + temp_c: number; + temp_f: number; + is_day: number; + condition: Condition; + wind_mph: number; + wind_kph: number; + wind_degree: number; + wind_dir: string; + pressure_mb: number; + pressure_in: number; + precip_mm: number; + precip_in: number; + snow_cm: number; + humidity: number; + cloud: number; + feelslike_c: number; + feelslike_f: number; + windchill_c: number; + windchill_f: number; + heatindex_c: number; + heatindex_f: number; + dewpoint_c: number; + dewpoint_f: number; + will_it_rain: number; + chance_of_rain: number; + will_it_snow: number; + chance_of_snow: number; + vis_km: number; + vis_miles: number; + gust_mph: number; + gust_kph: number; + uv: number; +}; + +type Astro = { + sunrise: string; + sunset: string; + moonrise: string; + moonset: string; + moon_phase: string; + moon_illumination: number; + is_moon_up: number; + is_sun_up: number; +}; diff --git a/server/utils/fetchers/types/location.ts b/server/utils/fetchers/types/location.ts new file mode 100644 index 0000000..98795d9 --- /dev/null +++ b/server/utils/fetchers/types/location.ts @@ -0,0 +1,12 @@ +type Location = { + name: string; + region: string; + country: string; + lat: number; + lon: number; + tz_id: string; + localtime_epoch: number; + localtime: string; +}; + +export default Location; diff --git a/server/utils/fetchers/types/search-locations.ts b/server/utils/fetchers/types/search-locations.ts new file mode 100644 index 0000000..b02b893 --- /dev/null +++ b/server/utils/fetchers/types/search-locations.ts @@ -0,0 +1,10 @@ +type ExternalSearchResponse = { + id: number; + lat: number; + lon: number; + name: string; + region: string; + country: string; +}[]; + +export default ExternalSearchResponse; \ No newline at end of file diff --git a/server/utils/fetchers/types/shared.ts b/server/utils/fetchers/types/shared.ts new file mode 100644 index 0000000..1207092 --- /dev/null +++ b/server/utils/fetchers/types/shared.ts @@ -0,0 +1,5 @@ +export type Condition = { + text: string; + icon: string; + code: number; +};