@golemio/parkings 1.3.1 → 1.3.2-dev.764040292

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 (86) hide show
  1. package/db/example/00_clear_test_data.sql +1 -0
  2. package/db/example/03_tsk_measurements_for_legacy_endpoints.sql +35 -0
  3. package/db/example/99_refresh_views.sql +1 -0
  4. package/db/migrations/postgresql/20230127010432-tsk-view-for-legacy-parking-endpoints.js +53 -0
  5. package/db/migrations/postgresql/sqls/20230127010432-tsk-view-for-legacy-parking-endpoints-down.sql +2 -0
  6. package/db/migrations/postgresql/sqls/20230127010432-tsk-view-for-legacy-parking-endpoints-up.sql +40 -0
  7. package/dist/integration-engine/ParkingsWorker.d.ts +5 -9
  8. package/dist/integration-engine/ParkingsWorker.js +44 -176
  9. package/dist/integration-engine/ParkingsWorker.js.map +1 -1
  10. package/dist/integration-engine/data-access/TskAverageOccupancyRepository.d.ts +8 -0
  11. package/dist/integration-engine/data-access/TskAverageOccupancyRepository.js +41 -0
  12. package/dist/integration-engine/data-access/TskAverageOccupancyRepository.js.map +1 -0
  13. package/dist/integration-engine/index.d.ts +0 -1
  14. package/dist/integration-engine/index.js +0 -1
  15. package/dist/integration-engine/index.js.map +1 -1
  16. package/dist/integration-engine/models/ParkingTariffsModel.js +5 -5
  17. package/dist/integration-engine/models/ParkingTariffsModel.js.map +1 -1
  18. package/dist/integration-engine/models/ParkingsModel.js +4 -4
  19. package/dist/integration-engine/models/ParkingsModel.js.map +1 -1
  20. package/dist/integration-engine/queueDefinitions.js +10 -39
  21. package/dist/integration-engine/queueDefinitions.js.map +1 -1
  22. package/dist/output-gateway/data-access/TskAverageOccupancyRepository.d.ts +6 -0
  23. package/dist/output-gateway/data-access/TskAverageOccupancyRepository.js +21 -0
  24. package/dist/output-gateway/data-access/TskAverageOccupancyRepository.js.map +1 -0
  25. package/dist/output-gateway/data-access/TskDistrictsRepository.d.ts +6 -0
  26. package/dist/output-gateway/data-access/TskDistrictsRepository.js +21 -0
  27. package/dist/output-gateway/data-access/TskDistrictsRepository.js.map +1 -0
  28. package/dist/output-gateway/data-access/TskParkingLotsRepository.d.ts +16 -0
  29. package/dist/output-gateway/data-access/TskParkingLotsRepository.js +152 -0
  30. package/dist/output-gateway/data-access/TskParkingLotsRepository.js.map +1 -0
  31. package/dist/output-gateway/data-access/helpers/TskFeatureMapper.d.ts +11 -0
  32. package/dist/output-gateway/data-access/helpers/TskFeatureMapper.js +42 -0
  33. package/dist/output-gateway/data-access/helpers/TskFeatureMapper.js.map +1 -0
  34. package/dist/output-gateway/data-access/interfaces/ITskParkingLotFeature.d.ts +33 -0
  35. package/dist/output-gateway/data-access/interfaces/ITskParkingLotFeature.js +3 -0
  36. package/dist/output-gateway/data-access/interfaces/ITskParkingLotFeature.js.map +1 -0
  37. package/dist/output-gateway/index.d.ts +1 -0
  38. package/dist/output-gateway/index.js +1 -0
  39. package/dist/output-gateway/index.js.map +1 -1
  40. package/dist/output-gateway/models/ParkingsLocationModel.js +2 -2
  41. package/dist/output-gateway/models/ParkingsLocationModel.js.map +1 -1
  42. package/dist/output-gateway/models/ParkingsMeasurementsModels.d.ts +6 -1
  43. package/dist/output-gateway/models/ParkingsMeasurementsModels.js +58 -3
  44. package/dist/output-gateway/models/ParkingsMeasurementsModels.js.map +1 -1
  45. package/dist/output-gateway/models/ParkingsModel.js +9 -9
  46. package/dist/output-gateway/models/ParkingsModel.js.map +1 -1
  47. package/dist/output-gateway/models/ParkingsTariffsModel.js +2 -2
  48. package/dist/output-gateway/models/ParkingsTariffsModel.js.map +1 -1
  49. package/dist/output-gateway/models/helpers/DetailAttributesHelper.js +7 -7
  50. package/dist/output-gateway/models/helpers/DetailAttributesHelper.js.map +1 -1
  51. package/dist/output-gateway/models/index.js +2 -2
  52. package/dist/output-gateway/models/index.js.map +1 -1
  53. package/dist/output-gateway/models/interfaces/TskMeasurementsInterfaces.d.ts +15 -0
  54. package/dist/output-gateway/models/interfaces/TskMeasurementsInterfaces.js +3 -0
  55. package/dist/output-gateway/models/interfaces/TskMeasurementsInterfaces.js.map +1 -0
  56. package/dist/output-gateway/routers/TskParkingLotsLegacyRouter.d.ts +12 -0
  57. package/dist/output-gateway/routers/TskParkingLotsLegacyRouter.js +49 -0
  58. package/dist/output-gateway/routers/TskParkingLotsLegacyRouter.js.map +1 -0
  59. package/dist/schema-definitions/Parkomats.d.ts +23 -23
  60. package/dist/schema-definitions/index.d.ts +129 -140
  61. package/dist/schema-definitions/index.js +29 -79
  62. package/dist/schema-definitions/index.js.map +1 -1
  63. package/dist/schema-definitions/models/TskAverageOccupancyModel.d.ts +8 -0
  64. package/dist/schema-definitions/models/TskAverageOccupancyModel.js +16 -0
  65. package/dist/schema-definitions/models/TskAverageOccupancyModel.js.map +1 -0
  66. package/dist/schema-definitions/models/TskDistrictsModel.d.ts +8 -0
  67. package/dist/schema-definitions/models/TskDistrictsModel.js +16 -0
  68. package/dist/schema-definitions/models/TskDistrictsModel.js.map +1 -0
  69. package/dist/schema-definitions/models/index.d.ts +2 -0
  70. package/dist/schema-definitions/models/index.js +19 -0
  71. package/dist/schema-definitions/models/index.js.map +1 -0
  72. package/dist/schema-definitions/models/interfaces/ITskAverageOccupancyModel.d.ts +7 -0
  73. package/dist/schema-definitions/models/interfaces/ITskAverageOccupancyModel.js +3 -0
  74. package/dist/schema-definitions/models/interfaces/ITskAverageOccupancyModel.js.map +1 -0
  75. package/dist/schema-definitions/models/interfaces/ITskDistrictsModel.d.ts +4 -0
  76. package/dist/schema-definitions/models/interfaces/ITskDistrictsModel.js +3 -0
  77. package/dist/schema-definitions/models/interfaces/ITskDistrictsModel.js.map +1 -0
  78. package/docs/implementation-documentation.md +28 -15
  79. package/package.json +3 -6
  80. package/db/example/mongo_data/dataplatform/parkings.bson +0 -0
  81. package/db/example/mongo_data/dataplatform/parkings.metadata.json +0 -1
  82. package/db/example/mongo_data/dataplatform/parkings_history.bson +0 -0
  83. package/db/example/mongo_data/dataplatform/parkings_history.metadata.json +0 -1
  84. package/dist/integration-engine/ParkingsTransformation.d.ts +0 -9
  85. package/dist/integration-engine/ParkingsTransformation.js +0 -105
  86. package/dist/integration-engine/ParkingsTransformation.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ITskAverageOccupancyModel.js","sourceRoot":"","sources":["../../../../src/schema-definitions/models/interfaces/ITskAverageOccupancyModel.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ export interface ITskDistrictsModel {
2
+ source_id: string;
3
+ district?: string;
4
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=ITskDistrictsModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ITskDistrictsModel.js","sourceRoot":"","sources":["../../../../src/schema-definitions/models/interfaces/ITskDistrictsModel.ts"],"names":[],"mappings":""}
@@ -244,21 +244,6 @@ Parkoviště, která nemají tarif (je null), mohou dostat tarif ze statického
244
244
  - parkingsModel -> (schéma public) `parkings`
245
245
  - parkingTariffsmodel -> (schéma public) `parkings_tariffs`
246
246
 
247
- ### Legacy mongo modely
248
-
249
- **CronJob and Worker method refreshDataInDB**
250
-
251
- `cron.dataplatform.parkings.refreshDataInDB` ("`0 */5 * * * *`" Dev a Prod)
252
-
253
- Datasource TSKParkings, Transformovaná data jsou uložena v tabulce `parkings.parkings`
254
-
255
- Na základě dat metoda generuje 3 události RabbitMQ:
256
-
257
- - RabbitMQ send Message `saveDataToHistory`
258
- - RabbitMQ send Message `updateAddressAndDistrict`
259
- - RabbitMQ send Message `updateAverageOccupancy`
260
-
261
-
262
247
  ## Uložení dat
263
248
 
264
249
  - typ databáze
@@ -316,3 +301,31 @@ Na základě dat metoda generuje 3 události RabbitMQ:
316
301
  - implementováno dodatečně
317
302
  - response header (`Link`) obsahuje metadata k předchozí a následující stránce
318
303
  - implementována možnost dotazování pomocí parametrů `limit` a `offset`
304
+
305
+ #### _/parkings_
306
+
307
+ #### _/parkings/:id_
308
+
309
+ _:warning: Deprecated, vyžijte /parking nebo /parking/detail_
310
+
311
+ - zdrojové tabulky
312
+ - parkings
313
+ - parkings_measurements_actual
314
+ - v_tsk_districts
315
+ - parkings
316
+ - common.citydistricts
317
+ - v_tsk_average_occupancy
318
+ - parkings_measurements_part
319
+ - implementováno dodatečně
320
+ - zpětně kompatibilní s Mongo GeoJSON routerem
321
+ - navrácí pouze `tsk` data
322
+
323
+ #### _/parkings/history_
324
+
325
+ _:warning: Deprecated, využijte /parking/measurements_
326
+
327
+ - zdrojové tabulky
328
+ - parkings_measurements_part
329
+ - implementováno dodatečně
330
+ - zpětně kompatibilní s Mongo GeoJSON history routerem
331
+ - navrácí pouze `tsk` data
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@golemio/parkings",
3
- "version": "1.3.1",
3
+ "version": "1.3.2-dev.764040292",
4
4
  "description": "Golemio Parkings Module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -31,10 +31,8 @@
31
31
  "devDependencies": {
32
32
  "@commitlint/cli": "^11.0.0",
33
33
  "@commitlint/config-conventional": "^11.0.0",
34
- "@golemio/city-districts": "1.0.5",
35
34
  "@golemio/cli": "1.3.3",
36
35
  "@golemio/core": "1.3.0",
37
- "@golemio/db-common": "1.0.2",
38
36
  "@golemio/eslint-config": "^1.1.0",
39
37
  "@ovos-media/ts-transform-paths": "^1.7.18-1",
40
38
  "@types/chai": "4.2.3",
@@ -66,11 +64,10 @@
66
64
  "typescript": "4.7.2"
67
65
  },
68
66
  "peerDependencies": {
69
- "@golemio/city-districts": "^1.0.0",
70
- "@golemio/core": "^1.1.1"
67
+ "@golemio/core": "~1.0"
71
68
  },
72
69
  "dependencies": {
73
70
  "@turf/turf": "^6.5.0",
74
71
  "uuid-by-string": "^3.0.2"
75
72
  }
76
- }
73
+ }
@@ -1 +0,0 @@
1
- {"options":{},"indexes":[{"v":2,"key":{"_id":1},"name":"_id_","ns":"dataplatform.parkings"},{"v":2,"key":{"properties.id":1},"name":"properties.id_1","ns":"dataplatform.parkings"},{"v":2,"key":{"geometry":"2dsphere"},"name":"geometry_2dsphere","ns":"dataplatform.parkings","2dsphereIndexVersion":3}],"uuid":"1287505494814388928cce8449194875"}
@@ -1 +0,0 @@
1
- {"options":{},"indexes":[{"v":2,"key":{"_id":1},"name":"_id_","ns":"dataplatform.parkings_history"},{"v":2,"key":{"id":1},"name":"id_1","ns":"dataplatform.parkings_history"},{"v":2,"key":{"updated_at":-1},"name":"updated_at_-1","ns":"dataplatform.parkings_history"}],"uuid":"3e7132cbd2874a4da7cc1251017758ce"}
@@ -1,9 +0,0 @@
1
- import { BaseTransformation, ITransformation } from "@golemio/core/dist/integration-engine/transformations";
2
- export declare class ParkingsTransformation extends BaseTransformation implements ITransformation {
3
- name: string;
4
- private transformationDate;
5
- constructor(transformationDate: Date);
6
- protected transformElement: (element: any) => Promise<any>;
7
- protected transformHistoryElement: (element: any) => Promise<any>;
8
- private getMPLAPaymentShortName;
9
- }
@@ -1,105 +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.ParkingsTransformation = void 0;
13
- const transformations_1 = require("@golemio/core/dist/integration-engine/transformations");
14
- const config_1 = require("@golemio/core/dist/integration-engine/config");
15
- const index_1 = require("../schema-definitions/index");
16
- class ParkingsTransformation extends transformations_1.BaseTransformation {
17
- constructor(transformationDate) {
18
- super();
19
- this.transformElement = (element) => __awaiter(this, void 0, void 0, function* () {
20
- const res = {
21
- geometry: {
22
- coordinates: [parseFloat(element.lng), parseFloat(element.lat)],
23
- type: "Point",
24
- },
25
- properties: {
26
- id: element.id,
27
- last_updated: !isNaN(parseInt(element.lastUpdated, 10)) ? parseInt(element.lastUpdated, 10) : null,
28
- name: element.name,
29
- num_of_free_places: !isNaN(parseInt(element.numOfFreePlaces, 10)) ? parseInt(element.numOfFreePlaces, 10) : null,
30
- num_of_taken_places: !isNaN(parseInt(element.numOfTakenPlaces, 10))
31
- ? parseInt(element.numOfTakenPlaces, 10)
32
- : null,
33
- parking_type: element.pr
34
- ? { description: "P+R parkoviště", id: 1 }
35
- : { description: "placené parkoviště", id: 2 },
36
- payment_link: `${config_1.config.PARKINGS_PAYMENT_URL}?shortname=${this.getMPLAPaymentShortName(element.id)}`,
37
- payment_shortname: this.getMPLAPaymentShortName(element.id),
38
- total_num_of_places: !isNaN(parseInt(element.totalNumOfPlaces, 10))
39
- ? parseInt(element.totalNumOfPlaces, 10)
40
- : null,
41
- date_modified: this.transformationDate.getTime(),
42
- },
43
- type: "Feature",
44
- };
45
- if (!res.properties.payment_shortname) {
46
- delete res.properties.payment_link;
47
- delete res.properties.payment_shortname;
48
- }
49
- return res;
50
- });
51
- this.transformHistoryElement = (element) => __awaiter(this, void 0, void 0, function* () {
52
- const res = {
53
- id: element.properties.id,
54
- last_updated: element.properties.last_updated,
55
- num_of_free_places: element.properties.num_of_free_places,
56
- num_of_taken_places: element.properties.num_of_taken_places,
57
- total_num_of_places: element.properties.total_num_of_places,
58
- updated_at: this.transformationDate.getTime(),
59
- };
60
- if (!res.total_num_of_places) {
61
- // null || undefined || 0
62
- return null;
63
- }
64
- return res;
65
- });
66
- this.getMPLAPaymentShortName = (id) => {
67
- switch (id) {
68
- case 534002:
69
- return "139"; // Holešovice
70
- case 534004:
71
- return "142"; // Rajska Zahrada
72
- case 534007:
73
- return "141"; // Radotín
74
- case 534008:
75
- return "144"; // Zličín 1
76
- case 534009:
77
- return "145"; // Zličín 2
78
- case 534010:
79
- return "143"; // Skalka 2
80
- case 534011:
81
- return "147"; // Černý most
82
- case 534012:
83
- return "143"; // Skalka 1
84
- case 534014:
85
- return "121"; // Ládví
86
- case 534015:
87
- return "122"; // Depo Hostivař
88
- case 534016:
89
- return "123"; // Letňany
90
- case 534017:
91
- return "106"; // Westfield Chodov
92
- case 5340171:
93
- return "106"; // Chodov A
94
- case 5340172:
95
- return "106"; // Chodov E
96
- default:
97
- return null;
98
- }
99
- };
100
- this.name = index_1.Parkings.name;
101
- this.transformationDate = transformationDate;
102
- }
103
- }
104
- exports.ParkingsTransformation = ParkingsTransformation;
105
- //# sourceMappingURL=ParkingsTransformation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ParkingsTransformation.js","sourceRoot":"","sources":["../../src/integration-engine/ParkingsTransformation.ts"],"names":[],"mappings":"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"}