@golemio/parkings 1.8.9 → 1.8.10-dev.1254677597
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/db/example/01_sql_dump.sql +1 -1
- package/db/example/04_tsk_parking_v2.sql +2 -2
- package/db/example/08_isphk_data.sql +0 -1
- package/db/migrations/postgresql/20240402115132-parking-machines-source-id.js +53 -0
- package/db/migrations/postgresql/sqls/20240402115132-parking-machines-source-id-down.sql +2 -0
- package/db/migrations/postgresql/sqls/20240402115132-parking-machines-source-id-up.sql +3 -0
- package/dist/integration-engine/datasources/osm/OsmParkingMachinesDataSource.d.ts +9 -0
- package/dist/integration-engine/datasources/osm/OsmParkingMachinesDataSource.js +53 -0
- package/dist/integration-engine/datasources/osm/OsmParkingMachinesDataSource.js.map +1 -0
- package/dist/integration-engine/datasources/parkomats/ParkomatsDataSource.d.ts +8 -0
- package/dist/integration-engine/datasources/parkomats/ParkomatsDataSource.js +53 -0
- package/dist/integration-engine/datasources/parkomats/ParkomatsDataSource.js.map +1 -0
- package/dist/integration-engine/index.d.ts +4 -2
- package/dist/integration-engine/index.js +11 -2
- package/dist/integration-engine/index.js.map +1 -1
- package/dist/integration-engine/ioc/Di.js +12 -0
- package/dist/integration-engine/ioc/Di.js.map +1 -1
- package/dist/integration-engine/ioc/ModuleContainerToken.d.ts +6 -0
- package/dist/integration-engine/ioc/ModuleContainerToken.js +8 -0
- package/dist/integration-engine/ioc/ModuleContainerToken.js.map +1 -1
- package/dist/integration-engine/queueDefinitions.js +0 -17
- package/dist/integration-engine/queueDefinitions.js.map +1 -1
- package/dist/integration-engine/repositories/ParkingMachinesRepository.js +3 -19
- package/dist/integration-engine/repositories/ParkingMachinesRepository.js.map +1 -1
- package/dist/integration-engine/repositories/ParkomatsRepository.d.ts +4 -0
- package/dist/integration-engine/repositories/ParkomatsRepository.js +19 -0
- package/dist/integration-engine/repositories/ParkomatsRepository.js.map +1 -0
- package/dist/integration-engine/transformations/ParkomatsTransformation.d.ts +3 -1
- package/dist/integration-engine/transformations/ParkomatsTransformation.js.map +1 -1
- package/dist/integration-engine/transformations/TskParkingMachinesTransformation.js +4 -2
- package/dist/integration-engine/transformations/TskParkingMachinesTransformation.js.map +1 -1
- package/dist/integration-engine/transformations/osm/OsmParkingMachinesTransformation.d.ts +10 -0
- package/dist/integration-engine/transformations/osm/OsmParkingMachinesTransformation.js +26 -0
- package/dist/integration-engine/transformations/osm/OsmParkingMachinesTransformation.js.map +1 -0
- package/dist/integration-engine/workers/NewParkingsWorker.js +1 -0
- package/dist/integration-engine/workers/NewParkingsWorker.js.map +1 -1
- package/dist/integration-engine/workers/ParkomatsWorker.d.ts +6 -0
- package/dist/integration-engine/workers/ParkomatsWorker.js +19 -0
- package/dist/integration-engine/workers/ParkomatsWorker.js.map +1 -0
- package/dist/integration-engine/workers/schemas/ParkomatSchema.d.ts +8 -0
- package/dist/integration-engine/workers/schemas/ParkomatSchema.js +27 -0
- package/dist/integration-engine/workers/schemas/ParkomatSchema.js.map +1 -0
- package/dist/integration-engine/workers/tasks/RefreshDataInDbTask.d.ts +17 -0
- package/dist/integration-engine/workers/tasks/RefreshDataInDbTask.js +76 -0
- package/dist/integration-engine/workers/tasks/RefreshDataInDbTask.js.map +1 -0
- package/dist/integration-engine/workers/tasks/SaveOsmParkingMachinesTask.d.ts +12 -0
- package/dist/integration-engine/workers/tasks/SaveOsmParkingMachinesTask.js +62 -0
- package/dist/integration-engine/workers/tasks/SaveOsmParkingMachinesTask.js.map +1 -0
- package/dist/output-gateway/routers/v3/V3ParkingMachinesRouter.js +1 -1
- package/dist/output-gateway/routers/v3/V3ParkingMachinesRouter.js.map +1 -1
- package/dist/output-gateway/transformations/v3/ParkingMachinesDtoTransformation.js +1 -1
- package/dist/output-gateway/transformations/v3/ParkingMachinesDtoTransformation.js.map +1 -1
- package/dist/schema-definitions/datasources/osm/FeatureCollectionSchemaGenerator.d.ts +28 -0
- package/dist/schema-definitions/datasources/osm/FeatureCollectionSchemaGenerator.js +4 -0
- package/dist/schema-definitions/datasources/osm/FeatureCollectionSchemaGenerator.js.map +1 -1
- package/dist/schema-definitions/datasources/osm/OsmParkingMachinesSchema.d.ts +3 -0
- package/dist/schema-definitions/datasources/osm/OsmParkingMachinesSchema.js +14 -0
- package/dist/schema-definitions/datasources/osm/OsmParkingMachinesSchema.js.map +1 -0
- package/dist/schema-definitions/datasources/osm/interfaces/IOsmParkingMachinesProperties.d.ts +5 -0
- package/dist/schema-definitions/datasources/osm/interfaces/IOsmParkingMachinesProperties.js +3 -0
- package/dist/schema-definitions/datasources/osm/interfaces/IOsmParkingMachinesProperties.js.map +1 -0
- package/dist/schema-definitions/models/ParkingMachinesModel.d.ts +3 -0
- package/dist/schema-definitions/models/ParkingMachinesModel.js +22 -0
- package/dist/schema-definitions/models/ParkingMachinesModel.js.map +1 -1
- package/dist/schema-definitions/models/interfaces/IParkingMachine.d.ts +3 -2
- package/docs/implementation-documentation.md +54 -5
- package/docs/openapi-output.yaml +6 -6
- package/package.json +2 -2
- package/dist/integration-engine/ParkomatsWorker.d.ts +0 -10
- package/dist/integration-engine/ParkomatsWorker.js +0 -77
- package/dist/integration-engine/ParkomatsWorker.js.map +0 -1
|
@@ -33,7 +33,7 @@ Modul slouží k ukládání a poskytování informací o parkování.
|
|
|
33
33
|
|
|
34
34
|
### Data aktivně stahujeme
|
|
35
35
|
|
|
36
|
-
Data stahujeme pravidelně od IPR, TSK, z nového API TSK (značené jako v2) a Smart4City.
|
|
36
|
+
Data stahujeme pravidelně od IPR, TSK, z nového API TSK (značené jako v2) a Smart4City. Dále z blob storage IPT.
|
|
37
37
|
|
|
38
38
|
Pro ZTP parkoviště se z API se stahuje JSON z https://services5.arcgis.com/SBTXIEUGWbqzUecw/arcgis/rest/services/DOP_CUR_DOP_TSK_STANI_ZTP_B/FeatureServer/0/query?outFields=*&where=1%3D1&f=geojson
|
|
39
39
|
Pro parkovací zony se stahuje z https://services5.arcgis.com/SBTXIEUGWbqzUecw/arcgis/rest/services/DOP_CUR_DOP_ZPS_USEKY_P/FeatureServer/0/query?outFields=*&where=1%3D1&f=geojson
|
|
@@ -43,6 +43,7 @@ Pro statické (ručně zadané) tarify se stahuje JSON ze zdroje IPT.
|
|
|
43
43
|
Pro statické (ručně vytvořené) polygony placených parkovišť se stahuje GeoJSON ze zdroje IPT.
|
|
44
44
|
|
|
45
45
|
Data o vjezdech do parkovišť se stahují z ručně vytvořeného zdroje IPT.
|
|
46
|
+
Data o parkovacích automatech OSM se stahují z exportovaného zdroje IPT.
|
|
46
47
|
|
|
47
48
|
Data o platbách se stahují z ručně vytvořeného zdroje IPT, nejsou-li součástí púvodního.
|
|
48
49
|
|
|
@@ -243,6 +244,24 @@ Vybraným parkovištím může být nahrazena location za Multipolygon ze zdroje
|
|
|
243
244
|
- dataplatform.parkings.updateSmart4CityLocations
|
|
244
245
|
- dataplatform.parkings.updateSmart4CityMeasurements
|
|
245
246
|
|
|
247
|
+
#### _parkomats_
|
|
248
|
+
- zdroj dat
|
|
249
|
+
- url: `https://apicore.zpspraha.cz/CISICTService/CISICTService.svc/parkingsessionshistory`
|
|
250
|
+
- parametry
|
|
251
|
+
- `from` - nastavujeme na predchozi den 00
|
|
252
|
+
- `to` - nastavujeme na dnesni den v 04
|
|
253
|
+
- poznamka stahujeme data za 28 hodin abychom o zadna data neprisli
|
|
254
|
+
- protokol: http
|
|
255
|
+
- datovy typ: json
|
|
256
|
+
- validacni schema: [parkomatInputSchema](../src/schema-definitions/parkomats/datasources/ParkomatInputSchema.ts)
|
|
257
|
+
- frekvence stahovani:
|
|
258
|
+
- cron definice
|
|
259
|
+
- rabin: `0 04,16 * * *`
|
|
260
|
+
- prod: `0 07,19 * * *`
|
|
261
|
+
- nazev rabbitmq fronty
|
|
262
|
+
- dataplatform.parkomats.refreshDataInDB
|
|
263
|
+
|
|
264
|
+
|
|
246
265
|
## Zpracování dat / transformace
|
|
247
266
|
|
|
248
267
|
Při transformaci dat lokací data obohacujeme o adresu parkoviště, která vychází z centroidu geometrie daného parkoviště a získává se z Photon API metodou `GeocodeApi.getAddressByLatLngFromPhoton` v modulu Core.
|
|
@@ -359,12 +378,23 @@ Vybraným parkovištím může být nahrazena location za Multipolygon ze zdroje
|
|
|
359
378
|
- název: `dataplatform.parkings.saveOsmEntrancesDataTask`
|
|
360
379
|
- bez parametrů
|
|
361
380
|
- datové zdroje
|
|
362
|
-
- Ipt blob storage ručně tvořený zdroj (http)
|
|
381
|
+
- Ipt blob storage ručně tvořený zdroj (http)
|
|
363
382
|
- geojson formát
|
|
364
383
|
- transformace
|
|
365
384
|
- [OsmEntrancesTransformation](../src/integration-engine/transformations/osm/OsmEntrancesTransformation.ts)
|
|
366
385
|
- data modely
|
|
367
|
-
- EntranceModel -> (schéma parkings) `parking_entrances`
|
|
386
|
+
- EntranceModel -> (schéma parkings) `parking_entrances`
|
|
387
|
+
|
|
388
|
+
#### Task _SaveOsmParkingMachinesTask_
|
|
389
|
+
|
|
390
|
+
- vstupní rabbitmq fronta:
|
|
391
|
+
- název: `dataplatform.parkings.saveOsmParkingMachinesTask`
|
|
392
|
+
- bez parametrů
|
|
393
|
+
- datové zdroje:
|
|
394
|
+
- Ipt blob storage exportovaný zdroj (http)
|
|
395
|
+
- geojson formát
|
|
396
|
+
- transformace: [OsmParkingMachinesTransformation](../src/integration-engine/transformations/osm/OsmParkingMachinesTransformation.ts)
|
|
397
|
+
- cílová tabulka: `parkings_machines`
|
|
368
398
|
|
|
369
399
|
#### Task _GenerateIptOictParkingJobsTask_
|
|
370
400
|
|
|
@@ -461,12 +491,12 @@ Vybraným parkovištím může být nahrazena location za Multipolygon ze zdroje
|
|
|
461
491
|
- název: `dataplatform.parkings.saveManualEntrancesDataTask`
|
|
462
492
|
- bez parametrů
|
|
463
493
|
- datové zdroje
|
|
464
|
-
- Ipt blob storage ručně tvořený zdroj (http)
|
|
494
|
+
- Ipt blob storage ručně tvořený zdroj (http)
|
|
465
495
|
- geojson formát
|
|
466
496
|
- transformace
|
|
467
497
|
- [EntrancesManualTransformation](../src/integration-engine/transformations/osm/OsmEntrancesTransformation.ts)
|
|
468
498
|
- data modely
|
|
469
|
-
- EntranceModel -> (schéma parkings) `parking_entrances`
|
|
499
|
+
- EntranceModel -> (schéma parkings) `parking_entrances`
|
|
470
500
|
|
|
471
501
|
### Worker _ParkingsWorker_
|
|
472
502
|
|
|
@@ -565,6 +595,25 @@ Vybraným parkovištím může být nahrazena location za Multipolygon ze zdroje
|
|
|
565
595
|
- ukládá data z queue `saveParkingSourceToDB` do db
|
|
566
596
|
- zdroj je IG přes `ParkingSourcesRouter`
|
|
567
597
|
- transformace není
|
|
598
|
+
-
|
|
599
|
+
|
|
600
|
+
### ParkomatsWorker
|
|
601
|
+
|
|
602
|
+
#### _RefreshDataInDbTask_
|
|
603
|
+
|
|
604
|
+
- vstupní rabbitmq fronta:
|
|
605
|
+
- název: `refreshDataInDB`
|
|
606
|
+
- optional paramtery
|
|
607
|
+
- from
|
|
608
|
+
- to
|
|
609
|
+
- datový zdroj
|
|
610
|
+
- JSON stahovaný z API
|
|
611
|
+
- transformace
|
|
612
|
+
- Mapovani z `IParkomatInput` na `IParkomatDto`
|
|
613
|
+
- data modely
|
|
614
|
+
- `parkomats`
|
|
615
|
+
|
|
616
|
+
|
|
568
617
|
|
|
569
618
|
## Uložení dat
|
|
570
619
|
|
package/docs/openapi-output.yaml
CHANGED
|
@@ -948,9 +948,8 @@ paths:
|
|
|
948
948
|
required: true
|
|
949
949
|
schema:
|
|
950
950
|
type: string
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
description: 'UUID of the parking machine to retrieve'
|
|
951
|
+
example: 'tsk_v2-4521afac-66db-4680-abc5-0006837d977a'
|
|
952
|
+
description: 'ID of the parking machine to retrieve'
|
|
954
953
|
responses:
|
|
955
954
|
'200':
|
|
956
955
|
description: 'Successful response'
|
|
@@ -2342,8 +2341,8 @@ components:
|
|
|
2342
2341
|
properties:
|
|
2343
2342
|
id:
|
|
2344
2343
|
type: string
|
|
2345
|
-
|
|
2346
|
-
description:
|
|
2344
|
+
example: 'tsk_v2-4521afac-66db-4680-abc5-0006837d977a'
|
|
2345
|
+
description: ID of the parking machine. Formatted as primary_source-primary_source_id
|
|
2347
2346
|
primary_source:
|
|
2348
2347
|
type: string
|
|
2349
2348
|
enum:
|
|
@@ -2355,7 +2354,7 @@ components:
|
|
|
2355
2354
|
description: The ID defined by the primary source.
|
|
2356
2355
|
code:
|
|
2357
2356
|
type: string
|
|
2358
|
-
description:
|
|
2357
|
+
description: TSK parking machine identification code.
|
|
2359
2358
|
machine_type:
|
|
2360
2359
|
type: string
|
|
2361
2360
|
enum:
|
|
@@ -2373,6 +2372,7 @@ components:
|
|
|
2373
2372
|
type: string
|
|
2374
2373
|
format: uuid
|
|
2375
2374
|
description: The UUID identifier for the tariff connected to the parking machine.
|
|
2375
|
+
nullable: true
|
|
2376
2376
|
required:
|
|
2377
2377
|
- id
|
|
2378
2378
|
- primary_source
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@golemio/parkings",
|
|
3
|
-
"version": "1.8.
|
|
3
|
+
"version": "1.8.10-dev.1254677597",
|
|
4
4
|
"description": "Golemio Parkings Module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -80,4 +80,4 @@
|
|
|
80
80
|
"@turf/turf": "^6.5.0",
|
|
81
81
|
"uuid-by-string": "^3.0.2"
|
|
82
82
|
}
|
|
83
|
-
}
|
|
83
|
+
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { BaseWorker } from "@golemio/core/dist/integration-engine/workers";
|
|
2
|
-
export declare class ParkomatsWorker extends BaseWorker {
|
|
3
|
-
private dataSource;
|
|
4
|
-
private dataSourceHTTPSettings;
|
|
5
|
-
private transformation;
|
|
6
|
-
private model;
|
|
7
|
-
private dataSourceUrl;
|
|
8
|
-
constructor();
|
|
9
|
-
refreshDataInDB: (msg: any) => Promise<void>;
|
|
10
|
-
}
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.ParkomatsWorker = void 0;
|
|
13
|
-
const _sch_1 = require("../schema-definitions");
|
|
14
|
-
const ParkomatInputSchema_1 = require("../schema-definitions/parkomats/datasources/ParkomatInputSchema");
|
|
15
|
-
const ParkomatDto_1 = require("../schema-definitions/parkomats/models/ParkomatDto");
|
|
16
|
-
const helpers_1 = require("@golemio/core/dist/helpers");
|
|
17
|
-
const config_1 = require("@golemio/core/dist/integration-engine/config");
|
|
18
|
-
const datasources_1 = require("@golemio/core/dist/integration-engine/datasources");
|
|
19
|
-
const HTTPFetchProtocolStrategy_1 = require("@golemio/core/dist/integration-engine/datasources/protocol-strategy/HTTPFetchProtocolStrategy");
|
|
20
|
-
const helpers_2 = require("@golemio/core/dist/integration-engine/helpers");
|
|
21
|
-
const models_1 = require("@golemio/core/dist/integration-engine/models");
|
|
22
|
-
const workers_1 = require("@golemio/core/dist/integration-engine/workers");
|
|
23
|
-
const golemio_validator_1 = require("@golemio/core/dist/shared/golemio-validator");
|
|
24
|
-
const ParkomatsTransformation_1 = require("./transformations/ParkomatsTransformation");
|
|
25
|
-
class ParkomatsWorker extends workers_1.BaseWorker {
|
|
26
|
-
constructor() {
|
|
27
|
-
super();
|
|
28
|
-
this.dataSourceUrl = config_1.config.datasources.TSKParkomats + "/parkingsessions?from=";
|
|
29
|
-
this.refreshDataInDB = (msg) => __awaiter(this, void 0, void 0, function* () {
|
|
30
|
-
let from;
|
|
31
|
-
let to;
|
|
32
|
-
try {
|
|
33
|
-
// setting custom interval from message data
|
|
34
|
-
const customInterval = JSON.parse(msg.content.toString());
|
|
35
|
-
if (customInterval.from && customInterval.to) {
|
|
36
|
-
from = (0, helpers_1.dateTime)(new Date(customInterval.from), { timeZone: "Europe/Prague" });
|
|
37
|
-
to = (0, helpers_1.dateTime)(new Date(customInterval.to), { timeZone: "Europe/Prague" });
|
|
38
|
-
helpers_2.log.debug(`Interval from: ${from} to ${to} was used.`);
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
throw new Error("Interval must contain from and to properties.");
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
catch (err) {
|
|
45
|
-
// setting default interval (normal situation)
|
|
46
|
-
to = (0, helpers_1.dateTime)(new Date()).setTimeZone("Europe/Prague");
|
|
47
|
-
from = to.clone();
|
|
48
|
-
from.subtract(12, "minutes");
|
|
49
|
-
}
|
|
50
|
-
this.dataSourceHTTPSettings.url =
|
|
51
|
-
this.dataSourceUrl + from.format("yyyy-LL-dd'T'HH:mm:ss") + `&to=${to.format("yyyy-LL-dd'T'HH:mm:ss")}`;
|
|
52
|
-
this.dataSource.setProtocolStrategy(new HTTPFetchProtocolStrategy_1.HTTPFetchProtocolStrategy(this.dataSourceHTTPSettings));
|
|
53
|
-
const data = yield this.dataSource.getAll();
|
|
54
|
-
const transformedData = yield this.transformation.transform(data);
|
|
55
|
-
yield this.model.save(transformedData);
|
|
56
|
-
});
|
|
57
|
-
this.dataSourceHTTPSettings = {
|
|
58
|
-
headers: {
|
|
59
|
-
authorization: config_1.config.datasources.TSKParkomatsToken,
|
|
60
|
-
},
|
|
61
|
-
method: "GET",
|
|
62
|
-
// Warning! Url must be filled with required `from` and `to` querystring param
|
|
63
|
-
// if `to` omitted, API returns empty array!
|
|
64
|
-
url: this.dataSourceUrl,
|
|
65
|
-
};
|
|
66
|
-
this.dataSource = new datasources_1.DataSource(_sch_1.Parkomats.name + "DataSource", new HTTPFetchProtocolStrategy_1.HTTPFetchProtocolStrategy(this.dataSourceHTTPSettings), new datasources_1.JSONDataTypeStrategy({ resultsPath: "" }), new golemio_validator_1.JSONSchemaValidator(_sch_1.Parkomats.name + "DataSource", ParkomatInputSchema_1.ParkomatInputSchema));
|
|
67
|
-
this.model = new models_1.PostgresModel(_sch_1.Parkomats.name + "Model", {
|
|
68
|
-
outputSequelizeAttributes: ParkomatDto_1.ParkomatDto.attributeModel,
|
|
69
|
-
pgSchema: _sch_1.Parkomats.pgSchema,
|
|
70
|
-
pgTableName: _sch_1.Parkomats.pgTableName,
|
|
71
|
-
savingType: "insertOrUpdate",
|
|
72
|
-
}, new golemio_validator_1.JSONSchemaValidator(_sch_1.Parkomats.name + "ModelValidator", ParkomatDto_1.ParkomatDto.jsonSchema));
|
|
73
|
-
this.transformation = new ParkomatsTransformation_1.ParkomatsTransformation();
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
exports.ParkomatsWorker = ParkomatsWorker;
|
|
77
|
-
//# sourceMappingURL=ParkomatsWorker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ParkomatsWorker.js","sourceRoot":"","sources":["../../src/integration-engine/ParkomatsWorker.ts"],"names":[],"mappings":"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"}
|