From d7eca5b4d16db05f790522a56b8374700b50381f Mon Sep 17 00:00:00 2001 From: Jannis R Date: Fri, 5 Jan 2018 18:46:19 +0100 Subject: [PATCH] expose line operators closes #6 --- docs/departures.md | 13 ++++++++--- docs/journey-leg.md | 7 +++++- docs/journeys.md | 7 +++++- docs/radar.md | 14 ++++++++++-- lib/request.js | 7 +++--- p/db/index.js | 29 +++++++++++++---------- p/vbb/index.js | 43 +++++++++++++++++++--------------- parse/line.js | 56 +++++++++++++++++++++++++-------------------- 8 files changed, 110 insertions(+), 66 deletions(-) diff --git a/docs/departures.md b/docs/departures.md index 60756dde..5cc60754 100644 --- a/docs/departures.md +++ b/docs/departures.md @@ -88,7 +88,12 @@ The response may look like this: metro: false, express: false, night: false, - productCode: 0 + productCode: 0, + operator: { + type: 'operator', + id: 's-bahn-berlin-gmbh', + name: 'S-Bahn Berlin GmbH' + } }, direction: 'S Spandau' }, { @@ -110,7 +115,8 @@ The response may look like this: metro: false, express: false, night: false, - productCode: 0 + productCode: 0, + operator: { /* … */ } }, direction: 'S Westkreuz' }, { @@ -149,7 +155,8 @@ The response may look like this: metro: false, express: false, night: false, - productCode: 1 + productCode: 1, + operator: { /* … */ } }, direction: 'U Rudow' } ] diff --git a/docs/journey-leg.md b/docs/journey-leg.md index b5f24afe..95de8c14 100644 --- a/docs/journey-leg.md +++ b/docs/journey-leg.md @@ -105,7 +105,12 @@ The response looked like this: metro: false, express: false, night: false, - productCode: 0 + productCode: 0, + operator: { + type: 'operator', + id: 's-bahn-berlin-gmbh', + name: 'S-Bahn Berlin GmbH' + } }, direction: 'S Spandau', passed: [ /* … */ ] diff --git a/docs/journeys.md b/docs/journeys.md index 3aa30ae2..86446da8 100644 --- a/docs/journeys.md +++ b/docs/journeys.md @@ -143,7 +143,12 @@ The response may look like this: metro: false, express: false, night: false, - productCode: 0 + productCode: 0, + operator: { + type: 'operator', + id: 's-bahn-berlin-gmbh', + name: 'S-Bahn Berlin GmbH' + } }, direction: 'S Potsdam Hauptbahnhof', passed: [ { diff --git a/docs/radar.md b/docs/radar.md index b1be3bfa..281b2f77 100644 --- a/docs/radar.md +++ b/docs/radar.md @@ -51,7 +51,12 @@ The response may look like this: nr: 9, metro: false, express: false, - night: false + night: false, + operator: { + type: 'operator', + id: 's-bahn-berlin-gmbh', + name: 'S-Bahn Berlin GmbH' + } }, direction: 'S Flughafen Berlin-Schönefeld', trip: 31463, @@ -118,7 +123,12 @@ The response may look like this: nr: 2, metro: true, express: false, - night: false + night: false, + operator: { + type: 'operator', + id: 'berliner-verkehrsbetriebe', + name: 'Berliner Verkehrsbetriebe' + } }, direction: 'Heinersdorf', trip: 26321, diff --git a/lib/request.js b/lib/request.js index c693c092..0eccbb52 100644 --- a/lib/request.js +++ b/lib/request.js @@ -45,15 +45,16 @@ const request = (profile, data) => { if (Array.isArray(c.locL)) { d.locations = c.locL.map(loc => profile.parseLocation(profile, loc)) } - if (Array.isArray(c.prodL)) { - d.lines = c.prodL.map(line => profile.parseLine(profile, line)) - } if (Array.isArray(c.remL)) { d.remarks = c.remL.map(rem => profile.parseRemark(profile, rem)) } if (Array.isArray(c.opL)) { d.operators = c.opL.map(op => profile.parseOperator(profile, op)) } + if (Array.isArray(c.prodL)) { + const parse = profile.parseLine(profile, d.operators) + d.lines = c.prodL.map(parse) + } return d }) } diff --git a/p/db/index.js b/p/db/index.js index 89770c35..4b6dd41c 100644 --- a/p/db/index.js +++ b/p/db/index.js @@ -2,7 +2,7 @@ const crypto = require('crypto') -const _parseLine = require('../../parse/line') +const _createParseLine = require('../../parse/line') const _createParseJourney = require('../../parse/journey') const _formatStation = require('../../format/station') const createParseBitmask = require('../../parse/products-bitmask') @@ -52,19 +52,24 @@ const transformJourneysQuery = (query, opt) => { return query } -const parseLine = (profile, l) => { - const res = _parseLine(profile, l) +const createParseLine = (profile, operators) => { + const parseLine = _createParseLine(profile, operators) - res.mode = res.product = null - if ('class' in res) { - const data = modes.bitmasks[parseInt(res.class)] - if (data) { - res.mode = data.mode - res.product = data.product + const parseLineWithMode = (l) => { + const res = parseLine(l) + + res.mode = res.product = null + if ('class' in res) { + const data = modes.bitmasks[parseInt(res.class)] + if (data) { + res.mode = data.mode + res.product = data.product + } } - } - return res + return res + } + return parseLineWithMode } const createParseJourney = (profile, stations, lines, remarks) => { @@ -144,7 +149,7 @@ const dbProfile = { products: modes.allProducts, // todo: parseLocation - parseLine, + parseLine: createParseLine, parseProducts: createParseBitmask(modes.bitmasks), parseJourney: createParseJourney, diff --git a/p/vbb/index.js b/p/vbb/index.js index dce6261a..2c9325c6 100644 --- a/p/vbb/index.js +++ b/p/vbb/index.js @@ -6,7 +6,7 @@ const parseLineName = require('vbb-parse-line') const parseTicket = require('vbb-parse-ticket') const getStations = require('vbb-stations') -const _parseLine = require('../../parse/line') +const _createParseLine = require('../../parse/line') const _parseLocation = require('../../parse/location') const _createParseJourney = require('../../parse/journey') const _createParseStopover = require('../../parse/stopover') @@ -28,26 +28,31 @@ const transformReqBody = (body) => { return body } -const parseLine = (profile, l) => { - const res = _parseLine(profile, l) +const createParseLine = (profile, operators) => { + const parseLine = _createParseLine(profile, operators) - res.mode = res.product = null - if ('class' in res) { - const data = modes.bitmasks[parseInt(res.class)] - if (data) { - res.mode = data.mode - res.product = data.product + const parseLineWithMode = (l) => { + const res = parseLine(l) + + res.mode = res.product = null + if ('class' in res) { + const data = modes.bitmasks[parseInt(res.class)] + if (data) { + res.mode = data.mode + res.product = data.product + } } + + const details = parseLineName(l.name) + res.symbol = details.symbol + res.nr = details.nr + res.metro = details.metro + res.express = details.express + res.night = details.night + + return res } - - const details = parseLineName(l.name) - res.symbol = details.symbol - res.nr = details.nr - res.metro = details.metro - res.express = details.express - res.night = details.night - - return res + return parseLineWithMode } const parseLocation = (profile, l) => { @@ -169,7 +174,7 @@ const vbbProfile = { parseStationName: shorten, parseLocation, - parseLine, + parseLine: createParseLine, parseProducts: createParseBitmask(modes.bitmasks), parseJourney: createParseJourney, parseDeparture: createParseDeparture, diff --git a/parse/line.js b/parse/line.js index 19f79680..47333a14 100644 --- a/parse/line.js +++ b/parse/line.js @@ -3,31 +3,37 @@ const slugg = require('slugg') // todo: are p.number and p.line ever different? -// todo: operator from p.oprX? -const parseLine = (profile, p) => { - if (!p) return null // todo: handle this upstream - const res = { - type: 'line', - id: null, - name: p.line || p.name, - public: true +const createParseLine = (profile, operators) => { + const parseLine = (p) => { + if (!p) return null // todo: handle this upstream + const res = { + type: 'line', + id: null, + name: p.line || p.name, + public: true + } + + // We don't get a proper line id from the API, so we use the trip nr here. + // todo: find a better way + if (p.prodCtx && p.prodCtx.num) res.id = p.prodCtx.num + // This is terrible, but FPTF demands an ID. Let's pray for VBB to expose an ID. + else if (p.line) res.id = slugg(p.line.trim()) + else if (p.name) res.id = slugg(p.name.trim()) + + if (p.cls) res.class = p.cls + if (p.prodCtx && p.prodCtx.catCode !== undefined) { + res.productCode = +p.prodCtx.catCode + } + + // todo: parse mode, remove from profiles + + if ('number' === typeof p.oprX) { + res.operator = operators[p.oprX] || null + } + + return res } - - // We don't get a proper line id from the API, so we use the trip nr here. - // todo: find a better way - if (p.prodCtx && p.prodCtx.num) res.id = p.prodCtx.num - // This is terrible, but FPTF demands an ID. Let's pray for VBB to expose an ID. - else if (p.line) res.id = slugg(p.line.trim()) - else if (p.name) res.id = slugg(p.name.trim()) - - if (p.cls) res.class = p.cls - if (p.prodCtx && p.prodCtx.catCode !== undefined) { - res.productCode = +p.prodCtx.catCode - } - - // todo: parse mode, remove from profiles - - return res + return parseLine } -module.exports = parseLine +module.exports = createParseLine