Compare commits

..

No commits in common. "3818bc5d62549b58e1fa4ee00c6df85f5bd5b243" and "24b882ce5f40787f50ae0caa618d559e9c644036" have entirely different histories.

4 changed files with 47 additions and 93 deletions

View File

@ -1,6 +1,6 @@
const version = { const version = {
api: ['/api/v1/','/api/v2'], api: ['/api/v1/','/api/v2'],
app: '2023.7.5' app: '2023.7.4'
}; };
module.exports = version; module.exports = version;

View File

@ -30,9 +30,6 @@ async function get(req, res, next) {
case 'headcode': case 'headcode':
res.json(await train.findByHeadcode(date, id)); res.json(await train.findByHeadcode(date, id));
break; break;
case 'trainuid':
res.json(await train.findByTrainUid(id, date));
break;
default: default:
res.status(404).json({ res.status(404).json({
status:'error', status:'error',

View File

@ -26,24 +26,6 @@ async function query(collection, query, returnId = false){
return (await qcursor.toArray()); return (await qcursor.toArray());
} }
async function queryProject(collection, query, projection) {
await client.connect();
log.out(`dbAccess.queryProject: Connecting to col: '${collection}'`, 'info');
const qcoll = db.collection(collection);
const qcursor = qcoll.find(query).project(projection);
log.out(`dbAccess.query: Running Query: ${JSON.stringify(query)}, Projection: ${JSON.stringify(projection)}`, 'dbug');
increment(collection);
return await qcursor.toArray();
}
async function queryAggregate(collection, pipeline) {
await client.connect();
log.out(`dbAccess.queryProject: Connecting to col: '${collection}'`, 'info');
log.out(`dbAccess.query: Running Aggregation: ${JSON.stringify(pipeline)}`, 'dbug');
increment(collection);
return await db.collection(collection).aggregate(pipeline).toArray();
}
async function increment(target) { async function increment(target) {
log.out(`dbAccess.increment: Incrementing counter for: ${target}`, 'info'); log.out(`dbAccess.increment: Incrementing counter for: ${target}`, 'info');
await client.connect(); await client.connect();
@ -105,8 +87,6 @@ async function colCount(collection) {
module.exports = { module.exports = {
query, query,
queryProject,
queryAggregate,
increment, increment,
addUser, addUser,
userAtime, userAtime,

View File

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