UNPKG

hkopendata

Version:

Access different Opendata API and data in Hong Kong

113 lines (106 loc) 3.15 kB
// https://www.mardep.gov.hk/datagovhk/Dataspec_crossboundary_ferry_services_arrive_depart_en.pdf const cmn = require("../../common"); const BASE_URL = "https://www.mardep.gov.hk/e_files/{langDir}/opendata/{dir}_{lang}.csv"; const FERRY = {}; const VALID = { dir: /^(arrival|depart)$/, lang: /^(en|tc|sc)$/, } const PARAMS = { dir: "arrival", lang: "en" } const SEARCH_CONFIG = { value: { lang: { accepted: { tc: "tc", sc: "sc", en: "en" } }, dir: { accepted: ["arrival", "depart"] } }, } function beforeSearch() { if (Object.keys(FERRY).length === 0) { let _ferry = cmn.GetDataJson("hk-ferry"); for (let key in _ferry) FERRY[key] = _ferry[key]; } } function validateParameters(params) { params = cmn.ParseSearchFields(params, SEARCH_CONFIG); let result = cmn.ValidateParameters(params, VALID); if (!result.error) { result.data = { ...{ langDir: params.lang == "tc" ? "hk" : params.lang }, ...params } } return result; } function search(data, opts) { beforeSearch(); return new Promise((resolve, reject) => { let processed = validateParameters({ ...PARAMS, ...data }), params; if (processed.error) { reject(processed); } else { params = processed.data; cmn.CSVFetch(cmn.ReplaceURL(BASE_URL, params), { delimiter: "|" }) .then((res) => { resolve(processData(res, params)) }) .catch((err) => reject(err)) } }) } function processData(data, params) { return data.body.map(row => { let temp = { company: row[2], time: row[0], berth: row[4], pier: row[3], } if ("pier" in FERRY) { FERRY.pier.map(pier => { for (let k in pier) { if (pier[k] === temp.pier) { temp.pier = pier.loc; } } }) } if ("company" in FERRY) { FERRY.company .filter(com => "abbr" in com) .map(com => { if (com.abbr.indexOf(temp.company) != -1) { temp.company = com; temp.companyCode = com.code; } }) } temp[params.dir == "depart" ? "destination" : "origin"] = row[1]; if (/cancel|取消/i.test(row[5])) { temp.cancelled = true; } else if (/depart|開航|开航/i.test(row[5])) { temp.departed = true; } else if (/delay|延遲|延迟/i.test(row[5])) { temp.delayed = true; } return temp; }) } module.exports = search;