@golemio/pid 3.17.0-rc.1874440776 → 3.17.0-rc.1925436440
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/dist/integration-engine/jis/repositories/JISEventsRepository.js +18 -0
- package/dist/integration-engine/jis/repositories/JISEventsRepository.js.map +1 -1
- package/dist/integration-engine/jis/services/JISEventsDataService.js +3 -1
- package/dist/integration-engine/jis/services/JISEventsDataService.js.map +1 -1
- package/docs/implementation_documentation.md +29 -11
- package/docs/jis/index.md +236 -0
- package/package.json +1 -1
|
@@ -75,6 +75,24 @@ let JISEventsRepository = exports.JISEventsRepository = class JISEventsRepositor
|
|
|
75
75
|
*/
|
|
76
76
|
async upsertAll(data, options) {
|
|
77
77
|
try {
|
|
78
|
+
// single-event update – race condition protection
|
|
79
|
+
if (data.length === 1) {
|
|
80
|
+
const incoming = data[0];
|
|
81
|
+
const existing = await this.sequelizeModel.findByPk(incoming.id, {
|
|
82
|
+
transaction: options?.transaction,
|
|
83
|
+
});
|
|
84
|
+
if (!existing || new Date(incoming.updated_timestamp) > new Date(existing.updated_timestamp)) {
|
|
85
|
+
const [record, created] = await this.sequelizeModel.upsert(incoming, {
|
|
86
|
+
transaction: options?.transaction,
|
|
87
|
+
});
|
|
88
|
+
this.logger.info(`${this.constructor.name}.upsertAll: ${created ? "inserted" : "updated"} single JIS event ID=${incoming.id}`);
|
|
89
|
+
return [record];
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
this.logger.info(`${this.constructor.name}.upsertAll: skipped outdated single JIS event ID=${incoming.id}`);
|
|
93
|
+
return [];
|
|
94
|
+
}
|
|
95
|
+
}
|
|
78
96
|
const upserted = await this.sequelizeModel.bulkCreate(data, {
|
|
79
97
|
updateOnDuplicate: this.getUpdateAttributes(),
|
|
80
98
|
transaction: options?.transaction,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JISEventsRepository.js","sourceRoot":"","sources":["../../../../src/integration-engine/jis/repositories/JISEventsRepository.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"JISEventsRepository.js","sourceRoot":"","sources":["../../../../src/integration-engine/jis/repositories/JISEventsRepository.ts"],"names":[],"mappings":"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"}
|
|
@@ -44,6 +44,7 @@ let JISEventsDataService = exports.JISEventsDataService = class JISEventsDataSer
|
|
|
44
44
|
await transaction.commit();
|
|
45
45
|
}
|
|
46
46
|
else {
|
|
47
|
+
const isSingleUpdate = events.length === 1;
|
|
47
48
|
await this.eventsRepository.upsertAll(events, { transaction });
|
|
48
49
|
await this.eventsRopidGTFSRoutesRepository.upsertAll(eventsRopidGTFSRoutes, { transaction });
|
|
49
50
|
await this.eventsRopidGTFSRoutesRepository.deleteAllLastUpdatedBefore(saveTime, events, {
|
|
@@ -51,7 +52,8 @@ let JISEventsDataService = exports.JISEventsDataService = class JISEventsDataSer
|
|
|
51
52
|
});
|
|
52
53
|
await transaction.commit();
|
|
53
54
|
this.logger.info(`${this.constructor.name}.upsertAll: ${events.length} JIS events and ` +
|
|
54
|
-
`${eventsRopidGTFSRoutes.length} JIS eventsRopidGTFSRoutes were saved`
|
|
55
|
+
`${eventsRopidGTFSRoutes.length} JIS eventsRopidGTFSRoutes were saved ` +
|
|
56
|
+
(isSingleUpdate ? "(single update)" : "(full sync)"));
|
|
55
57
|
}
|
|
56
58
|
}
|
|
57
59
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JISEventsDataService.js","sourceRoot":"","sources":["../../../../src/integration-engine/jis/services/JISEventsDataService.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,gEAAkE;AAClE,6EAA+E;AAC/E,2GAA6G;AAI7G,wEAAqE;AACrE,6EAAwE;AACxE,iEAAwE;AAGjE,IAAM,oBAAoB,kCAA1B,MAAM,oBAAoB;IAC7B,YAEY,gBAAqC,EAErC,+BAAmE,EAC9B,iBAAqC,EAChD,MAAe;QAJzC,qBAAgB,GAAhB,gBAAgB,CAAqB;QAErC,oCAA+B,GAA/B,+BAA+B,CAAoC;QAC9B,sBAAiB,GAAjB,iBAAiB,CAAoB;QAChD,WAAM,GAAN,MAAM,CAAS;QAEjD,aAAa;IACjB,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,SAAS,CAAC,MAAmB,EAAE,qBAAkD;QAC1F,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,CAAC;QAC1D,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,WAAW,EAAE,CAAC;QACnD,MAAM,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;QAE5B,IAAI;YACA,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;gBACrB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,4DAA4D,CAAC,CAAC;gBACvG,MAAM,WAAW,CAAC,MAAM,EAAE,CAAC;aAC9B;iBAAM;gBACH,MAAM,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;gBAC/D,MAAM,IAAI,CAAC,+BAA+B,CAAC,SAAS,CAAC,qBAAqB,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;gBAC7F,MAAM,IAAI,CAAC,+BAA+B,CAAC,0BAA0B,CAAC,QAAQ,EAAE,MAAM,EAAE;oBACpF,WAAW;iBACd,CAAC,CAAC;gBACH,MAAM,WAAW,CAAC,MAAM,EAAE,CAAC;gBAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,CACZ,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,eAAe,MAAM,CAAC,MAAM,kBAAkB;oBAClE,GAAG,qBAAqB,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"JISEventsDataService.js","sourceRoot":"","sources":["../../../../src/integration-engine/jis/services/JISEventsDataService.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,gEAAkE;AAClE,6EAA+E;AAC/E,2GAA6G;AAI7G,wEAAqE;AACrE,6EAAwE;AACxE,iEAAwE;AAGjE,IAAM,oBAAoB,kCAA1B,MAAM,oBAAoB;IAC7B,YAEY,gBAAqC,EAErC,+BAAmE,EAC9B,iBAAqC,EAChD,MAAe;QAJzC,qBAAgB,GAAhB,gBAAgB,CAAqB;QAErC,oCAA+B,GAA/B,+BAA+B,CAAoC;QAC9B,sBAAiB,GAAjB,iBAAiB,CAAoB;QAChD,WAAM,GAAN,MAAM,CAAS;QAEjD,aAAa;IACjB,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,SAAS,CAAC,MAAmB,EAAE,qBAAkD;QAC1F,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,CAAC;QAC1D,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,WAAW,EAAE,CAAC;QACnD,MAAM,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;QAE5B,IAAI;YACA,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;gBACrB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,4DAA4D,CAAC,CAAC;gBACvG,MAAM,WAAW,CAAC,MAAM,EAAE,CAAC;aAC9B;iBAAM;gBACH,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;gBAC3C,MAAM,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;gBAC/D,MAAM,IAAI,CAAC,+BAA+B,CAAC,SAAS,CAAC,qBAAqB,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;gBAC7F,MAAM,IAAI,CAAC,+BAA+B,CAAC,0BAA0B,CAAC,QAAQ,EAAE,MAAM,EAAE;oBACpF,WAAW;iBACd,CAAC,CAAC;gBACH,MAAM,WAAW,CAAC,MAAM,EAAE,CAAC;gBAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,CACZ,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,eAAe,MAAM,CAAC,MAAM,kBAAkB;oBAClE,GAAG,qBAAqB,CAAC,MAAM,wCAAwC;oBACvE,CAAC,cAAc,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,aAAa,CAAC,CAC3D,CAAC;aACL;SACJ;QAAC,OAAO,GAAG,EAAE;YACV,MAAM,WAAW,CAAC,QAAQ,EAAE,CAAC;YAC7B,IAAI,GAAG,YAAY,6BAAY;gBAAE,MAAM,GAAG,CAAC;YAC3C,MAAM,IAAI,6BAAY,CAAC,0CAA0C,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;SAClG;IACL,CAAC;CACJ,CAAA;+BAhDY,oBAAoB;IADhC,IAAA,qBAAU,GAAE;IAGJ,WAAA,IAAA,iBAAM,EAAC,qCAAiB,CAAC,mBAAmB,CAAC,CAAA;IAE7C,WAAA,IAAA,iBAAM,EAAC,qCAAiB,CAAC,kCAAkC,CAAC,CAAA;IAE5D,WAAA,IAAA,iBAAM,EAAC,qBAAS,CAAC,iBAAiB,CAAC,CAAA;IACnC,WAAA,IAAA,iBAAM,EAAC,qBAAS,CAAC,MAAM,CAAC,CAAA;qCAJC,yCAAmB;QAEJ,uEAAkC;GALtE,oBAAoB,CAgDhC"}
|
|
@@ -228,7 +228,11 @@ _:warning: Původním záměrem bylo využití OIS číselníku během zpracová
|
|
|
228
228
|
- validační schéma: [JISEventsJsonSchema](../src/schema-definitions/jis/datasources/JISEventsJsonSchema.ts)
|
|
229
229
|
- příklad vstupnich dat: [eventsDataSourceFixture](../test/integration-engine/jis/fixtures/eventsDataSourceFixture.ts)
|
|
230
230
|
- frekvence stahování
|
|
231
|
-
-
|
|
231
|
+
- cron definice:
|
|
232
|
+
- cron.vehicle-positions.jis.refreshJISEvents
|
|
233
|
+
- rabin `0 */1 * * * *`
|
|
234
|
+
- prod `0 */1 * * * *`
|
|
235
|
+
- data mohou být stažena po manuálním zaslání zprávy do RabbitMQ fronty (primární způsob aktualizace dat je aktivní posílání a cron)
|
|
232
236
|
- název rabbitmq fronty
|
|
233
237
|
- vehicle-positions.jis.fetchJISEvents
|
|
234
238
|
|
|
@@ -244,7 +248,11 @@ _:warning: Původním záměrem bylo využití OIS číselníku během zpracová
|
|
|
244
248
|
- validační schéma: [JISInfotextsJsonSchema](../src/schema-definitions/jis/datasources/JISInfotextsJsonSchema.ts)
|
|
245
249
|
- příklad vstupnich dat: [infotextsDataSourceFixture](../test/integration-engine/jis/fixtures/infotextsDataSourceFixture.ts)
|
|
246
250
|
- frekvence stahování
|
|
247
|
-
-
|
|
251
|
+
- cron definice:
|
|
252
|
+
- cron.vehicle-positions.jis.refreshJISInfotexts
|
|
253
|
+
- rabin `0 */1 * * * *`
|
|
254
|
+
- prod `0 */1 * * * *`
|
|
255
|
+
- data mohou být stažena po manuálním zaslání zprávy do RabbitMQ fronty (primární způsob aktualizace dat je aktivní posílání a cron)
|
|
248
256
|
- název rabbitmq fronty
|
|
249
257
|
- vehicle-positions.jis.fetchJISInfotexts
|
|
250
258
|
|
|
@@ -1140,7 +1148,23 @@ Worker má na starost retenci dat tabulek Azure Table Storage
|
|
|
1140
1148
|
|
|
1141
1149
|
### _JISWorker_
|
|
1142
1150
|
|
|
1143
|
-
Worker má na starost stahování VYMI (JIS) infotextů, jejich transformaci a uložení do databáze
|
|
1151
|
+
Worker má na starost stahování VYMI (JIS) událostí a infotextů, jejich transformaci a uložení do databáze
|
|
1152
|
+
|
|
1153
|
+
#### _task: RefreshJISEventsTask_
|
|
1154
|
+
|
|
1155
|
+
- vstupní rabbitmq fronta
|
|
1156
|
+
- název: vehicle-positions.jis.refreshJISEvents
|
|
1157
|
+
- TTL: 20 sekund
|
|
1158
|
+
- parametry: žádné
|
|
1159
|
+
- závislé fronty (do kterých jsou odesílány zprávy z metody workeru)
|
|
1160
|
+
- žádné
|
|
1161
|
+
- datové zdroje
|
|
1162
|
+
- JIS Events
|
|
1163
|
+
- transformace
|
|
1164
|
+
- [JISEventsTransformation](../src/integration-engine/jis/transformations/JISEventsTransformation.ts)
|
|
1165
|
+
- data modely
|
|
1166
|
+
- JISEventsModel `jis_events`
|
|
1167
|
+
- JISEventsRopidGTFSRoutesModel `jis_events_ropidgtfs_routes`
|
|
1144
1168
|
|
|
1145
1169
|
#### _task: RefreshJISInfotextsTask_
|
|
1146
1170
|
|
|
@@ -1151,15 +1175,9 @@ Worker má na starost stahování VYMI (JIS) infotextů, jejich transformaci a u
|
|
|
1151
1175
|
- závislé fronty (do kterých jsou odesílány zprávy z metody workeru)
|
|
1152
1176
|
- žádné
|
|
1153
1177
|
- datové zdroje
|
|
1154
|
-
- JIS
|
|
1178
|
+
- JIS Infotexts
|
|
1155
1179
|
- transformace
|
|
1156
1180
|
- [JISInfotextsTransformation](../src/integration-engine/jis/transformations/JISInfotextsTransformation.ts)
|
|
1157
|
-
- popis
|
|
1158
|
-
- z Redisu je získán ETag poslední přijaté odpovědi datového zdroje
|
|
1159
|
-
- z datového zdroje jsou podmíněným dotazem s posledním ETagem získána data a metadata
|
|
1160
|
-
- pokud na straně datového zdroje došlo k aktualizaci dat, je provedena transformace
|
|
1161
|
-
- transformovaná data jsou uložena do Postgres a starší záznamy jsou odstraněny
|
|
1162
|
-
- v Redisu je aktualizován poslední přijatý ETag
|
|
1163
1181
|
- data modely
|
|
1164
1182
|
- JISInfotextsModel `jis_infotexts`
|
|
1165
1183
|
- JISInfotextsRopidGTFSStopsModel `jis_infotexts_ropidgtfs_stops`
|
|
@@ -1196,7 +1214,7 @@ Worker má na starost stahování VYMI (JIS) infotextů, jejich transformaci a u
|
|
|
1196
1214
|
- polohová data si uchováváme 24 hodin (30 minut od poslední aktualizace, poté v historických tabulkách)
|
|
1197
1215
|
- popis vozidel si uchováváme 24 hodin
|
|
1198
1216
|
- preset logy si uchováváme 8 hodin
|
|
1199
|
-
- JIS infotexty si uchováváme
|
|
1217
|
+
- JIS události a infotexty si uchováváme neomezeně
|
|
1200
1218
|
|
|
1201
1219
|
## Input API
|
|
1202
1220
|
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
# Dokumentace propisu VYMI (JIS) dat do datové platformy
|
|
2
|
+
|
|
3
|
+
Data událostí a infotextů jsou z aplikace VYMI aktivně posílána (push) do datové platformy Golemio, vždy ihned po změně v datech. Dále existuje možnost pasivního načtení (pull) dat z VYMI do Golemia, které je provedeno po manuální akci vývojáře a slouží například pro případ, že by došlo k výpadku aktivního posílání. Oba způsoby jsou zjednodušeně znázorněny na následujících dvou sekvenčních diagramech a podrobněji popsány v dalších sekcích.
|
|
4
|
+
|
|
5
|
+
Sekvenční diagram znázorňující proces aktivního posílání (push) dat:
|
|
6
|
+
|
|
7
|
+
```mermaid
|
|
8
|
+
sequenceDiagram
|
|
9
|
+
actor user as Uživatel VYMI
|
|
10
|
+
participant vymi as Aplikace VYMI
|
|
11
|
+
participant golemio as Datová platforma Golemio
|
|
12
|
+
|
|
13
|
+
user->>vymi: Změna v datech událostí nebo infotextů
|
|
14
|
+
vymi->>golemio: Aktivní zaslání (push) dat událostí nebo infotextů do Golemia
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Sekvenční diagram znázorňující proces pasivního načítání (pull) dat:
|
|
18
|
+
|
|
19
|
+
```mermaid
|
|
20
|
+
sequenceDiagram
|
|
21
|
+
participant vymi as Aplikace VYMI
|
|
22
|
+
participant golemio as Datová platforma Golemio
|
|
23
|
+
actor developer as Vývojář
|
|
24
|
+
|
|
25
|
+
developer->>golemio: Vyžádání načtení dat událostí nebo infotextů
|
|
26
|
+
golemio->>vymi: Pasivní načtení (pull) dat událostí nebo infotextů z VYMI
|
|
27
|
+
vymi->>golemio: Data událostí nebo infotextů
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Změny dat ve VYMI
|
|
31
|
+
|
|
32
|
+
V rámci aplikace VYMI nejprve uživatel provede na front endu změny událostí nebo infotextů, které front end pošle na REST API back endu a ten je zapíše do VYMI PostgreSQL databáze. Mezi front endem a back endem data projdou ještě přes VYMI Ory Oathkeeper proxy (která za pomoci VYMI Ory Kratos a VYMI Ory Keto služeb zajišťuje autentizaci, respektive autorizaci uživatele).
|
|
33
|
+
|
|
34
|
+
Proces je podrobněji znázorněn na následujícím diagramu (diagram nepopisuje celé VYMI REST API, pouze části nejvíce relevantní pro propisování dat do Golemia; stejně tak jsou vynechány detailnější prvky aplikační struktury).
|
|
35
|
+
|
|
36
|
+
```mermaid
|
|
37
|
+
flowchart LR
|
|
38
|
+
subgraph "VYMI"
|
|
39
|
+
subgraph "VYMI Front End"
|
|
40
|
+
vymi_create_event("`Vytvoření události`");
|
|
41
|
+
vymi_update_event("`Úprava události`");
|
|
42
|
+
vymi_update_event_after_duplicate("`Uložení události po duplikaci`");
|
|
43
|
+
vymi_create_infotext("`Vytvoření infotextu`");
|
|
44
|
+
vymi_update_infotext("`Úprava infotextu`");
|
|
45
|
+
vymi_update_infotext_after_duplicate("`Uložení infotextu po duplikaci`");
|
|
46
|
+
|
|
47
|
+
%% invisible unicode char due to https://github.com/orgs/community/discussions/106690
|
|
48
|
+
vymi_api_post_event["`HTTP POST s Ory Kratos session tokenem na http://api-vymi.golemio.cz/v1/events`"];
|
|
49
|
+
vymi_api_put_event["`HTTP PUT s Ory Kratos session tokenem na http://api-vymi.golemio.cz/v1/events/{eventId}`"];
|
|
50
|
+
vymi_api_post_infotext["`HTTP POST s Ory Kratos session tokenem na http://api-vymi.golemio.cz/v1/events/{eventId}/infotexts`"];
|
|
51
|
+
vymi_api_put_infotext["`HTTP PUT s Ory Kratos session tokenem na http://api-vymi.golemio.cz/v1/events/{eventId}/infotexts/{infotextId}`"];
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
subgraph "VYMI Back End"
|
|
55
|
+
vymi_events_controller_create["`V1EventsController.createEvent`"];
|
|
56
|
+
vymi_events_controller_update["`V1EventsController.updateEvent`"];
|
|
57
|
+
vymi_infotexts_controller_create["`V1EventInfotextsController.createInfotext`"];
|
|
58
|
+
vymi_infotexts_controller_update["`V1EventInfotextsController.updateInfotext`"];
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
vymi_pg[("`VYMI PostgreSQL`")];
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
vymi_create_event --> vymi_api_post_event;
|
|
65
|
+
vymi_update_event --> vymi_api_put_event;
|
|
66
|
+
vymi_update_event_after_duplicate --> vymi_api_put_event;
|
|
67
|
+
vymi_create_infotext --> vymi_api_post_infotext;
|
|
68
|
+
vymi_update_infotext --> vymi_api_put_infotext;
|
|
69
|
+
vymi_update_infotext_after_duplicate --> vymi_api_put_infotext;
|
|
70
|
+
|
|
71
|
+
vymi_api_post_event -- "`Přes VYMI Ory Oathkeeper`" --> vymi_events_controller_create;
|
|
72
|
+
vymi_api_put_event -- "`Přes VYMI Ory Oathkeeper`" --> vymi_events_controller_update;
|
|
73
|
+
vymi_api_post_infotext -- "`Přes VYMI Ory Oathkeeper`" --> vymi_infotexts_controller_create;
|
|
74
|
+
vymi_api_put_infotext -- "`Přes VYMI Ory Oathkeeper`" --> vymi_infotexts_controller_update;
|
|
75
|
+
|
|
76
|
+
vymi_events_controller_create -- "`UPSERT do tabulek vymi-alerts.public.events a vymi-alerts.public.event_routes`" --> vymi_pg;
|
|
77
|
+
vymi_events_controller_update -- "`UPSERT do tabulek vymi-alerts.public.events a vymi-alerts.public.event_routes`" --> vymi_pg;
|
|
78
|
+
vymi_infotexts_controller_create -- "`UPSERT do tabulek vymi-alerts.public.infotexts a vymi-alerts.public.infotext_stops`" --> vymi_pg;
|
|
79
|
+
vymi_infotexts_controller_update -- "`UPSERT do tabulek vymi-alerts.public.infotexts a vymi-alerts.public.infotext_stops`" --> vymi_pg;
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Aktivní posílání (push) dat
|
|
83
|
+
|
|
84
|
+
Po uložení změn událostí a infotextů do VYMI PostgreSQL databáze dojde vždy k aktivnímu poslání (push) "aktuálních" dat z VYMI back end služby do Golemia za pomoci HTTP POST dotazu na Golemio Vehicle Positions (VP) Input Gateway (IG).
|
|
85
|
+
- u událostí se posílá pouze konkrétní nově vytvořená nebo upravená událost, nikoliv celý seznam aktuálních událostí.
|
|
86
|
+
- všechny infotexty, které mají `status` `PUBLISHED`, `visibility` `PUBLIC` a zároveň `active_period_end` je `NULL` nebo >= aktuální čas, neboli lidsky všechny aktivní, budoucí a publikované (ne-draft) infotexty.
|
|
87
|
+
|
|
88
|
+
VP Input Gateway data přijme a zašle do odpovídající RabbitMQ fronty, odkud je převezme VP Integration Engine, který data zapíše do VP PostgreSQL databáze.
|
|
89
|
+
|
|
90
|
+
Proces je podrobněji znázorněn na následujícím diagramu (detailnější prvky aplikační struktury jsou vynechány).
|
|
91
|
+
|
|
92
|
+
```mermaid
|
|
93
|
+
flowchart TB
|
|
94
|
+
subgraph "VYMI"
|
|
95
|
+
subgraph "VYMI Back End"
|
|
96
|
+
vymi_events_controller_create["`V1EventsController.createEvent`"];
|
|
97
|
+
vymi_events_controller_update["`V1EventsController.updateEvent`"];
|
|
98
|
+
vymi_infotexts_controller_create["`V1EventInfotextsController.createInfotext`"];
|
|
99
|
+
vymi_infotexts_controller_update["`V1EventInfotextsController.updateInfotext`"];
|
|
100
|
+
|
|
101
|
+
vymi_get_events["`EventFacade.getFilteredCustomFormatList`"];
|
|
102
|
+
vymi_get_infotexts["`InfotextFacade.getFilteredCustomFormatList`"];
|
|
103
|
+
|
|
104
|
+
%% invisible unicode char due to https://github.com/orgs/community/discussions/106690
|
|
105
|
+
golemio_api_post_events["`HTTPS POST s API klíčem na https://api.golemio.cz/input-gateway/v1/jis/events`"];
|
|
106
|
+
golemio_api_post_infotexts["`HTTPS POST s API klíčem na https://api.golemio.cz/input-gateway/v1/jis/infotexts`"];
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
vymi_pg[("`VYMI PostgreSQL`")];
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
subgraph "Golemio"
|
|
113
|
+
subgraph "Golemio VP Input Gateway"
|
|
114
|
+
golemio_events_controller["`JISEventsController`"];
|
|
115
|
+
golemio_infotexts_controller["`JisInfotextsController`"];
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
subgraph "Golemio RabbitMQ"
|
|
119
|
+
golemio_rabbit_refresh_events["`Fronta vehicle-positions.jis.refreshJISEvents`"];
|
|
120
|
+
golemio_rabbit_refresh_infotexts["`Fronta vehicle-positions.jis.refreshJISInfotexts`"];
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
subgraph "Golemio VP Integration Engine"
|
|
124
|
+
golemio_refresh_events_task["`RefreshJISEventsTask`"];
|
|
125
|
+
golemio_refresh_infotexts_task["`RefreshJISInfotextsTask`"];
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
vp_pg[("`VP PostgreSQL`")];
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
vymi_events_controller_create --> vymi_get_events;
|
|
132
|
+
vymi_events_controller_update --> vymi_get_events;
|
|
133
|
+
vymi_events_controller_update --> vymi_get_infotexts;
|
|
134
|
+
vymi_infotexts_controller_create --> vymi_get_infotexts;
|
|
135
|
+
vymi_infotexts_controller_update --> vymi_get_infotexts;
|
|
136
|
+
|
|
137
|
+
vymi_get_events -- "`SELECT aktuálních událostí z tabulek vehicle-positions.pid.jis_events a vehicle-positions.pid.jis_events_ropidgtfs_routes`" --> vymi_pg;
|
|
138
|
+
vymi_get_infotexts -- "`SELECT aktuálních infotextů z tabulek vehicle-positions.pid.jis_infotexts a vehicle-positions.pid.jis_infotexts_ropidgtfs_stops`" --> vymi_pg;
|
|
139
|
+
|
|
140
|
+
vymi_get_events --> golemio_api_post_events;
|
|
141
|
+
vymi_get_infotexts --> golemio_api_post_infotexts;
|
|
142
|
+
|
|
143
|
+
golemio_api_post_events -- "`Přes Golemio Access Proxy`" --> golemio_events_controller;
|
|
144
|
+
golemio_api_post_infotexts -- "`Přes Golemio Access Proxy`" --> golemio_infotexts_controller;
|
|
145
|
+
|
|
146
|
+
golemio_events_controller --> golemio_rabbit_refresh_events;
|
|
147
|
+
golemio_infotexts_controller --> golemio_rabbit_refresh_infotexts;
|
|
148
|
+
|
|
149
|
+
golemio_rabbit_refresh_events --> golemio_refresh_events_task;
|
|
150
|
+
golemio_rabbit_refresh_infotexts --> golemio_refresh_infotexts_task;
|
|
151
|
+
|
|
152
|
+
golemio_refresh_events_task -- "`UPSERT do tabulek vehicle-positions.pid.jis_events a vehicle-positions.pid.jis_events_ropidgtfs_routes`" --> vp_pg;
|
|
153
|
+
golemio_refresh_infotexts_task -- "`UPSERT do tabulek vehicle-positions.pid.jis_infotexts a vehicle-positions.pid.jis_infotexts_ropidgtfs_stops`" --> vp_pg;
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
Formát zasílaných dat je dále více popsán v implementační dokumentaci ([události](../implementation_documentation.md#jis-events-1), [infotexty](../implementation_documentation.md#jis-infotexts-1)), stejně tak jako odkazy na [Input Gateway OpenAPI](../implementation_documentation.md#input-api) a popis [uložení dat](../implementation_documentation.md#uložení-dat) včetně databázového schema a popisu retence.
|
|
157
|
+
|
|
158
|
+
## Pasivní načítání (pull) dat
|
|
159
|
+
|
|
160
|
+
V případě potřeby (např. nedojde-li kvůli chybě k aktivnímu poslání dat) lze využít pasivní načtení (pull) dat z VYMI REST API do Golemia. Pro spuštění načtení může vývojář zaslat prázdnou zprávu do správné RabbitMQ fronty, kterou zkonzumuje VP Integration Engine a za pomoci HTTP GET dotazu získá data z VYMI back end služby.
|
|
161
|
+
|
|
162
|
+
Kromě manuálního spuštění vývojářem je nyní navíc aktivní cron task, který každou minutu automaticky spouští pasivní načítání dat z VYMI do Golemia. Tento mechanismus zajišťuje vyšší odolnost proti výpadkům v aktivním posílání (push) dat.
|
|
163
|
+
|
|
164
|
+
Při pasivním načítání se z VYMI vždy přenačítají pouze aktuální (aktivní) události a infotexty:
|
|
165
|
+
- všechny události, které mají `status` `PUBLISHED`, a zároveň `updated_at` hodnotu z posledních 24 hodin nebo `active_period_end` je `NULL` nebo >= aktuální čas, neboli lidsky všechny publikované (ne-draft) události, které jsou aktivní nebo byly upraveny v posledním dnu;
|
|
166
|
+
- všechny infotexty, které mají `status` `PUBLISHED`, `visibility` `PUBLIC` a zároveň `active_period_end` je `NULL` nebo >= aktuální čas, neboli lidsky všechny aktivní, budoucí a publikované (ne-draft) infotexty.
|
|
167
|
+
|
|
168
|
+
## Chování databáze v Golemio
|
|
169
|
+
|
|
170
|
+
Události – v Golemio databázi se uchovávají všechny historické i aktuální události. Staré záznamy se nepromazávají.
|
|
171
|
+
|
|
172
|
+
Infotexty – v Golemio databázi se uchovávají pouze aktivní infotexty. Neaktivní se při každém přenačtení promazávají.
|
|
173
|
+
|
|
174
|
+
Proces je podrobněji znázorněn na následujícím diagramu (detailnější prvky aplikační struktury jsou vynechány).
|
|
175
|
+
|
|
176
|
+
```mermaid
|
|
177
|
+
flowchart TB
|
|
178
|
+
subgraph "VYMI"
|
|
179
|
+
subgraph "VYMI Back End"
|
|
180
|
+
vymi_exports_controller_get_events["`V1ExportsController.getEventListInCustomFormat`"];
|
|
181
|
+
vymi_exports_controller_get_infotexts["`V1ExportsController.getInfotextListInCustomFormat`"];
|
|
182
|
+
|
|
183
|
+
vymi_get_events["`EventFacade.getFilteredCustomFormatList`"];
|
|
184
|
+
vymi_get_infotexts["`InfotextFacade.getFilteredCustomFormatList`"];
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
vymi_pg[("`VYMI PostgreSQL`")];
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
subgraph "Golemio"
|
|
191
|
+
subgraph "Golemio RabbitMQ"
|
|
192
|
+
golemio_rabbit_fetch_events["`Fronta vehicle-positions.jis.fetchJISEvents`"];
|
|
193
|
+
golemio_rabbit_fetch_infotexts["`Fronta vehicle-positions.jis.fetchJISInfotexts`"];
|
|
194
|
+
golemio_rabbit_refresh_events["`Fronta vehicle-positions.jis.refreshJISEvents`"];
|
|
195
|
+
golemio_rabbit_refresh_infotexts["`Fronta vehicle-positions.jis.refreshJISInfotexts`"];
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
subgraph "Golemio VP Integration Engine"
|
|
199
|
+
golemio_fetch_events_task["`FetchJISEventsTask`"];
|
|
200
|
+
golemio_fetch_infotexts_task["`FetchJISInfotextsTask`"];
|
|
201
|
+
golemio_refresh_events_task["`RefreshJISEventsTask`"];
|
|
202
|
+
golemio_refresh_infotexts_task["`RefreshJISInfotextsTask`"];
|
|
203
|
+
|
|
204
|
+
%% invisible unicode char due to https://github.com/orgs/community/discussions/106690
|
|
205
|
+
golemio_api_get_events["`HTTPS GET s API klíčem na https://api-vymi.golemio.cz/v1/exports/events/custom-format`"];
|
|
206
|
+
golemio_api_get_infotexts["`HTTPS GET s API klíčem na https://api-vymi.golemio.cz/v1/exports/infotexts/custom-format`"];
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
vp_pg[("`VP PostgreSQL`")];
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
vymi_get_events -- "`SELECT aktuálních událostí z tabulek vehicle-positions.pid.jis_events a vehicle-positions.pid.jis_events_ropidgtfs_routes`" --> vymi_pg;
|
|
213
|
+
vymi_get_infotexts -- "`SELECT aktuálních infotextů z tabulek vehicle-positions.pid.jis_infotexts a vehicle-positions.pid.jis_infotexts_ropidgtfs_stops`" --> vymi_pg;
|
|
214
|
+
|
|
215
|
+
golemio_rabbit_fetch_events --> golemio_fetch_events_task;
|
|
216
|
+
golemio_rabbit_fetch_infotexts --> golemio_fetch_infotexts_task;
|
|
217
|
+
golemio_rabbit_refresh_events --> golemio_refresh_events_task;
|
|
218
|
+
golemio_rabbit_refresh_infotexts --> golemio_refresh_infotexts_task;
|
|
219
|
+
|
|
220
|
+
golemio_fetch_events_task --> golemio_api_get_events;
|
|
221
|
+
golemio_fetch_infotexts_task --> golemio_api_get_infotexts;
|
|
222
|
+
|
|
223
|
+
golemio_api_get_events -- "`Přes VYMI Ory Oathkeeper`" --> vymi_exports_controller_get_events;
|
|
224
|
+
golemio_api_get_infotexts -- "`Přes VYMI Ory Oathkeeper`" --> vymi_exports_controller_get_infotexts;
|
|
225
|
+
|
|
226
|
+
vymi_exports_controller_get_events --> vymi_get_events;
|
|
227
|
+
vymi_exports_controller_get_infotexts --> vymi_get_infotexts;
|
|
228
|
+
|
|
229
|
+
vymi_get_events --> golemio_rabbit_refresh_events;
|
|
230
|
+
vymi_get_infotexts --> golemio_rabbit_refresh_infotexts;
|
|
231
|
+
|
|
232
|
+
golemio_refresh_events_task -- "`UPSERT do tabulek vehicle-positions.pid.jis_events a vehicle-positions.pid.jis_events_ropidgtfs_routes`" --> vp_pg;
|
|
233
|
+
golemio_refresh_infotexts_task -- "`UPSERT do tabulek vehicle-positions.pid.jis_infotexts a vehicle-positions.pid.jis_infotexts_ropidgtfs_stops`" --> vp_pg;
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
Zdroj a formát dat pro aktivní stahování jsou dále více popsány v implementační dokumentaci ([události](../implementation_documentation.md#jis-events), [infotexty](../implementation_documentation.md#jis-infotexts)), stejně tak jako [worker a tasky](../implementation_documentation.md#jisworker) a popis [uložení dat](../implementation_documentation.md#uložení-dat) včetně databázového schema a popisu retence.
|