formatProducts: move factory from profiles into main code

and rename to `formatProductsFilter`
This commit is contained in:
Jannis R 2018-03-16 16:11:32 +01:00
parent ce43f15ad5
commit 83248785e5
No known key found for this signature in database
GPG key ID: 0FE83946296A88A5
7 changed files with 40 additions and 119 deletions

View file

@ -1,16 +0,0 @@
'use strict'
const createFormatBitmask = (allProducts) => {
const formatBitmask = (products) => {
if(Object.keys(products).length === 0) throw new Error('products filter must not be empty')
let bitmask = 0
for (let product in products) {
if (!allProducts[product]) throw new Error('unknown product ' + product)
if (products[product] === true) bitmask += allProducts[product].bitmask
}
return bitmask
}
return formatBitmask
}
module.exports = createFormatBitmask

34
format/products-filter.js Normal file
View file

@ -0,0 +1,34 @@
'use strict'
const isObj = o => o !== null && 'object' === typeof o && !Array.isArray(o)
const hasProp = (o, k) => Object.prototype.hasOwnProperty.call(o, k)
const createFormatProductsFilter = (profile) => {
const byProduct = {}
const defaultProducts = {}
for (let product of profile.products) {
byProduct[product.product] = product
defaultProducts[product.product] = product.default
}
const formatProductsFilter = (filter) => {
if (!isObj(filter)) throw new Error('products filter must be an object')
filter = Object.assign({}, defaultProducts, filter)
let res = 0
for (let product in filter) {
if (!hasProp(filter, product) || filter[product] !== true) continue
if (!byProduct[product]) throw new Error('unknown product ' + product)
for (let bitmask of byProduct[product].bitmasks) res += bitmask
}
return {
type: 'PROD',
mode: 'INC',
value: res + ''
}
}
return formatProductsFilter
}
module.exports = createFormatProductsFilter

View file

