@golemio/pid
Version:
Golemio PID Module
100 lines • 4.88 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.V2DepartureBoardsController = void 0;
const dto_1 = require("../../dto");
const MpvnetXmlSerializer_1 = require("../../helpers/MpvnetXmlSerializer");
const PIDDepartureBoardsModel_1 = require("../../models/PIDDepartureBoardsModel");
const shared_1 = require("../../../shared");
const trace_provider_1 = require("@golemio/core/dist/monitoring/opentelemetry/trace-provider");
const express_validator_1 = require("@golemio/core/dist/shared/express-validator");
const golemio_errors_1 = require("@golemio/core/dist/shared/golemio-errors");
const moment_timezone_1 = __importDefault(require("@golemio/core/dist/shared/moment-timezone"));
class V2DepartureBoardsController {
constructor() {
this.getDepartureBoard = async (req, res, next) => {
const { query, preferredTimezone } = this.parseQuery(req);
res.setHeader("X-Golemio-Preset-Metadata", `airConditionPossible=${query.airCondition ? 1 : 0}`);
const timeFrom = this.computeTimeFrom(query, preferredTimezone);
const span = (0, trace_provider_1.createChildSpan)("V2DepartureBoardsController.getDepartureBoard");
try {
const dto = await this.fetchBoard(query, preferredTimezone, timeFrom);
res.status(200).send(dto);
}
catch (err) {
next(err);
}
finally {
span?.end();
}
};
this.getDepartureBoardXml = async (req, res, next) => {
const { query, preferredTimezone } = this.parseQuery(req);
if (query.mode !== undefined && query.mode !== "departures") {
next(new golemio_errors_1.GeneralError("Only mode=departures is supported for the XML endpoint.", "V2DepartureBoardsController", undefined, 400));
return;
}
const timeFrom = this.computeTimeFrom(query, preferredTimezone);
const span = (0, trace_provider_1.createChildSpan)("V2DepartureBoardsController.getDepartureBoardXml");
try {
const dto = await this.fetchBoard(query, preferredTimezone, timeFrom);
res.set("Content-Type", "text/xml; charset=utf-8").status(200).send(MpvnetXmlSerializer_1.MpvnetXmlSerializer.serialize(dto));
}
catch (err) {
next(err);
}
finally {
span?.end();
}
};
this.departureBoardsModel = new PIDDepartureBoardsModel_1.PIDDepartureBoardsModel();
}
parseQuery(req) {
const queryData = (0, express_validator_1.matchedData)(req);
const query = shared_1.RopidRouterUtils.mapObjectToDTOInstance(dto_1.DepartureBoardsQueryDTO, queryData);
const preferredTimezone = shared_1.RopidRouterUtils.getPreferredTimezone(query.preferredTimezone);
return { query, preferredTimezone };
}
computeTimeFrom(query, preferredTimezone) {
// datetime is valid ISO 8601 (by express validator)
// it matches:
// 2020-10-10T10:00:00Z
// 2020-10-10 10:00:00.00Z
// 2020-10-10T10:00:00+02
// 2020-10-10T10:00:00+02:00
const timezoneDefinedRegexp = /[T ][\d:.]+([zZ]|([+-])([01]\d|2[0-3]):?([0-5]\d)?)/;
// use timezone from ?preferredTimezone if not set in ?timeFrom
return query.timeFrom
? query.timeFrom.match(timezoneDefinedRegexp)
? (0, moment_timezone_1.default)(query.timeFrom)
: moment_timezone_1.default.tz(query.timeFrom, preferredTimezone)
: undefined;
}
async fetchBoard(query, preferredTimezone, timeFrom) {
const data = await this.departureBoardsModel.getAll({
aswIds: query.aswIds,
cisIds: query.cisIds,
gtfsIds: query.ids,
names: query.names,
minutesAfter: query.minutesAfter,
minutesBefore: query.minutesBefore,
timeFrom,
mode: query.mode,
order: query.order,
filter: query.filter,
skip: query.skip,
limit: query.limit,
offset: query.offset,
total: query.total ?? query.limit,
timezone: preferredTimezone,
includeMetroTrains: query.includeMetroTrains,
airCondition: query.airCondition,
appendHeadsignsLimit: query.appendHeadsignsLimit,
});
return shared_1.RopidRouterUtils.mapObjectToDTOInstance(dto_1.DepartureBoardsResponseDTO, data);
}
}
exports.V2DepartureBoardsController = V2DepartureBoardsController;
//# sourceMappingURL=V2DepartureBoardsController.js.map