Fix nearby stop grouping and location fallback

This commit is contained in:
Matiss
2026-06-01 17:56:44 +01:00
parent 651c89c58a
commit 54721bb744
3 changed files with 193 additions and 45 deletions

View File

@@ -42,9 +42,9 @@ async function fetchStops(env) {
}
async function fetchDepartures(url, env, ctx) {
const stopId = url.searchParams.get('stopId') ?? ''
const stopCode = url.searchParams.get('stopCode') ?? ''
if (!stopId && !stopCode) {
const stopIds = uniqueQueryValues(url.searchParams, 'stopId')
const stopCodes = uniqueQueryValues(url.searchParams, 'stopCode')
if (!stopIds.length && !stopCodes.length) {
return json({ departures: [], error: 'stopId or stopCode is required' }, 400)
}
if (!env.NTA_API_KEY) {
@@ -53,7 +53,7 @@ async function fetchDepartures(url, env, ctx) {
const feed = await getTripUpdateFeed(env, ctx)
return json({
departures: parseTripUpdates(feed, stopId, stopCode),
departures: parseTripUpdates(feed, stopIds, stopCodes),
updatedAt: Date.now(),
})
}
@@ -86,9 +86,10 @@ async function getTripUpdateFeed(env, ctx) {
return payload
}
function parseTripUpdates(payload, stopId, stopCode) {
function parseTripUpdates(payload, stopIds, stopCodes) {
const entities = Array.isArray(payload?.entity) ? payload.entity : []
const departures = []
const stopIdSet = new Set([...stopIds, ...stopCodes])
for (const entity of entities) {
const tripUpdate = entity.tripUpdate || entity.trip_update || {}
@@ -99,7 +100,7 @@ function parseTripUpdates(payload, stopId, stopCode) {
for (const update of updates) {
const updateStopId = update.stopId || update.stop_id
if (updateStopId !== stopId && updateStopId !== stopCode) {
if (!stopIdSet.has(updateStopId)) {
continue
}
@@ -131,6 +132,10 @@ function parseTripUpdates(payload, stopId, stopCode) {
return departures.sort((a, b) => a.dueMinutes - b.dueMinutes).slice(0, 40)
}
function uniqueQueryValues(params, key) {
return [...new Set(params.getAll(key).flatMap((value) => value.split(',')).map((value) => value.trim()).filter(Boolean))]
}
function json(body, status = 200, headers = {}) {
return new Response(JSON.stringify(body), {
status,