db-rest/lib/departures.js
2017-10-24 23:45:35 +02:00

59 lines
1.5 KiB
JavaScript

'use strict'
const parse = require('parse-messy-time')
const hafas = require('db-hafas')
const createDepsInDirection = require('hafas-departures-in-direction')
const depsInDirection = createDepsInDirection(hafas.departures, hafas.journeyPart)
const err400 = (msg) => {
const err = new Error(msg)
err.statusCode = 400
return err
}
const isNumber = /^\d+$/
const departures = (req, res, next) => {
const id = req.params.id.trim()
if (!isNumber.test(id)) return next(err400('Invalid station id.'))
const opt = {}
if ('when' in req.query) {
opt.when = isNumber.test(req.query.when)
? new Date(req.query.when * 1000)
: parse(req.query.when)
}
let task
if ('nextStation' in req.query) {
const nS = req.query.nextStation
if (!isNumber.test(nS)) return next(err400('Invalid nextStation parameter.'))
if ('results' in req.query) {
const r = +req.query.results
if (Number.isNaN(r)) return next(err400('Invalid results parameter.'))
opt.results = Math.max(0, Math.min(r, 20))
}
if ('maxQueries' in req.query) {
const mQ = +req.query.maxQueries
if (Number.isNaN(mQ)) return next(err400('Invalid maxQueries parameter.'))
opt.maxQueries = Math.max(0, Math.min(mQ, 30))
}
task = depsInDirection(id, nS, opt)
} else {
if ('direction' in req.query) opt.direction = req.query.direction
if ('duration' in req.query) opt.duration = +req.query.duration
task = hafas.departures(id, opt)
}
task
.then((deps) => {
res.json(deps)
next()
})
.catch(next)
}
module.exports = departures