|
|
|
@ -2,7 +2,6 @@ const log = require('../utils/log.utils');
|
|
|
|
|
const db = require('./dbAccess.services');
|
|
|
|
|
const clean = require('../utils/sanitizer.utils');
|
|
|
|
|
const pis = require('../services/pis.services');
|
|
|
|
|
const { filter } = require('compression');
|
|
|
|
|
|
|
|
|
|
async function findByHeadcodeToday(headcode) {
|
|
|
|
|
const sanitizedHeadcode = clean.removeNonAlphanumeric(headcode).toUpperCase();
|
|
|
|
@ -21,19 +20,19 @@ async function findByHeadcodeToday(headcode) {
|
|
|
|
|
let trainData = await parseTrains(queryData);
|
|
|
|
|
let preparedData = [];
|
|
|
|
|
for (let trainService in trainData) {
|
|
|
|
|
if (pis.supported.includes(trainService?.operator)) {
|
|
|
|
|
if (pis.supported.includes(trainData[trainService]['operator'])) {
|
|
|
|
|
// Search for PIS Code for each service
|
|
|
|
|
const tiplocList = await getPublicStops(trainService?.stops);
|
|
|
|
|
const tiplocList = await getPublicStops(trainData[trainService]['stops']);
|
|
|
|
|
//console.log(tiplocList.length); console.log(tiplocList);
|
|
|
|
|
if (tiplocList.length) {
|
|
|
|
|
const pisDetail = await pis.findByTiplocArray(tiplocList);
|
|
|
|
|
trainService['pis'] = pisDetail?.[0]?.['code'] ?? 'None';
|
|
|
|
|
} else if (trainService?.operator === 'GW') {
|
|
|
|
|
trainService['pis'] = '0015'; // Not in Service code
|
|
|
|
|
trainData[trainService]['pis'] = pisDetail?.[0]?.['code'] ?? 'None';
|
|
|
|
|
} else if (trainData[trainService]['operator'] === 'GW') {
|
|
|
|
|
trainData[trainService]['pis'] = '0015'; // Not in Service code
|
|
|
|
|
// '0015' is a string becuase 0015 is not a valid number..
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
preparedData.push(trainService);
|
|
|
|
|
preparedData.push(trainData[trainService]);
|
|
|
|
|
}
|
|
|
|
|
return preparedData;
|
|
|
|
|
}
|
|
|
|
@ -57,64 +56,30 @@ async function findByHeadcode(date, headcode) {
|
|
|
|
|
scheduleEndDate: {$gte: searchDate},
|
|
|
|
|
daysRun: {$in: [shortDay]}
|
|
|
|
|
};
|
|
|
|
|
const pipeline = [
|
|
|
|
|
{
|
|
|
|
|
$match: query
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
$project: {
|
|
|
|
|
operator: 1,
|
|
|
|
|
stops: {
|
|
|
|
|
$concatArrays: [
|
|
|
|
|
[{ $first: '$stops'}],
|
|
|
|
|
[{ $arrayElemAt: ['$stops', -1]}]
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
trainUid: 1,
|
|
|
|
|
stpIndicator: 1
|
|
|
|
|
const queryData = await db.query('timetable', query);
|
|
|
|
|
let trainData = await parseTrains(queryData);
|
|
|
|
|
let preparedData = [];
|
|
|
|
|
for (let trainService in trainData) {
|
|
|
|
|
// Search for PIS Code for each service if supported by PIS services
|
|
|
|
|
if (pis.supported.includes(trainData[trainService]['operator'])) {
|
|
|
|
|
const tiplocList = await getPublicStops(trainData[trainService]['stops']);
|
|
|
|
|
//console.log(tiplocList.length); console.log(tiplocList);
|
|
|
|
|
if (tiplocList.length) {
|
|
|
|
|
const pisDetail = await pis.findByTiplocArray(tiplocList);
|
|
|
|
|
trainData[trainService]['pis'] = pisDetail?.[0]?.['code'] ?? 'None';
|
|
|
|
|
} else if (trainData[trainService]['operator'] === 'GW' && !tiplocList.length) {
|
|
|
|
|
// Not in Service code - for GWR Only
|
|
|
|
|
trainData[trainService]['pis'] = '0015';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
];
|
|
|
|
|
const queryData = await db.queryAggregate('timetable', pipeline);
|
|
|
|
|
console.log(JSON.stringify(queryData));
|
|
|
|
|
let filteredData = filterServices(queryData);
|
|
|
|
|
return await filteredData;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async function findByTrainUid(uid, date = new Date()) {
|
|
|
|
|
let queryDate;
|
|
|
|
|
if (date === 'now') {
|
|
|
|
|
queryDate = new Date();
|
|
|
|
|
} else {
|
|
|
|
|
queryDate = date;
|
|
|
|
|
preparedData.push(trainData[trainService]);
|
|
|
|
|
}
|
|
|
|
|
const query = {
|
|
|
|
|
trainUid: uid,
|
|
|
|
|
scheduleStartDate: {$lte: queryDate},
|
|
|
|
|
scheduleEndDate: {$gte: queryDate}
|
|
|
|
|
};
|
|
|
|
|
const queryData = await db.query('timetable', query);
|
|
|
|
|
if (queryData.length === 0) {
|
|
|
|
|
return [];
|
|
|
|
|
}
|
|
|
|
|
let services;
|
|
|
|
|
services = await filterServices(queryData);
|
|
|
|
|
console.log(services);
|
|
|
|
|
let publicStops;
|
|
|
|
|
if (pis.supported.includes(services[0]?.operator)) {
|
|
|
|
|
publicStops = await getPublicStops(services[0]?.stops);
|
|
|
|
|
const pisCode = await pis.findByTiplocArray(publicStops);
|
|
|
|
|
services[0].pis = pisCode[0]?.code;
|
|
|
|
|
} else if ( services[0]?.operator === 'GW' && !publicStops.length) {
|
|
|
|
|
services[0].pis = '0015';
|
|
|
|
|
}
|
|
|
|
|
return services[0];
|
|
|
|
|
return preparedData;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
module.exports = {
|
|
|
|
|
findByHeadcodeToday,
|
|
|
|
|
findByHeadcode,
|
|
|
|
|
findByTrainUid
|
|
|
|
|
findByHeadcode
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* Internal Functions, not to be exported */
|
|
|
|
@ -150,9 +115,21 @@ async function parseTrains(data) {
|
|
|
|
|
return parsedData;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async function filterServices(data) {
|
|
|
|
|
let stpIndicators = {}, filteredServices = [];
|
|
|
|
|
for (const serviceDetail of data) {
|
|
|
|
|
/* Queries using a trainUid and filters all schedules that
|
|
|
|
|
have been over-ridden by overlays, cancellations and new
|
|
|
|
|
schedules. */
|
|
|
|
|
async function findByTrainUid(uid, date = new Date()) {
|
|
|
|
|
const query = {
|
|
|
|
|
trainUid: uid,
|
|
|
|
|
scheduleStartDate: {$lte: date},
|
|
|
|
|
scheduleEndDate: {$gte: date}
|
|
|
|
|
};
|
|
|
|
|
const queryData = await db.query('timetable', query);
|
|
|
|
|
if (queryData.length === 0) {
|
|
|
|
|
return [];
|
|
|
|
|
}
|
|
|
|
|
let stpIndicators = {};
|
|
|
|
|
for (const serviceDetail of queryData) {
|
|
|
|
|
const trainUid = serviceDetail['trainUid'];
|
|
|
|
|
const stpIndicator = serviceDetail['stpIndicator'];
|
|
|
|
|
if (!stpIndicators[trainUid]) {
|
|
|
|
@ -176,30 +153,30 @@ async function filterServices(data) {
|
|
|
|
|
stpIndicators[trainUid].hasP = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
let preparedData;
|
|
|
|
|
for (const serviceDetail of data) {
|
|
|
|
|
let preparedData = [];
|
|
|
|
|
for (const serviceDetail of queryData) {
|
|
|
|
|
const trainUid = serviceDetail['trainUid'];
|
|
|
|
|
const thisStpIndicators = stpIndicators[trainUid];
|
|
|
|
|
const stpIndicator = serviceDetail['stpIndicator'];
|
|
|
|
|
|
|
|
|
|
if (stpIndicator === 'C') {
|
|
|
|
|
break;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (stpIndicator === 'N' &&
|
|
|
|
|
!thisStpIndicators.hasC) {
|
|
|
|
|
filteredServices.push(serviceDetail);
|
|
|
|
|
return serviceDetail;
|
|
|
|
|
|
|
|
|
|
} else if (stpIndicator === 'O' &&
|
|
|
|
|
!thisStpIndicators.hasC &&
|
|
|
|
|
!thisStpIndicators.hasN) {
|
|
|
|
|
filteredServices.push(serviceDetail);
|
|
|
|
|
return serviceDetail;
|
|
|
|
|
|
|
|
|
|
} else if (stpIndicator === 'P' &&
|
|
|
|
|
!thisStpIndicators.hasC &&
|
|
|
|
|
!thisStpIndicators.hasN &&
|
|
|
|
|
!thisStpIndicators.hasO) {
|
|
|
|
|
filteredServices.push(serviceDetail);
|
|
|
|
|
return serviceDetail;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return filteredServices;
|
|
|
|
|
}
|
|
|
|
|
return preparedData;
|
|
|
|
|
}
|