atriusmaps-node-sdk
Version:
This project provides an API to Atrius Personal Wayfinder maps within a Node environment. See the README.md for more information
109 lines (95 loc) • 4.23 kB
JavaScript
;
var R = require('ramda');
function _interopNamespaceDefault(e) {
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () { return e[k]; }
});
}
});
}
n.default = e;
return Object.freeze(n);
}
var R__namespace = /*#__PURE__*/_interopNamespaceDefault(R);
/**
*
* @param {Record<Number, DynamicQueueTime} queueTimes A map of POI Ids to dynamic queue times
* @param {Record<Number, String>} labels A map of POI Ids to map labels
* @param {*} feature A GeoJson feature
* @returns feature
*/
const mutateSecurityCheckpointLabel = (T, queueTimes, labels) => feature => {
const id = feature.properties.id;
const dynamicData = queueTimes[id];
const label = labels[id];
if (dynamicData) { // should we only show this message when "timeIsReal" is true?
const { queueTime, isTemporarilyClosed } = dynamicData;
const secondaryText = isTemporarilyClosed ? T('ui:Closed') : T('ui:_xx_ minute wait', { count: queueTime });
feature.properties.text = `${label}\n${secondaryText}`;
}
return feature
};
const processParkingPOIS = (poiMap) => {
const idValuesMap =
R__namespace.pipe(
R__namespace.filter(poi => poi.category === 'parking'),
R__namespace.map(poi => {
const da = poi.dynamicAttributes;
if (!da)
throw Error(`No dynamicAttributes defined for parking POI ${poi.poiId}`)
const age = (Date.now() - poi.timestamp) / 1000; // how long ago this was updated by backend (in seconds)
const props = (age < da['parking.timeToLive']) // if this update is recent enough, consider it "valid"
? R__namespace.pick(['lotStatus', 'rateDay', 'rateHour', 'timeIsReal', 'timeToTerminal1', 'timeToTerminal2'], poi)
: { lotStatus: da['parking.default'], rateDay: '$ -', rateHour: '$ -', timeIsReal: false };
return { ...props, lastUpdated: poi.timestamp, lotName: poi.lotName }
}))(poiMap);
return idValuesMap
};
const processOpenClosedPois = (poiMap) => {
const pathToOpenClosedData = ['dynamicData', 'openClosed'];
const openClosedPois = R__namespace.filter(R__namespace.hasPath(pathToOpenClosedData), poiMap);
const openClosedStatuses = R__namespace.map(R__namespace.path(pathToOpenClosedData), openClosedPois);
if (R__namespace.all(R__namespace.both(R__namespace.has('isOpen'), R__namespace.has('expiration')), R__namespace.values(openClosedStatuses))) {
const isExpired = R__namespace.pipe(R__namespace.prop('expiration'), R__namespace.lt(Date.now()));
const idValuesMap = R__namespace.filter(isExpired, openClosedStatuses);
return idValuesMap
} else {
throw Error('Open Closed poi status is malformed.')
}
};
/*
API response: https://gitlab.com/locuslabs/core-data-team/json-schemas/-/blob/develop/src/api-marketplace/dynamic-queue-data.json
*/
const processSecurityWaitTimes = (poiMap) => {
const queuePath = ['dynamicData', 'queue'];
const queuePois = R__namespace.filter(R__namespace.hasPath(queuePath), poiMap);
const queues = R__namespace.map(R__namespace.path(queuePath), queuePois);
return R__namespace.map(queue => ({
isTemporarilyClosed: queue.isTemporarilyClosed,
queueTime: queue.queueTime,
timeIsReal: !queue.isQueueTimeDefault && queue.expiration > Date.now(),
lastUpdated: Date.now()
}), queues)
};
const processRoutingPois = (poiMap) => {
const now = Date.now();
return R__namespace.filter(
poi => {
const navGraphHidden = R__namespace.path(['dynamicData', 'dynamic-routing', 'navGraphHidden'], poi);
const expiration = R__namespace.path(['dynamicData', 'dynamic-routing', 'expiration'], poi);
return navGraphHidden === true && expiration > now
},
poiMap
)
};
exports.mutateSecurityCheckpointLabel = mutateSecurityCheckpointLabel;
exports.processOpenClosedPois = processOpenClosedPois;
exports.processParkingPOIS = processParkingPOIS;
exports.processRoutingPois = processRoutingPois;
exports.processSecurityWaitTimes = processSecurityWaitTimes;