UNPKG

@golemio/pid

Version:
123 lines • 7.78 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var __param = (this && this.__param) || function (paramIndex, decorator) { return function (target, key) { decorator(target, key, paramIndex); } }; Object.defineProperty(exports, "__esModule", { value: true }); exports.ProcessMetroRunMessagesTask = void 0; const cache_1 = require("../../../../ropid-gtfs/data-access/cache"); const precomputed_1 = require("../../../../ropid-gtfs/data-access/precomputed"); const PositionsRepository_1 = require("../../vehicle-positions/data-access/PositionsRepository"); const GTFSTripRunManagerFactory_1 = require("../../vehicle-positions/helpers/gtfs-trip-run/GTFSTripRunManagerFactory"); const vehicle_positions_1 = require("../../../../../schema-definitions/vehicle-positions"); const integration_engine_1 = require("@golemio/core/dist/integration-engine"); const helpers_1 = require("@golemio/core/dist/integration-engine/helpers"); const golemio_errors_1 = require("@golemio/core/dist/shared/golemio-errors"); const sequelize_1 = require("@golemio/core/dist/shared/sequelize"); const CommonRunsRepository_1 = require("../data-access/CommonRunsRepository"); const MetroMessageFilter_1 = require("../helpers/MetroMessageFilter"); const MetroTransformedRunsSchema_1 = require("../schema/MetroTransformedRunsSchema"); const MetroRunsMessageProcessingTransformation_1 = require("../transformations/MetroRunsMessageProcessingTransformation"); const constants_1 = require("../constants"); const tsyringe_1 = require("@golemio/core/dist/shared/tsyringe"); const MetroRailtrackGPSRepository_1 = require("../../../../ropid-gtfs/workers/timetables/tasks/data-access/MetroRailtrackGPSRepository"); const VPContainerToken_1 = require("../../../ioc/VPContainerToken"); let ProcessMetroRunMessagesTask = class ProcessMetroRunMessagesTask extends integration_engine_1.AbstractTask { constructor(railtrackGPSRepository, positionsRepository, tripsRepository, runsRepository, runTripsRedisRepository, processingTransformation, tripScheduleRepository) { super(constants_1.WORKER_NAME); this.railtrackGPSRepository = railtrackGPSRepository; this.positionsRepository = positionsRepository; this.tripsRepository = tripsRepository; this.runsRepository = runsRepository; this.runTripsRedisRepository = runTripsRedisRepository; this.processingTransformation = processingTransformation; this.tripScheduleRepository = tripScheduleRepository; this.queueName = "processMetroRunMessages"; this.queueTtl = 10 * 60 * 1000; // 10 minutes this.schema = MetroTransformedRunsSchema_1.MetroTransformedRunsValidationSchema; this.gtfsTripRunManager = GTFSTripRunManagerFactory_1.GTFSTripRunManagerFactory.create(GTFSTripRunManagerFactory_1.GTFSTripRunType.Metro, this.positionsRepository, this.tripsRepository, this.runsRepository, this.runTripsRedisRepository); } async execute({ routeName, messages }, msgProperties) { const { filteredMessages, trackIds } = MetroMessageFilter_1.MetroMessageFilter.getValidMessagesWithTrackIds(messages); if (filteredMessages.length === 0) { return; } const gpsData = await this.railtrackGPSRepository.findCoordinates(routeName, trackIds); for (const message of filteredMessages) { await this.processMessage(message, gpsData, msgProperties?.timestamp); } } async processMessage(message, gpsData, firstMessageCreatedAt) { const data = this.processingTransformation.transformElement({ message, gpsData }); if (!data) { return; } let enhancedMessage = null; try { enhancedMessage = await this.enrichRunMessage(data.runInput); } catch (err) { throw new golemio_errors_1.GeneralError(`processMessage: error while fetching trip schedule`, this.constructor.name, err); } if (!enhancedMessage) { helpers_1.log.verbose(`processMessage: no trip_id for metro run: ${JSON.stringify(data.runInput)}`); return; } const scheduledTrips = await this.gtfsTripRunManager.setAndReturnScheduledTrips({ ...data.runSchedule, // try to use internal run number if available (input run message is not always reliable) run_number: enhancedMessage.internalRunNumber ?? data.runSchedule.run_number, }); if (scheduledTrips.length === 0) { helpers_1.log.verbose(`processMessage: no schedule for metro run: ${JSON.stringify(data.runSchedule)}`); return; } const delayMsg = await this.gtfsTripRunManager.generateDelayMsg(scheduledTrips, enhancedMessage); if (delayMsg.updatedTrips.length > 0) { await integration_engine_1.QueueManager.sendMessageToExchange(`${integration_engine_1.config.RABBIT_EXCHANGE_NAME}.${vehicle_positions_1.VehiclePositions.name.toLowerCase()}`, "updateDelay", delayMsg, { timestamp: firstMessageCreatedAt }); } } async enrichRunMessage(runInput) { const tripSchedule = await this.tripScheduleRepository.findOne({ attributes: ["trip_id", "run_number"], where: { trip_number: runInput.trainNumber, route_id: `L${runInput.routeId}`, [sequelize_1.Op.and]: [sequelize_1.Sequelize.literal("start_timestamp::date = current_date")], }, }); if (!tripSchedule) { return null; } return { ...runInput, tripId: tripSchedule.trip_id, internalRunNumber: tripSchedule.run_number, }; } }; exports.ProcessMetroRunMessagesTask = ProcessMetroRunMessagesTask; exports.ProcessMetroRunMessagesTask = ProcessMetroRunMessagesTask = __decorate([ (0, tsyringe_1.injectable)(), __param(0, (0, tsyringe_1.inject)(VPContainerToken_1.VPContainerToken.MetroRailtrackGPSRepository)), __param(1, (0, tsyringe_1.inject)(VPContainerToken_1.VPContainerToken.PositionsRepository)), __param(2, (0, tsyringe_1.inject)(VPContainerToken_1.VPContainerToken.TripRepository)), __param(3, (0, tsyringe_1.inject)(VPContainerToken_1.VPContainerToken.CommonRunsRepository)), __param(4, (0, tsyringe_1.inject)(VPContainerToken_1.VPContainerToken.RunTripsRedisRepository)), __param(5, (0, tsyringe_1.inject)(VPContainerToken_1.VPContainerToken.MetroRunsMessageProcessingTransformation)), __param(6, (0, tsyringe_1.inject)(VPContainerToken_1.VPContainerToken.TripScheduleRepository)), __metadata("design:paramtypes", [MetroRailtrackGPSRepository_1.MetroRailtrackGPSRepository, PositionsRepository_1.PositionsRepository, Function, CommonRunsRepository_1.CommonRunsRepository, cache_1.RunTripsRedisRepository, MetroRunsMessageProcessingTransformation_1.MetroRunsMessageProcessingTransformation, precomputed_1.TripScheduleRepository]) ], ProcessMetroRunMessagesTask); //# sourceMappingURL=ProcessMetroRunMessagesTask.js.map