@golemio/parkings
Version:
Golemio Parkings Module
182 lines • 11.9 kB
JavaScript
"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