@ -5,6 +5,7 @@ const maxBy = require('lodash/maxBy')
const defaultProfile = require('./lib/default-profile') const defaultProfile = require('./lib/default-profile')
const createParseBitmask = require('./parse/products-bitmask') const createParseBitmask = require('./parse/products-bitmask')
const createFormatProductsFilter = require('./format/products-filter')
const validateProfile = require('./lib/validate-profile') const validateProfile = require('./lib/validate-profile')
const _request = require('./lib/request') const _request = require('./lib/request')
@ -14,6 +15,7 @@ const isNonEmptyString = str => 'string' === typeof str && str.length > 0
const createClient = (profile, request = _request) => { const createClient = (profile, request = _request) => {
profile = Object.assign({}, defaultProfile, profile) profile = Object.assign({}, defaultProfile, profile)
profile.parseProducts = createParseBitmask(profile) profile.parseProducts = createParseBitmask(profile)
profile.formatProductsFilter = createFormatProductsFilter(profile)
validateProfile(profile) validateProfile(profile)
const departures = (station, opt = {}) => { const departures = (station, opt = {}) => {
@ -26,7 +28,7 @@ const createClient = (profile, request = _request) => {
duration: 10 // show departures for the next n minutes duration: 10 // show departures for the next n minutes
}, opt) }, opt)
opt.when = opt.when || new Date() opt.when = opt.when || new Date()
const products = profile.formatProducts(opt.products || {}) const products = profile.formatProductsFilter(opt.products || {})
const dir = opt.direction ? profile.formatStation(opt.direction) : null const dir = opt.direction ? profile.formatStation(opt.direction) : null
return request(profile, { return request(profile, {
@ -92,7 +94,7 @@ const createClient = (profile, request = _request) => {
opt.when = opt.when || new Date() opt.when = opt.when || new Date()
const filters = [ const filters = [
profile.formatProducts(opt.products || {}) profile.formatProductsFilter(opt.products || {})
] ]
if ( if (
opt.accessibility && opt.accessibility &&
@ -319,7 +321,7 @@ const createClient = (profile, request = _request) => {
perStep: Math.round(durationPerStep), perStep: Math.round(durationPerStep),
ageOfReport: true, // todo: what is this? ageOfReport: true, // todo: what is this?
jnyFltrL: [ jnyFltrL: [
profile.formatProducts(opt.products || {}) profile.formatProductsFilter(opt.products || {})
], ],
trainPosMode: 'CALC' // todo: what is this? what about realtime? trainPosMode: 'CALC' // todo: what is this? what about realtime?
} }

View file

@ -3,14 +3,11 @@
const _createParseLine = require('../../parse/line') const _createParseLine = require('../../parse/line')
const _createParseJourney = require('../../parse/journey') const _createParseJourney = require('../../parse/journey')
const _formatStation = require('../../format/station') const _formatStation = require('../../format/station')
const createFormatBitmask = require('../../format/products-bitmask')
const {bike} = require('../../format/filters') const {bike} = require('../../format/filters')
const products = require('./products') const products = require('./products')
const formatLoyaltyCard = require('./loyalty-cards').format const formatLoyaltyCard = require('./loyalty-cards').format
const formatBitmask = createFormatBitmask(products)
const transformReqBody = (body) => { const transformReqBody = (body) => {
body.client = {id: 'DB', v: '16040000', type: 'IPH', name: 'DB Navigator'} body.client = {id: 'DB', v: '16040000', type: 'IPH', name: 'DB Navigator'}
body.ext = 'DB.R15.12.a' body.ext = 'DB.R15.12.a'
@ -102,27 +99,6 @@ const formatStation = (id) => {
return _formatStation(id) return _formatStation(id)
} }
const defaultProducts = {
suburban: true,
subway: true,
tram: true,
bus: true,
ferry: true,
national: true,
nationalExp: true,
regional: true,
regionalExp: true,
taxi: false
}
const formatProducts = (products) => {
products = Object.assign(Object.create(null), defaultProducts, products)
return {
type: 'PROD',
mode: 'INC',
value: formatBitmask(products) + ''
}
}
// todo: find option for absolute number of results // todo: find option for absolute number of results
const dbProfile = { const dbProfile = {
@ -142,8 +118,7 @@ const dbProfile = {
parseLine: createParseLine, parseLine: createParseLine,
parseJourney: createParseJourney, parseJourney: createParseJourney,
formatStation, formatStation
formatProducts
} }
module.exports = dbProfile module.exports = dbProfile

View file

@ -2,18 +2,6 @@
const _createParseLine = require('../../parse/line') const _createParseLine = require('../../parse/line')
const products = require('./products') const products = require('./products')
const createFormatBitmask = require('../../format/products-bitmask')
const defaultProducts = {
nationalExp: true,
national: true,
regional: true,
suburban: true,
bus: true,
tram: true,
tourismTrain: true,
}
const transformReqBody = (body) => { const transformReqBody = (body) => {
body.client = { body.client = {
@ -50,18 +38,6 @@ const createParseLine = (profile, operators) => {
return parseLineWithMode return parseLineWithMode
} }
const formatProducts = (products) => {
products = Object.assign(Object.create(null), defaultProducts, products)
return {
type: 'PROD',
mode: 'INC',
value: formatBitmask(products) + ''
}
}
const formatBitmask = createFormatBitmask(products)
const insaProfile = { const insaProfile = {
locale: 'de-DE', locale: 'de-DE',
timezone: 'Europe/Berlin', timezone: 'Europe/Berlin',
@ -69,9 +45,6 @@ const insaProfile = {
transformReqBody, transformReqBody,
products: products.allProducts, products: products.allProducts,
formatProducts,
parseLine: createParseLine,
journeyLeg: true, journeyLeg: true,
radar: true radar: true

View file

@ -3,7 +3,6 @@
// todo: https://gist.github.com/anonymous/a5fc856bc80ae7364721943243f934f4#file-haf_config_base-properties-L5 // todo: https://gist.github.com/anonymous/a5fc856bc80ae7364721943243f934f4#file-haf_config_base-properties-L5
// todo: https://gist.github.com/anonymous/a5fc856bc80ae7364721943243f934f4#file-haf_config_base-properties-L47-L234 // todo: https://gist.github.com/anonymous/a5fc856bc80ae7364721943243f934f4#file-haf_config_base-properties-L47-L234
const createFormatBitmask = require('../../format/products-bitmask')
const _createParseLine = require('../../parse/line') const _createParseLine = require('../../parse/line')
const _parseLocation = require('../../parse/location') const _parseLocation = require('../../parse/location')
const _createParseMovement = require('../../parse/movement') const _createParseMovement = require('../../parse/movement')
@ -81,28 +80,6 @@ const createParseMovement = (profile, locations, lines, remarks) => {
return parseMovement return parseMovement
} }
const defaultProducts = {
nationalExp: true,
national: true,
interregional: true,
regional: true,
suburban: true,
bus: true,
ferry: true,
subway: true,
tram: true,
onCall: true
}
const formatBitmask = createFormatBitmask(products)
const formatProducts = (products) => {
products = Object.assign(Object.create(null), defaultProducts, products)
return {
type: 'PROD',
mode: 'INC',
value: formatBitmask(products) + ''
}
}
const oebbProfile = { const oebbProfile = {
locale: 'de-AT', locale: 'de-AT',
timezone: 'Europe/Vienna', timezone: 'Europe/Vienna',
@ -116,8 +93,6 @@ const oebbProfile = {
parseLocation, parseLocation,
parseMovement: createParseMovement, parseMovement: createParseMovement,
formatProducts,
journeyLeg: true, journeyLeg: true,
radar: true radar: true
} }

View file

@ -12,12 +12,9 @@ const _createParseJourney = require('../../parse/journey')
const _createParseStopover = require('../../parse/stopover') const _createParseStopover = require('../../parse/stopover')
const _createParseDeparture = require('../../parse/departure') const _createParseDeparture = require('../../parse/departure')
const _formatStation = require('../../format/station') const _formatStation = require('../../format/station')
const createFormatBitmask = require('../../format/products-bitmask')
const products = require('./products') const products = require('./products')
const formatBitmask = createFormatBitmask(products)
const transformReqBody = (body) => { const transformReqBody = (body) => {
body.client = {type: 'IPA', id: 'VBB', name: 'vbbPROD', v: '4010300'} body.client = {type: 'IPA', id: 'VBB', name: 'vbbPROD', v: '4010300'}
body.ext = 'VBB.1' body.ext = 'VBB.1'
@ -145,24 +142,6 @@ const formatStation = (id) => {
return _formatStation(id) return _formatStation(id)
} }
const defaultProducts = {
suburban: true,
subway: true,
tram: true,
bus: true,
ferry: true,
express: true,
regional: true
}
const formatProducts = (products) => {
products = Object.assign(Object.create(null), defaultProducts, products)
return {
type: 'PROD',
mode: 'INC',
value: formatBitmask(products) + ''
}
}
const vbbProfile = { const vbbProfile = {
locale: 'de-DE', locale: 'de-DE',
timezone: 'Europe/Berlin', timezone: 'Europe/Berlin',
@ -185,7 +164,6 @@ const vbbProfile = {
parseStopover: createParseStopover, parseStopover: createParseStopover,
formatStation, formatStation,
formatProducts,
journeysNumF: false, journeysNumF: false,
journeyLeg: true, journeyLeg: true,