50 lines
1.5 KiB
TypeScript
50 lines
1.5 KiB
TypeScript
import { Router } from 'express'
|
|
import axios from 'axios'
|
|
|
|
const router = Router()
|
|
|
|
router.get('/current', async (_req, res) => {
|
|
try {
|
|
const location = process.env.WEATHER_LOCATION
|
|
if (!location) {
|
|
res.status(503).json({ error: 'WEATHER_LOCATION not configured' })
|
|
return
|
|
}
|
|
|
|
const response = await axios.get(
|
|
`https://wttr.in/${encodeURIComponent(location)}?format=j1`,
|
|
{ headers: { Accept: 'application/json' }, timeout: 8000 }
|
|
)
|
|
|
|
const data = response.data
|
|
const c = data.current_condition[0]
|
|
const area = data.nearest_area?.[0]
|
|
const today = data.weather?.[0]
|
|
|
|
const hourly = (today?.hourly ?? []).map((h: Record<string, unknown>) => ({
|
|
hour: Math.floor(Number(h.time) / 100),
|
|
tempC: Number(h.tempC),
|
|
code: Number(h.weatherCode),
|
|
desc: (h.weatherDesc as { value: string }[])[0]?.value ?? '',
|
|
}))
|
|
|
|
res.json({
|
|
tempC: Number(c.temp_C),
|
|
feelsLikeC: Number(c.FeelsLikeC),
|
|
humidity: Number(c.humidity),
|
|
windKmph: Number(c.windspeedKmph),
|
|
desc: c.weatherDesc[0].value as string,
|
|
code: Number(c.weatherCode),
|
|
city: area?.areaName?.[0]?.value ?? location,
|
|
todayMin: Number(today?.mintempC ?? c.temp_C),
|
|
todayMax: Number(today?.maxtempC ?? c.temp_C),
|
|
hourly,
|
|
})
|
|
} catch (err: unknown) {
|
|
const msg = err instanceof Error ? err.message : 'Unknown error'
|
|
res.status(500).json({ error: msg })
|
|
}
|
|
})
|
|
|
|
export default router
|