@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.
Files changed (71) hide show
  1. package/db/example/01_sql_dump.sql +1 -1
  2. package/db/example/04_tsk_parking_v2.sql +2 -2
  3. package/db/example/08_isphk_data.sql +0 -1
  4. package/db/migrations/postgresql/20240402115132-parking-machines-source-id.js +53 -0
  5. package/db/migrations/postgresql/sqls/20240402115132-parking-machines-source-id-down.sql +2 -0
  6. package/db/migrations/postgresql/sqls/20240402115132-parking-machines-source-id-up.sql +3 -0
  7. package/dist/integration-engine/datasources/osm/OsmParkingMachinesDataSource.d.ts +9 -0
  8. package/dist/integration-engine/datasources/osm/OsmParkingMachinesDataSource.js +53 -0
  9. package/dist/integration-engine/datasources/osm/OsmParkingMachinesDataSource.js.map +1 -0
  10. package/dist/integration-engine/datasources/parkomats/ParkomatsDataSource.d.ts +8 -0
  11. package/dist/integration-engine/datasources/parkomats/ParkomatsDataSource.js +53 -0
  12. package/dist/integration-engine/datasources/parkomats/ParkomatsDataSource.js.map +1 -0
  13. package/dist/integration-engine/index.d.ts +4 -2
  14. package/dist/integration-engine/index.js +11 -2
  15. package/dist/integration-engine/index.js.map +1 -1
  16. package/dist/integration-engine/ioc/Di.js +12 -0
  17. package/dist/integration-engine/ioc/Di.js.map +1 -1
  18. package/dist/integration-engine/ioc/ModuleContainerToken.d.ts +6 -0
  19. package/dist/integration-engine/ioc/ModuleContainerToken.js +8 -0
  20. package/dist/integration-engine/ioc/ModuleContainerToken.js.map +1 -1
  21. package/dist/integration-engine/queueDefinitions.js +0 -17
  22. package/dist/integration-engine/queueDefinitions.js.map +1 -1
  23. package/dist/integration-engine/repositories/ParkingMachinesRepository.js +3 -19
  24. package/dist/integration-engine/repositories/ParkingMachinesRepository.js.map +1 -1
  25. package/dist/integration-engine/repositories/ParkomatsRepository.d.ts +4 -0
  26. package/dist/integration-engine/repositories/ParkomatsRepository.js +19 -0
  27. package/dist/integration-engine/repositories/ParkomatsRepository.js.map +1 -0
  28. package/dist/integration-engine/transformations/ParkomatsTransformation.d.ts +3 -1
  29. package/dist/integration-engine/transformations/ParkomatsTransformation.js.map +1 -1
  30. package/dist/integration-engine/transformations/TskParkingMachinesTransformation.js +4 -2
  31. package/dist/integration-engine/transformations/TskParkingMachinesTransformation.js.map +1 -1
  32. package/dist/integration-engine/transformations/osm/OsmParkingMachinesTransformation.d.ts +10 -0
  33. package/dist/integration-engine/transformations/osm/OsmParkingMachinesTransformation.js +26 -0
  34. package/dist/integration-engine/transformations/osm/OsmParkingMachinesTransformation.js.map +1 -0
  35. package/dist/integration-engine/workers/NewParkingsWorker.js +1 -0
  36. package/dist/integration-engine/workers/NewParkingsWorker.js.map +1 -1
  37. package/dist/integration-engine/workers/ParkomatsWorker.d.ts +6 -0
  38. package/dist/integration-engine/workers/ParkomatsWorker.js +19 -0
  39. package/dist/integration-engine/workers/ParkomatsWorker.js.map +1 -0
  40. package/dist/integration-engine/workers/schemas/ParkomatSchema.d.ts +8 -0
  41. package/dist/integration-engine/workers/schemas/ParkomatSchema.js +27 -0
  42. package/dist/integration-engine/workers/schemas/ParkomatSchema.js.map +1 -0
  43. package/dist/integration-engine/workers/tasks/RefreshDataInDbTask.d.ts +17 -0
  44. package/dist/integration-engine/workers/tasks/RefreshDataInDbTask.js +76 -0
  45. package/dist/integration-engine/workers/tasks/RefreshDataInDbTask.js.map +1 -0
  46. package/dist/integration-engine/workers/tasks/SaveOsmParkingMachinesTask.d.ts +12 -0
  47. package/dist/integration-engine/workers/tasks/SaveOsmParkingMachinesTask.js +62 -0
  48. package/dist/integration-engine/workers/tasks/SaveOsmParkingMachinesTask.js.map +1 -0
  49. package/dist/output-gateway/routers/v3/V3ParkingMachinesRouter.js +1 -1
  50. package/dist/output-gateway/routers/v3/V3ParkingMachinesRouter.js.map +1 -1
  51. package/dist/output-gateway/transformations/v3/ParkingMachinesDtoTransformation.js +1 -1
  52. package/dist/output-gateway/transformations/v3/ParkingMachinesDtoTransformation.js.map +1 -1
  53. package/dist/schema-definitions/datasources/osm/FeatureCollectionSchemaGenerator.d.ts +28 -0
  54. package/dist/schema-definitions/datasources/osm/FeatureCollectionSchemaGenerator.js +4 -0
  55. package/dist/schema-definitions/datasources/osm/FeatureCollectionSchemaGenerator.js.map +1 -1
  56. package/dist/schema-definitions/datasources/osm/OsmParkingMachinesSchema.d.ts +3 -0
  57. package/dist/schema-definitions/datasources/osm/OsmParkingMachinesSchema.js +14 -0
  58. package/dist/schema-definitions/datasources/osm/OsmParkingMachinesSchema.js.map +1 -0
  59. package/dist/schema-definitions/datasources/osm/interfaces/IOsmParkingMachinesProperties.d.ts +5 -0
  60. package/dist/schema-definitions/datasources/osm/interfaces/IOsmParkingMachinesProperties.js +3 -0
  61. package/dist/schema-definitions/datasources/osm/interfaces/IOsmParkingMachinesProperties.js.map +1 -0
  62. package/dist/schema-definitions/models/ParkingMachinesModel.d.ts +3 -0
  63. package/dist/schema-definitions/models/ParkingMachinesModel.js +22 -0
  64. package/dist/schema-definitions/models/ParkingMachinesModel.js.map +1 -1
  65. package/dist/schema-definitions/models/interfaces/IParkingMachine.d.ts +3 -2
  66. package/docs/implementation-documentation.md +54 -5
  67. package/docs/openapi-output.yaml +6 -6
  68. package/package.json +2 -2
  69. package/dist/integration-engine/ParkomatsWorker.d.ts +0 -10
  70. package/dist/integration-engine/ParkomatsWorker.js +0 -77
  71. 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
 
@@ -948,9 +948,8 @@ paths:
948
948
  required: true
949
949
  schema:
950
950
  type: string
951
- format: uuid
952
- example: '4521afac-66db-4680-abc5-0006837d977a'
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
- format: uuid
2346
- description: The UUID identifier for the parking machine.
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: The code of the parking machine.
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.9",
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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"}