UNPKG

@golemio/parkings

Version:
182 lines • 11.9 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.SaveParkingZonesPrague = void 0; const SourceEnum_1 = require("../../../helpers/constants/SourceEnum"); const TariffCheckerFactory_1 = __importStar(require("../../businessRules/TariffCheckerFactory")); const LocationBuilderHelper_1 = require("../../helpers/LocationBuilderHelper"); const Di_1 = require("../../ioc/Di"); const ModuleContainerToken_1 = require("../../ioc/ModuleContainerToken"); const ParkingsLocationRepository_1 = require("../../repositories/ParkingsLocationRepository"); const IPRParkingTransformation_1 = require("../../transformations/IPRParkingTransformation"); const TSKParkingTariffTransformation_1 = require("../../transformations/TSKParkingTariffTransformation"); const TSKParkingTransformation_1 = require("../../transformations/TSKParkingTransformation"); const UpdateAddressWorker_1 = require("../UpdateAddressWorker"); const index_1 = require("../../../schema-definitions/index"); const integration_engine_1 = require("@golemio/core/dist/integration-engine"); const datasources_1 = require("@golemio/core/dist/integration-engine/datasources"); const ContainerToken_1 = require("@golemio/core/dist/integration-engine/ioc/ContainerToken"); const AbstractEmptyTask_1 = require("@golemio/core/dist/integration-engine/workers/AbstractEmptyTask"); const golemio_validator_1 = require("@golemio/core/dist/shared/golemio-validator"); const uuid_by_string_1 = __importDefault(require("uuid-by-string")); const helpers_1 = require("@golemio/core/dist/helpers"); const TskParkingFilter_1 = require("../../transformations/TskParkingFilter"); class SaveParkingZonesPrague extends AbstractEmptyTask_1.AbstractEmptyTask { constructor(queuePrefix) { super(queuePrefix); this.queueName = "saveParkingZonesPrague"; /** * Parking zones Prague queue worker method * - store all data for parking zones in Prague. */ this.execute = async () => { const currentDate = new Date(); await this.saveParkingZonesLocationsPrague(currentDate); await this.saveParkingZonesTariffsPrague(currentDate); }; /** * Parking zones Prague * - store location data for parking zones in Prague. * - merged TSK and IPR data sources */ this.saveParkingZonesLocationsPrague = async (currentDate) => { const processingDate = new Date(); this.ftpTSKSettings.filename = `Area_${(0, helpers_1.dateTime)(currentDate).format("yyyy-LL-dd")}.json`; this.dataSourceTSK.protocolStrategy.setConnectionSettings(this.ftpTSKSettings); const dataTSK = await this.dataSourceTSK.getAll(); const filteredTSKRecords = this.tskParkingFilter.filterUniqueParkings(dataTSK.data); const transformedTSKData = await this.transformTskData(currentDate.toISOString(), filteredTSKRecords); const dataIPR = await this.dataSourceIPR.getAll(); const transformedIPRData = await this.iprTransformation.transform(dataIPR); const result = await (0, LocationBuilderHelper_1.mergeParkingZoneDataSets)(transformedTSKData.parking, transformedIPRData); const transformedParkingTariffsRelationData = await this.transformTskRelationsData(currentDate.toISOString(), filteredTSKRecords); await this.parkingsModel.saveActiveParkingsWithoutAddress(result.parking, SourceEnum_1.SourceEnum.TSK); await this.parkingsLocationModel.saveWithoutAddress(result.locations); await this.parkingTariffRelationsRepository.saveTariffsRelations(transformedParkingTariffsRelationData, SourceEnum_1.SourceEnum.TSK_V2); await this.parkingPaymentRepository.updatePaymentsBySource(transformedTSKData.payment, SourceEnum_1.SourceEnum.TSK, processingDate); await integration_engine_1.QueueManager.sendMessageToExchange(this.config.RABBIT_EXCHANGE_NAME + "." + UpdateAddressWorker_1.UpdateAddressWorker.workerName.toLowerCase(), "updateMissingParkingsAddresses", {}); await integration_engine_1.QueueManager.sendMessageToExchange(this.config.RABBIT_EXCHANGE_NAME + "." + UpdateAddressWorker_1.UpdateAddressWorker.workerName.toLowerCase(), "updateMissingParkingsLocationAddresses", {}); }; /** * Parking zones Prague * - store tariff data for parking zones in Prague. */ this.saveParkingZonesTariffsPrague = async (currentDate) => { this.ftpTSKSettings.filename = `Tarif_${(0, helpers_1.dateTime)(currentDate).format("yyyy-LL-dd")}.tsv`; this.dataSourceTariffTSK.protocolStrategy.setConnectionSettings(this.ftpTSKSettings); const dataTSK = await this.dataSourceTariffTSK.getAll(); const dataRecords = dataTSK.data; const { validTariffs, invalidResults } = this.checkBusinessRules(dataRecords); const transformedTSKData = await this.tskTariffTransformation.transform({ tsk: validTariffs, lastUpdated: currentDate, }); await this.parkingsTariffsModel.deleteByTariffIds(transformedTSKData); await this.parkingsTariffsModel.bulkSave(transformedTSKData); await this.saveBusinessErrors(invalidResults); }; this.config = Di_1.ParkingsContainer.resolve(ContainerToken_1.ContainerToken.Config); const strategyIPR = new datasources_1.JSONDataTypeStrategy({ resultsPath: "features" }); strategyIPR.setFilter((item) => item.properties.TARIFTAB); this.dataSourceIPR = new datasources_1.DataSource(index_1.Parkings.ipr.name + "DataSource", new datasources_1.PaginatedHTTPProtocolStrategy({ headers: {}, method: "GET", url: this.config.datasources.ParkingZones, }), strategyIPR, new golemio_validator_1.JSONSchemaValidator(index_1.Parkings.ipr.name + "DataSource", index_1.Parkings.ipr.datasourceJsonSchema)); this.ftpTSKSettings = { filename: "", path: this.config.datasources.TSKFTPParkingZonesPath, url: { host: this.config.datasources.TSKFTP.host, port: this.config.datasources.TSKFTP.port, user: this.config.datasources.TSKFTP.user, password: this.config.datasources.TSKFTP.password, }, encoding: "utf8", }; this.dataSourceTSK = new datasources_1.DataSource(index_1.Parkings.tsk.name + "DataSource", new datasources_1.FTPProtocolStrategy(this.ftpTSKSettings), new datasources_1.JSONDataTypeStrategy({ resultsPath: "features" }), new golemio_validator_1.JSONSchemaValidator(index_1.Parkings.tsk.name + "DataSource", index_1.Parkings.tsk.datasourceGeoJsonSchema)); this.dataSourceTariffTSK = new datasources_1.DataSource(index_1.Parkings.tsk.name + "DataSource", new datasources_1.FTPProtocolStrategy(this.ftpTSKSettings), new datasources_1.CSVDataTypeStrategy({ fastcsvParams: { delimiter: "\t", headers: true }, subscribe: (json) => json, }), new golemio_validator_1.JSONSchemaValidator(index_1.Parkings.tsk.name + "DataSource", index_1.Parkings.tsk.datasourceTariffJsonSchema)); this.iprTransformation = new IPRParkingTransformation_1.IPRParkingTransformation(); this.tskTariffTransformation = new TSKParkingTariffTransformation_1.TSKParkingTariffTransformation(); this.parkingsLocationModel = new ParkingsLocationRepository_1.ParkingsLocationRepository(); this.parkingsModel = Di_1.ParkingsContainer.resolve(ModuleContainerToken_1.ModuleContainerToken.ParkingsRepository); this.parkingsTariffsModel = Di_1.ParkingsContainer.resolve(ModuleContainerToken_1.ModuleContainerToken.ParkingTariffsRepository); this.parkingTariffRelationsRepository = Di_1.ParkingsContainer.resolve(ModuleContainerToken_1.ModuleContainerToken.ParkingTariffRelationsRepository); this.parkingPaymentRepository = Di_1.ParkingsContainer.resolve(ModuleContainerToken_1.ModuleContainerToken.ParkingPaymentsRepository); this.parkingsBusinessErrorsRepository = Di_1.ParkingsContainer.resolve(ModuleContainerToken_1.ModuleContainerToken.ParkingsBusinessErrorsRepository); this.tskParkingFilter = new TskParkingFilter_1.TskParkingFilter(); } async transformTskData(currentDate, dataTSK) { const tskTransformation = new TSKParkingTransformation_1.TSKParkingTransformation(currentDate); return await tskTransformation.transform(dataTSK); } async transformTskRelationsData(currentDate, dataTSK) { const tskTransformation = new TSKParkingTransformation_1.TSKParkingTransformation(currentDate); return tskTransformation.transformParkingTariffsRelation(dataTSK); } checkBusinessRules(dataRecords) { const tariffChecker = TariffCheckerFactory_1.default.get(TariffCheckerFactory_1.TariffCheckerEnum.TSK); const checkedTariffs = dataRecords?.map((tariff) => { return { checkerResult: tariffChecker.isTariffValid({ cTariff: +tariff["CTARIF"], pricePerHour: +tariff["PricePerHour"], maxParkingTime: +tariff["MaxParkingTime"], maxPrice: +tariff["MaxPrice"], minPrice: +tariff["MinPrice"], }), tariff: tariff, }; }); const listOfInvalidTariffIds = checkedTariffs .filter((checkedTariff) => !checkedTariff.checkerResult.isValid) .map((checkedTariff) => checkedTariff.tariff["CTARIF"]); const validTariffs = dataRecords.filter((tariff) => !listOfInvalidTariffIds.includes(tariff["CTARIF"])); const invalidResults = checkedTariffs.map((checkedTariff) => checkedTariff.checkerResult).filter((element) => !element.isValid); return { validTariffs, invalidResults }; } async saveBusinessErrors(invalidResults) { const businessErrors = invalidResults.map((result) => { return { identifier: (0, uuid_by_string_1.default)(`${result.failedInput?.cTariff}`), provider: "tsk", record_date: (0, helpers_1.dateTime)(new Date()).format("yyyy-LL-dd"), type: "tariff", detail: result.failedInput, }; }); if (businessErrors.length > 0) { await this.parkingsBusinessErrorsRepository.bulkSave(businessErrors); } } } exports.SaveParkingZonesPrague = SaveParkingZonesPrague; //# sourceMappingURL=SaveParkingZonesPrague.js.map