db-rest/api.js

108 lines
2.9 KiB
JavaScript
Raw Permalink Normal View History

2022-12-19 13:23:13 +01:00
// todo: use import assertions once they're supported by Node.js & ESLint
// https://github.com/tc39/proposal-import-assertions
import {createRequire} from 'node:module'
const require = createRequire(import.meta.url)
import {dirname, join as pathJoin} from 'node:path'
import {fileURLToPath} from 'node:url'
import {createDbHafas as createHafas} from 'db-hafas'
import {createHafasRestApi} from 'hafas-rest-api'
2022-12-19 13:23:13 +01:00
import createHealthCheck from 'hafas-client-health-check'
import Redis from 'ioredis'
import {createCachedHafasClient} from 'cached-hafas-client'
import {createRedisStore} from 'cached-hafas-client/stores/redis.js'
2022-12-19 13:23:13 +01:00
import serveStatic from 'serve-static'
import {parseBoolean, parseInteger} from 'hafas-rest-api/lib/parse.js'
2022-12-19 13:23:13 +01:00
import {loyaltyCardParser} from './lib/loyalty-cards.js'
import {route as stations} from './routes/stations.js'
import {route as station} from './routes/station.js'
2020-05-01 20:12:24 +02:00
const pkg = require('./package.json')
2022-12-19 13:23:13 +01:00
const __dirname = dirname(fileURLToPath(import.meta.url))
2020-10-02 18:33:38 +02:00
const docsRoot = pathJoin(__dirname, 'docs')
2020-05-01 20:12:24 +02:00
const berlinHbf = '8011160'
// todo: use process.env.HAFAS_USER_AGENT if defined
let hafas = createHafas(pkg.name)
let healthCheck = createHealthCheck(hafas, berlinHbf)
if (process.env.REDIS_URL) {
const redis = new Redis(process.env.REDIS_URL || null)
hafas = createCachedHafasClient(hafas, createRedisStore(redis), {
cachePeriods: {
locations: 6 * 60 * 60 * 1000, // 6h
},
})
const checkHafas = healthCheck
const checkRedis = () => new Promise((resolve, reject) => {
setTimeout(reject, 1000, new Error('didn\'t receive a PONG'))
redis.ping().then(
res => resolve(res === 'PONG'),
reject,
)
})
healthCheck = async () => (
(await checkHafas()) === true &&
(await checkRedis()) === true
)
}
2020-05-01 20:12:24 +02:00
const mapRouteParsers = (route, parsers) => {
if (route !== 'journeys') return parsers
return {
...parsers,
loyaltyCard: loyaltyCardParser,
firstClass: {
description: 'Search for first-class options?',
type: 'boolean',
default: 'false',
parse: parseBoolean,
},
age: {
description: 'Age of traveller',
type: 'integer',
defaultStr: '*adult*',
parse: parseInteger
},
}
}
const modifyRoutes = (routes, hafas, config) => {
2020-05-01 20:12:24 +02:00
routes['/stations/:id'] = station
routes['/stations'] = stations
return routes
}
const config = {
2022-04-03 14:15:36 +02:00
hostname: process.env.HOSTNAME || 'localhost',
port: process.env.PORT ? parseInt(process.env.PORT) : 3000,
2020-05-01 20:12:24 +02:00
name: pkg.name,
description: pkg.description,
homepage: pkg.homepage,
version: pkg.version,
2022-12-19 13:18:25 +01:00
docsLink: 'https://github.com/derhuerst/db-rest/blob/6/docs/readme.md',
2021-02-04 19:24:13 +01:00
openapiSpec: true,
2020-05-01 20:12:24 +02:00
logging: true,
2020-10-02 18:33:38 +02:00
aboutPage: false,
2020-05-01 20:12:24 +02:00
etags: 'strong',
2020-10-04 13:46:14 +02:00
csp: `default-src 'none' style-src 'self' 'unsafe-inline' img-src https:`,
2020-05-01 20:12:24 +02:00
healthCheck,
mapRouteParsers,
2020-05-01 20:12:24 +02:00
modifyRoutes,
}
const api = await createHafasRestApi(hafas, config, (api) => {
2020-10-02 18:33:38 +02:00
api.use('/', serveStatic(docsRoot, {
extensions: ['html', 'htm'],
}))
})
2020-05-01 20:12:24 +02:00
2022-12-19 13:23:13 +01:00
export {
2022-04-03 13:44:22 +02:00
hafas,
2020-05-01 20:12:24 +02:00
config,
api,
}