db-vendo-client/parse/location.js

97 lines
2 KiB
JavaScript

import {parse} from 'qs';
const POI = 'POI';
const STATION = 'ST';
const ADDRESS = 'ADR';
const leadingZeros = /^0+/;
const parseLocation = (ctx, l) => {
const {profile, common} = ctx;
if (!l) {
return null;
}
const lid = parse(l.id || l.locationId, {delimiter: '@'});
let res = {
type: 'location',
id: (l.extId || l.evaNr || lid.L || l.evaNumber || l.evaNo || l.bahnhofsId || '').replace(leadingZeros, '') || null,
};
const name = l.name || lid.O;
if (l.lat && l.lon || l.coordinates || l.position) {
res.latitude = l.lat || l.coordinates?.latitude || l.position?.latitude;
res.longitude = l.lon || l.coordinates?.longitude || l.position?.longitude;
} else if ('X' in lid && 'Y' in lid) {
res.latitude = lid.Y / 1000000;
res.longitude = lid.X / 1000000;
}
// addresses and pois might also have fake evaNr sometimes!
if (l.type === STATION || l.extId || l.evaNumber || l.evaNo || lid.A == '1' || l.bahnhofsId) {
let stop = {
type: 'station',
id: res.id,
};
if (name) {
stop.name = name;
}
if ('number' === typeof res.latitude) {
stop.location = res; // todo: remove `.id`
}
// TODO subStops
if ('products' in l) {
stop.products = profile.parseProducts(ctx, l.products);
}
stop = profile.enrichStation(ctx, stop);
// TODO isMeta
// TODO entrances, lines
return stop;
}
if (name && common?.locations?.[name] && res.id === null) {
delete res.type;
delete res.id;
return {
...common.locations[name],
...res,
};
}
res.name = name;
res = enrichStation(ctx, res);
if (l.type === ADDRESS || lid.A == '2') {
res.address = name;
}
if (l.type === POI || lid.A == '4') {
res.poi = true;
}
return res;
};
const enrichStation = (ctx, stop, locations) => {
const {common} = ctx;
const locs = locations || common?.locations;
const rich = locs && (locs[stop.id] || locs[stop.name]);
if (rich) {
delete stop.type;
delete stop.id;
stop = {
...rich,
...stop,
};
}
return stop;
};
export {
parseLocation,
enrichStation,
};