@golemio/pid 5.18.1 → 5.18.2-dev.2769428000
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/migrations/postgresql/20260813120000-jis-events-ropidgtfs-routes-route-details.js +49 -0
- package/db/migrations/postgresql/sqls/20260813120000-jis-events-ropidgtfs-routes-route-details-down.sql +2 -0
- package/db/migrations/postgresql/sqls/20260813120000-jis-events-ropidgtfs-routes-route-details-up.sql +2 -0
- package/dist/helpers/jis/interfaces/IJISEventCustomFormatDto.d.ts +2 -3
- package/dist/integration-engine/jis/transformations/JISEventsTransformation.js +2 -1
- package/dist/integration-engine/jis/transformations/JISEventsTransformation.js.map +1 -1
- package/dist/integration-engine/jis/transformations/UpdateEventWebhookTransformation.d.ts +9 -3
- package/dist/integration-engine/jis/transformations/UpdateEventWebhookTransformation.js +1 -0
- package/dist/integration-engine/jis/transformations/UpdateEventWebhookTransformation.js.map +1 -1
- package/dist/integration-engine/jis/workers/tasks/UpdateEventWebhookTask.js +29 -16
- package/dist/integration-engine/jis/workers/tasks/UpdateEventWebhookTask.js.map +1 -1
- package/dist/output-gateway/jis/data-access/JISEventsRepository.d.ts +4 -1
- package/dist/output-gateway/jis/data-access/JISEventsRepository.js +24 -6
- package/dist/output-gateway/jis/data-access/JISEventsRepository.js.map +1 -1
- package/dist/output-gateway/jis/domain/IJISEventsInterfaces.d.ts +9 -0
- package/dist/output-gateway/jis/transformations/JISEventsCustomFormatTransformation.d.ts +8 -2
- package/dist/output-gateway/jis/transformations/JISEventsCustomFormatTransformation.js +22 -6
- package/dist/output-gateway/jis/transformations/JISEventsCustomFormatTransformation.js.map +1 -1
- package/dist/schema-definitions/jis/datasources/JISEventsJsonSchema.js +19 -0
- package/dist/schema-definitions/jis/datasources/JISEventsJsonSchema.js.map +1 -1
- package/dist/schema-definitions/jis/datasources/interfaces/IJISEventRoute.d.ts +7 -0
- package/dist/schema-definitions/jis/models/JISEventsRopidGTFSRoutesModel.d.ts +1 -0
- package/dist/schema-definitions/jis/models/JISEventsRopidGTFSRoutesModel.js +22 -0
- package/dist/schema-definitions/jis/models/JISEventsRopidGTFSRoutesModel.js.map +1 -1
- package/dist/schema-definitions/jis/models/interfaces/IJISEventsRopidGTFSRoutes.d.ts +2 -0
- package/docs/asyncapi.yaml +22 -0
- package/docs/implementation_documentation.md +4 -1
- package/docs/jis/index.md +37 -0
- package/docs/openapi-input.yaml +50 -1
- package/docs/openapi-output.yaml +7 -0
- package/package.json +2 -2
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var dbm;
|
|
4
|
+
var type;
|
|
5
|
+
var seed;
|
|
6
|
+
var fs = require('fs');
|
|
7
|
+
var path = require('path');
|
|
8
|
+
var Promise;
|
|
9
|
+
|
|
10
|
+
exports.setup = function(options, seedLink) {
|
|
11
|
+
dbm = options.dbmigrate;
|
|
12
|
+
type = dbm.dataType;
|
|
13
|
+
seed = seedLink;
|
|
14
|
+
Promise = options.Promise;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
exports.up = function(db) {
|
|
18
|
+
var filePath = path.join(__dirname, 'sqls', '20260813120000-jis-events-ropidgtfs-routes-route-details-up.sql');
|
|
19
|
+
return new Promise( function( resolve, reject ) {
|
|
20
|
+
fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){
|
|
21
|
+
if (err) return reject(err);
|
|
22
|
+
console.log('received data: ' + data);
|
|
23
|
+
|
|
24
|
+
resolve(data);
|
|
25
|
+
});
|
|
26
|
+
})
|
|
27
|
+
.then(function(data) {
|
|
28
|
+
return db.runSql(data);
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
exports.down = function(db) {
|
|
33
|
+
var filePath = path.join(__dirname, 'sqls', '20260813120000-jis-events-ropidgtfs-routes-route-details-down.sql');
|
|
34
|
+
return new Promise( function( resolve, reject ) {
|
|
35
|
+
fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){
|
|
36
|
+
if (err) return reject(err);
|
|
37
|
+
console.log('received data: ' + data);
|
|
38
|
+
|
|
39
|
+
resolve(data);
|
|
40
|
+
});
|
|
41
|
+
})
|
|
42
|
+
.then(function(data) {
|
|
43
|
+
return db.runSql(data);
|
|
44
|
+
});
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
exports._meta = {
|
|
48
|
+
"version": 1
|
|
49
|
+
};
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { IJISEventAttachmentName } from "../../../schema-definitions/jis/datasources/interfaces/IJISEventAttachmentName";
|
|
2
2
|
import { IJISTranslationTextNullable } from "../../../schema-definitions/jis/datasources/interfaces/IJISTranslationTextNullable";
|
|
3
3
|
import { IJISEventTranslationText, IJISTranslationText } from "../../../schema-definitions/jis/models/interfaces";
|
|
4
|
-
import { RouteDto } from "../../../schema-definitions/ropid-gtfs/models/RouteDto";
|
|
5
4
|
export interface IJISEventCustomFormatDto {
|
|
6
5
|
id: string;
|
|
7
6
|
type: string;
|
|
@@ -24,8 +23,9 @@ export interface IJISEventCustomFormatDto {
|
|
|
24
23
|
informed_entity?: {
|
|
25
24
|
routes?: Array<{
|
|
26
25
|
id: string;
|
|
26
|
+
route_id: string;
|
|
27
27
|
route_short_name: string;
|
|
28
|
-
route_long_name: string;
|
|
28
|
+
route_long_name: string | null;
|
|
29
29
|
route_type: number;
|
|
30
30
|
}>;
|
|
31
31
|
} | null;
|
|
@@ -38,4 +38,3 @@ export interface IJISEventCustomFormatAttachment {
|
|
|
38
38
|
url: string;
|
|
39
39
|
name: IJISEventAttachmentName;
|
|
40
40
|
}
|
|
41
|
-
export type IJISEventRouteDto = Pick<RouteDto, "route_long_name" | "route_short_name" | "route_type" | "route_id">;
|
|
@@ -37,9 +37,10 @@ let JISEventsTransformation = class JISEventsTransformation extends AbstractTran
|
|
|
37
37
|
updated_timestamp: new Date(data.last_modified_timestamp),
|
|
38
38
|
deleted_timestamp: data.deleted_at ? new Date(data.deleted_at) : null,
|
|
39
39
|
};
|
|
40
|
-
const eventsRopidGTFSRoutes = data.informed_entity?.routes?.map(({ id }) => ({
|
|
40
|
+
const eventsRopidGTFSRoutes = data.informed_entity?.routes?.map(({ id, route_details }) => ({
|
|
41
41
|
event_id: data.id,
|
|
42
42
|
route_id: id,
|
|
43
|
+
route_details: route_details ?? null,
|
|
43
44
|
})) ?? [];
|
|
44
45
|
return {
|
|
45
46
|
event,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JISEventsTransformation.js","sourceRoot":"","sources":["../../../../src/integration-engine/jis/transformations/JISEventsTransformation.ts"],"names":[],"mappings":";;;;;;;;;AAAA,oFAAyE;AAMzE,6GAA0G;AAC1G,iEAAgE;AASzD,IAAM,uBAAuB,GAA7B,MAAM,uBAAwB,SAAQ,+CAAiD;IAAvF;;QACI,SAAI,GAAG,yBAAyB,CAAC;QAE9B,sBAAiB,GAAG,CAAC,IAAiB,EAAgB,EAAE;YAC9D,MAAM,KAAK,GAAmB;gBAC1B,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,mBAAmB,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;gBACvD,iBAAiB,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;gBACnF,oBAAoB,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;gBACzD,kBAAkB,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;gBACtF,MAAM,EAAE,2CAAoB,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC;gBAC3D,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;gBACvC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;gBACvC,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;gBACzC,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI;gBACrC,iBAAiB,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC;gBACnD,iBAAiB,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC;gBACzD,iBAAiB,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI;aACxE,CAAC;YACF,MAAM,qBAAqB,GACvB,IAAI,CAAC,eAAe,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"JISEventsTransformation.js","sourceRoot":"","sources":["../../../../src/integration-engine/jis/transformations/JISEventsTransformation.ts"],"names":[],"mappings":";;;;;;;;;AAAA,oFAAyE;AAMzE,6GAA0G;AAC1G,iEAAgE;AASzD,IAAM,uBAAuB,GAA7B,MAAM,uBAAwB,SAAQ,+CAAiD;IAAvF;;QACI,SAAI,GAAG,yBAAyB,CAAC;QAE9B,sBAAiB,GAAG,CAAC,IAAiB,EAAgB,EAAE;YAC9D,MAAM,KAAK,GAAmB;gBAC1B,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,mBAAmB,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;gBACvD,iBAAiB,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;gBACnF,oBAAoB,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;gBACzD,kBAAkB,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;gBACtF,MAAM,EAAE,2CAAoB,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC;gBAC3D,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;gBACvC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;gBACvC,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;gBACzC,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI;gBACrC,iBAAiB,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC;gBACnD,iBAAiB,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC;gBACzD,iBAAiB,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI;aACxE,CAAC;YACF,MAAM,qBAAqB,GACvB,IAAI,CAAC,eAAe,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC1D,QAAQ,EAAE,IAAI,CAAC,EAAE;gBACjB,QAAQ,EAAE,EAAE;gBACZ,aAAa,EAAE,aAAa,IAAI,IAAI;aACvC,CAAC,CAAC,IAAI,EAAE,CAAC;YACd,OAAO;gBACH,KAAK;gBACL,qBAAqB;aACxB,CAAC;QACN,CAAC,CAAC;IACN,CAAC;CAAA,CAAA;AArCY,0DAAuB;kCAAvB,uBAAuB;IADnC,IAAA,qBAAU,GAAE;GACA,uBAAuB,CAqCnC"}
|
|
@@ -1,16 +1,22 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { IJISEventCustomFormatDto } from "../../../helpers/jis/interfaces/IJISEventCustomFormatDto";
|
|
2
2
|
import { IJISEvent } from "../../../schema-definitions/jis/datasources/interfaces";
|
|
3
3
|
import { AbstractTransformation } from "@golemio/core/dist/helpers/transformation/AbstractTransformation";
|
|
4
|
+
export type UpdateEventWebhookRouteInput = {
|
|
5
|
+
route_id: string;
|
|
6
|
+
route_short_name: string;
|
|
7
|
+
route_long_name: string | null;
|
|
8
|
+
route_type: number;
|
|
9
|
+
};
|
|
4
10
|
export declare class UpdateEventWebhookTransformation extends AbstractTransformation<{
|
|
5
11
|
event: IJISEvent;
|
|
6
|
-
routes:
|
|
12
|
+
routes: UpdateEventWebhookRouteInput[];
|
|
7
13
|
}, IJISEventCustomFormatDto & {
|
|
8
14
|
deleted_timestamp: string | null;
|
|
9
15
|
}> {
|
|
10
16
|
name: string;
|
|
11
17
|
protected transformInternal: ({ event, routes, }: {
|
|
12
18
|
event: IJISEvent;
|
|
13
|
-
routes:
|
|
19
|
+
routes: UpdateEventWebhookRouteInput[];
|
|
14
20
|
}) => IJISEventCustomFormatDto & {
|
|
15
21
|
deleted_timestamp: string | null;
|
|
16
22
|
};
|
|
@@ -42,6 +42,7 @@ let UpdateEventWebhookTransformation = class UpdateEventWebhookTransformation ex
|
|
|
42
42
|
informed_entity: {
|
|
43
43
|
routes: routes.map((r) => ({
|
|
44
44
|
id: r.route_id,
|
|
45
|
+
route_id: r.route_id,
|
|
45
46
|
route_long_name: r.route_long_name,
|
|
46
47
|
route_short_name: r.route_short_name,
|
|
47
48
|
route_type: r.route_type,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UpdateEventWebhookTransformation.js","sourceRoot":"","sources":["../../../../src/integration-engine/jis/transformations/UpdateEventWebhookTransformation.ts"],"names":[],"mappings":";;;;;;;;;
|
|
1
|
+
{"version":3,"file":"UpdateEventWebhookTransformation.js","sourceRoot":"","sources":["../../../../src/integration-engine/jis/transformations/UpdateEventWebhookTransformation.ts"],"names":[],"mappings":"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"}
|
|
@@ -83,21 +83,27 @@ let UpdateEventWebhookTask = class UpdateEventWebhookTask extends AbstractTaskJs
|
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
85
|
async fillMissingDataAndTransform(events) {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
86
|
+
// snapshot-first: a GTFS lookup is needed for routes without route_details, and as a
|
|
87
|
+
// fallback for routes whose route_details.route_id doesn't match the reported id.
|
|
88
|
+
const routeIdsMissingSnapshot = Array.from(new Set(events.flatMap((event) => event.informed_entity?.routes
|
|
89
|
+
?.filter((route) => !route.route_details || route.route_details.route_id !== route.id)
|
|
90
|
+
.map((route) => route.id) || [])));
|
|
91
|
+
let routeRecords = [];
|
|
92
|
+
if (routeIdsMissingSnapshot.length > 0) {
|
|
93
|
+
try {
|
|
94
|
+
routeRecords = await this.routesRepository["sequelizeModel"].findAll({
|
|
95
|
+
where: {
|
|
96
|
+
route_id: { [sequelize_1.Op.in]: routeIdsMissingSnapshot },
|
|
97
|
+
},
|
|
98
|
+
attributes: ["route_short_name", "route_long_name", "route_type", "route_id"],
|
|
99
|
+
raw: true,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
if (err instanceof golemio_errors_1.GeneralError)
|
|
104
|
+
throw err;
|
|
105
|
+
throw new golemio_errors_1.GeneralError(`Error while getting route details from DB`, this.constructor.name, err);
|
|
106
|
+
}
|
|
101
107
|
}
|
|
102
108
|
const routeMap = new Map();
|
|
103
109
|
for (const route of routeRecords) {
|
|
@@ -106,7 +112,14 @@ let UpdateEventWebhookTask = class UpdateEventWebhookTask extends AbstractTaskJs
|
|
|
106
112
|
const result = events.map((event) => {
|
|
107
113
|
const routes = [];
|
|
108
114
|
for (const r of event.informed_entity?.routes || []) {
|
|
109
|
-
const routeData =
|
|
115
|
+
const routeData = r.route_details && r.route_details.route_id === r.id
|
|
116
|
+
? {
|
|
117
|
+
route_id: r.route_details.route_id,
|
|
118
|
+
route_short_name: r.route_details.route_short_name,
|
|
119
|
+
route_long_name: r.route_details.route_long_name,
|
|
120
|
+
route_type: r.route_details.route_type,
|
|
121
|
+
}
|
|
122
|
+
: routeMap.get(r.id);
|
|
110
123
|
if (routeData) {
|
|
111
124
|
routes.push({
|
|
112
125
|
route_id: routeData.route_id,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UpdateEventWebhookTask.js","sourceRoot":"","sources":["../../../../../src/integration-engine/jis/workers/tasks/UpdateEventWebhookTask.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,yGAAiG;AAKjG,wEAAqE;AACrE,6IAA0I;AAE1I,iHAA8G;AAC9G,6EAAwE;AACxE,mFAAkF;AAClF,mEAAyD;AACzD,iEAAwE;AACxE,mEAAgE;AAChE,
|
|
1
|
+
{"version":3,"file":"UpdateEventWebhookTask.js","sourceRoot":"","sources":["../../../../../src/integration-engine/jis/workers/tasks/UpdateEventWebhookTask.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ import { JSONSchemaValidator } from "@golemio/core/dist/shared/golemio-validator
|
|
|
6
6
|
import { ModelStatic } from "@golemio/core/dist/shared/sequelize";
|
|
7
7
|
import { JISEventsRopidGTFSRoutesRepository } from "./JISEventsRopidGTFSRoutesRepository";
|
|
8
8
|
import { RopidGTFSRoutesRepository } from "./RopidGTFSRoutesRepository";
|
|
9
|
+
import { IJISEventRouteWithGtfs } from "../domain/IJISEventsInterfaces";
|
|
9
10
|
export declare class JISEventsRepository extends AbstractValidatableRepository {
|
|
10
11
|
private eventsRopidGTFSRoutesRepository;
|
|
11
12
|
private ropidGTFSRoutesRepository;
|
|
@@ -14,6 +15,8 @@ export declare class JISEventsRepository extends AbstractValidatableRepository {
|
|
|
14
15
|
tableName: string;
|
|
15
16
|
sequelizeModel: ModelStatic<JISEventsModel>;
|
|
16
17
|
constructor(connector: IDatabaseConnector, logger: ILogger, eventsRopidGTFSRoutesRepository: JISEventsRopidGTFSRoutesRepository, ropidGTFSRoutesRepository: RopidGTFSRoutesRepository);
|
|
17
|
-
getAllForCustomFormat: (organizationNames?: string[], displayPeriodStart?: string, displayPeriodEnd?: string, type?: string) => Promise<JISEventsModel
|
|
18
|
+
getAllForCustomFormat: (organizationNames?: string[], displayPeriodStart?: string, displayPeriodEnd?: string, type?: string) => Promise<Array<JISEventsModel & {
|
|
19
|
+
routes: IJISEventRouteWithGtfs[];
|
|
20
|
+
}>>;
|
|
18
21
|
private buildWhereForCustomFormat;
|
|
19
22
|
}
|
|
@@ -34,10 +34,20 @@ let JISEventsRepository = class JISEventsRepository extends AbstractValidatableR
|
|
|
34
34
|
this.getAllForCustomFormat = async (organizationNames, displayPeriodStart, displayPeriodEnd, type) => {
|
|
35
35
|
try {
|
|
36
36
|
const where = this.buildWhereForCustomFormat(organizationNames, displayPeriodStart, displayPeriodEnd, type);
|
|
37
|
-
return await this.sequelizeModel.findAll({
|
|
37
|
+
return (await this.sequelizeModel.findAll({
|
|
38
38
|
where,
|
|
39
|
-
include: {
|
|
40
|
-
|
|
39
|
+
include: {
|
|
40
|
+
model: this.eventsRopidGTFSRoutesRepository["sequelizeModel"],
|
|
41
|
+
as: "routes",
|
|
42
|
+
include: [
|
|
43
|
+
{
|
|
44
|
+
model: this.ropidGTFSRoutesRepository["sequelizeModel"],
|
|
45
|
+
as: "gtfsRoute",
|
|
46
|
+
required: false,
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
},
|
|
50
|
+
}));
|
|
41
51
|
}
|
|
42
52
|
catch (err) {
|
|
43
53
|
throw new golemio_errors_1.GeneralError("Error in getAllForCustomFormat", this.constructor.name, err);
|
|
@@ -47,12 +57,20 @@ let JISEventsRepository = class JISEventsRepository extends AbstractValidatableR
|
|
|
47
57
|
this.sequelizeModel = connector.getConnection().define(this.tableName, JISEventsModel_1.JISEventsModel.attributeModel, {
|
|
48
58
|
schema: this.schema,
|
|
49
59
|
});
|
|
50
|
-
|
|
51
|
-
|
|
60
|
+
// Junction-first: hasMany the junction table (never drops a route without a GTFS counterpart),
|
|
61
|
+
// then optionally resolve the GTFS row for legacy rows whose route_details snapshot is null.
|
|
62
|
+
// A belongsToMany through the junction would inner-join junction->target and silently drop
|
|
63
|
+
// junction rows without a GTFS counterpart, even with required: false.
|
|
64
|
+
this.sequelizeModel.hasMany(eventsRopidGTFSRoutesRepository["sequelizeModel"], {
|
|
52
65
|
foreignKey: "event_id",
|
|
53
|
-
|
|
66
|
+
sourceKey: "id",
|
|
54
67
|
as: "routes",
|
|
55
68
|
});
|
|
69
|
+
eventsRopidGTFSRoutesRepository["sequelizeModel"].belongsTo(this.ropidGTFSRoutesRepository["sequelizeModel"], {
|
|
70
|
+
foreignKey: "route_id",
|
|
71
|
+
targetKey: "route_id",
|
|
72
|
+
as: "gtfsRoute",
|
|
73
|
+
});
|
|
56
74
|
}
|
|
57
75
|
buildWhereForCustomFormat(organizationNames, displayPeriodStart, displayPeriodEnd, type) {
|
|
58
76
|
const where = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JISEventsRepository.js","sourceRoot":"","sources":["../../../../src/output-gateway/jis/data-access/JISEventsRepository.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,6DAAuC;AACvC,0FAAgE;AAGhE,8IAA2I;AAC3I,wEAAqE;AACrE,mFAAkF;AAClF,mEAAoF;AACpF,iEAAwE;AACxE,6FAA0F;AAC1F,kDAA+C;AAC/C,2EAAwE;AACxE,6EAAwE;
|
|
1
|
+
{"version":3,"file":"JISEventsRepository.js","sourceRoot":"","sources":["../../../../src/output-gateway/jis/data-access/JISEventsRepository.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
import { JISEventsModel } from "../../../schema-definitions/jis/models/JISEventsModel";
|
|
2
|
+
import { JISEventsRopidGTFSRoutesModel } from "../../../schema-definitions/jis/models/JISEventsRopidGTFSRoutesModel";
|
|
3
|
+
import { RouteDto } from "../../../schema-definitions/ropid-gtfs/models/RouteDto";
|
|
2
4
|
export interface IJISEventCustomFormatInputDto {
|
|
3
5
|
data: JISEventsModel;
|
|
4
6
|
timezone: string;
|
|
5
7
|
}
|
|
8
|
+
/**
|
|
9
|
+
* Junction-first read result for a single event route: the junction row is always present,
|
|
10
|
+
* `gtfsRoute` is populated only when a matching ropidgtfs_routes row exists (optional resolution).
|
|
11
|
+
*/
|
|
12
|
+
export type IJISEventRouteWithGtfs = JISEventsRopidGTFSRoutesModel & {
|
|
13
|
+
gtfsRoute?: RouteDto | null;
|
|
14
|
+
};
|
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
import { IJISEventCustomFormatDto } from "../../../helpers/jis/interfaces/IJISEventCustomFormatDto";
|
|
2
2
|
import { JISEventsModel } from "../../../schema-definitions/jis/models/JISEventsModel";
|
|
3
3
|
import { AbstractTransformation } from "@golemio/core/dist/helpers/transformation/AbstractTransformation";
|
|
4
|
-
|
|
4
|
+
import { IJISEventRouteWithGtfs } from "../domain/IJISEventsInterfaces";
|
|
5
|
+
type TransformIn = JISEventsModel & {
|
|
6
|
+
routes?: IJISEventRouteWithGtfs[];
|
|
7
|
+
};
|
|
8
|
+
export declare class JISEventsCustomFormatTransformation extends AbstractTransformation<TransformIn, IJISEventCustomFormatDto> {
|
|
5
9
|
name: string;
|
|
6
|
-
protected transformInternal: (event:
|
|
10
|
+
protected transformInternal: (event: TransformIn) => IJISEventCustomFormatDto;
|
|
11
|
+
private buildRoutes;
|
|
7
12
|
private attachmentsToDto;
|
|
8
13
|
private effectsToTranslation;
|
|
9
14
|
}
|
|
15
|
+
export {};
|
|
@@ -40,12 +40,7 @@ let JISEventsCustomFormatTransformation = class JISEventsCustomFormatTransformat
|
|
|
40
40
|
description_html: event.description_html,
|
|
41
41
|
organization_name: event.organization_name,
|
|
42
42
|
informed_entity: {
|
|
43
|
-
routes: event.routes
|
|
44
|
-
id: route.route_id,
|
|
45
|
-
route_short_name: route.route_short_name,
|
|
46
|
-
route_long_name: route.route_long_name,
|
|
47
|
-
route_type: route.route_type,
|
|
48
|
-
})) || [],
|
|
43
|
+
routes: this.buildRoutes(event.routes),
|
|
49
44
|
},
|
|
50
45
|
attachments: this.attachmentsToDto(event.attachments),
|
|
51
46
|
last_modified_timestamp: event.updated_timestamp.toISOString(),
|
|
@@ -53,6 +48,27 @@ let JISEventsCustomFormatTransformation = class JISEventsCustomFormatTransformat
|
|
|
53
48
|
};
|
|
54
49
|
};
|
|
55
50
|
}
|
|
51
|
+
// Snapshot-first: route_details (stored on every VYMI push) is authoritative, but only if it
|
|
52
|
+
// actually describes this route (route_id matches); otherwise fall back to the GTFS join like
|
|
53
|
+
// legacy rows without a snapshot. Neither present -> the route is skipped (matches pre-snapshot
|
|
54
|
+
// behavior, no regression).
|
|
55
|
+
buildRoutes(routes = []) {
|
|
56
|
+
return routes
|
|
57
|
+
.map((route) => {
|
|
58
|
+
const snapshot = route.route_details?.route_id === route.route_id ? route.route_details : null;
|
|
59
|
+
const details = snapshot ?? route.gtfsRoute;
|
|
60
|
+
return details
|
|
61
|
+
? {
|
|
62
|
+
id: route.route_id,
|
|
63
|
+
route_id: details.route_id,
|
|
64
|
+
route_short_name: details.route_short_name,
|
|
65
|
+
route_long_name: details.route_long_name ?? null,
|
|
66
|
+
route_type: details.route_type,
|
|
67
|
+
}
|
|
68
|
+
: null;
|
|
69
|
+
})
|
|
70
|
+
.filter((route) => route !== null);
|
|
71
|
+
}
|
|
56
72
|
attachmentsToDto(attachments) {
|
|
57
73
|
return (attachments ?? []).map((attachment) => ({
|
|
58
74
|
url: attachment.url,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JISEventsCustomFormatTransformation.js","sourceRoot":"","sources":["../../../../src/output-gateway/jis/transformations/JISEventsCustomFormatTransformation.ts"],"names":[],"mappings":";;;;;;;;;AAEA,6GAA0G;AAC1G,iEAAgE;AAChE,8FAAmF;AACnF,oFAAyE;
|
|
1
|
+
{"version":3,"file":"JISEventsCustomFormatTransformation.js","sourceRoot":"","sources":["../../../../src/output-gateway/jis/transformations/JISEventsCustomFormatTransformation.ts"],"names":[],"mappings":";;;;;;;;;AAEA,6GAA0G;AAC1G,iEAAgE;AAChE,8FAAmF;AACnF,oFAAyE;AAOlE,IAAM,mCAAmC,GAAzC,MAAM,mCAAoC,SAAQ,+CAA6D;IAA/G;;QACI,SAAI,GAAG,qCAAqC,CAAC;QAE1C,sBAAiB,GAAG,CAAC,KAAkB,EAA4B,EAAE;YAC3E,OAAO;gBACH,EAAE,EAAE,KAAK,CAAC,EAAE;gBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,KAAK,EAAE;oBACH,EAAE,EAAE,qDAAyB,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;oBACpD,EAAE,EAAE,qDAAyB,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;oBACpD,EAAE,EAAE,qDAAyB,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;iBACvD;gBACD,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,cAAc,EAAE,KAAK,CAAC,cAAc;gBACpC,aAAa,EAAE;oBACX,KAAK,EAAE,KAAK,CAAC,mBAAmB,CAAC,WAAW,EAAE;oBAC9C,GAAG,EAAE,KAAK,CAAC,iBAAiB,EAAE,WAAW,EAAE,IAAI,IAAI;iBACtD;gBACD,cAAc,EAAE;oBACZ,KAAK,EAAE,KAAK,CAAC,oBAAoB,CAAC,WAAW,EAAE;oBAC/C,GAAG,EAAE,KAAK,CAAC,kBAAkB,EAAE,WAAW,EAAE,IAAI,IAAI;iBACvD;gBACD,OAAO,EAAE,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,MAAM,CAAC;gBAChD,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;gBACxC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;gBACxC,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;gBAC1C,eAAe,EAAE;oBACb,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC;iBACzC;gBACD,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,WAAW,CAAC;gBACrD,uBAAuB,EAAE,KAAK,CAAC,iBAAiB,CAAC,WAAW,EAAE;gBAC9D,iBAAiB,EAAE,KAAK,CAAC,iBAAiB,CAAC,WAAW,EAAE;aAC3D,CAAC;QACN,CAAC,CAAC;IAuCN,CAAC;IArCG,6FAA6F;IAC7F,8FAA8F;IAC9F,gGAAgG;IAChG,4BAA4B;IACpB,WAAW,CAAC,SAAmC,EAAE;QACrD,OAAO,MAAM;aACR,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACX,MAAM,QAAQ,GAAG,KAAK,CAAC,aAAa,EAAE,QAAQ,KAAK,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC;YAC/F,MAAM,OAAO,GAAG,QAAQ,IAAI,KAAK,CAAC,SAAS,CAAC;YAC5C,OAAO,OAAO;gBACV,CAAC,CAAC;oBACI,EAAE,EAAE,KAAK,CAAC,QAAQ;oBAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;oBAC1B,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;oBAC1C,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,IAAI;oBAChD,UAAU,EAAE,OAAO,CAAC,UAAU;iBACjC;gBACH,CAAC,CAAC,IAAI,CAAC;QACf,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;IAC3C,CAAC;IAEO,gBAAgB,CAAC,WAA0C;QAC/D,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAC5C,GAAG,EAAE,UAAU,CAAC,GAAG;YACnB,IAAI,EAAE,UAAU,CAAC,IAAI,IAAI,EAAE;SAC9B,CAAC,CAAC,CAAC;IACR,CAAC;IAEO,oBAAoB,CAAC,MAAyB;QAClD,OAAO,2CAAoB,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,MAAc,EAAE,EAAE;YACvE,OAAO;gBACH,EAAE,EAAE,qDAAyB,CAAC,UAAU,CAAC,MAAM,CAAC;gBAChD,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC;aAC1F,CAAC;QACN,CAAC,CAAC,CAAC;IACP,CAAC;CACJ,CAAA;AAzEY,kFAAmC;8CAAnC,mCAAmC;IAD/C,IAAA,qBAAU,GAAE;GACA,mCAAmC,CAyE/C"}
|
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.jisEventsJsonSchema = void 0;
|
|
4
4
|
const JISEventSeverityLevelEnum_1 = require("../../../helpers/jis/JISEventSeverityLevelEnum");
|
|
5
|
+
const RouteTypeEnums_1 = require("../../../helpers/RouteTypeEnums");
|
|
5
6
|
const jisEventCause_1 = require("../constants/jisEventCause");
|
|
6
7
|
const jisEventEffect_1 = require("../constants/jisEventEffect");
|
|
7
8
|
const jisEventType_1 = require("../constants/jisEventType");
|
|
9
|
+
const gtfsRouteTypeValues = Object.values(RouteTypeEnums_1.GTFSRouteTypeEnum).filter((value) => typeof value === "number");
|
|
8
10
|
exports.jisEventsJsonSchema = {
|
|
9
11
|
type: "array",
|
|
10
12
|
items: {
|
|
@@ -78,6 +80,23 @@ exports.jisEventsJsonSchema = {
|
|
|
78
80
|
type: "object",
|
|
79
81
|
properties: {
|
|
80
82
|
id: { type: "string" },
|
|
83
|
+
route_details: {
|
|
84
|
+
type: "object",
|
|
85
|
+
nullable: true,
|
|
86
|
+
properties: {
|
|
87
|
+
route_id: { type: "string", maxLength: 50 },
|
|
88
|
+
route_short_name: { type: "string", maxLength: 255 },
|
|
89
|
+
route_long_name: {
|
|
90
|
+
oneOf: [
|
|
91
|
+
{ type: "string", maxLength: 255 },
|
|
92
|
+
{ type: "null", nullable: true },
|
|
93
|
+
],
|
|
94
|
+
},
|
|
95
|
+
route_type: { type: "integer", enum: gtfsRouteTypeValues },
|
|
96
|
+
},
|
|
97
|
+
additionalProperties: false,
|
|
98
|
+
required: ["route_id", "route_short_name", "route_long_name", "route_type"],
|
|
99
|
+
},
|
|
81
100
|
},
|
|
82
101
|
additionalProperties: false,
|
|
83
102
|
required: ["id"],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JISEventsJsonSchema.js","sourceRoot":"","sources":["../../../../src/schema-definitions/jis/datasources/JISEventsJsonSchema.ts"],"names":[],"mappings":";;;AAAA,8FAA+E;
|
|
1
|
+
{"version":3,"file":"JISEventsJsonSchema.js","sourceRoot":"","sources":["../../../../src/schema-definitions/jis/datasources/JISEventsJsonSchema.ts"],"names":[],"mappings":";;;AAAA,8FAA+E;AAC/E,oEAA4D;AAE5D,8DAA2D;AAC3D,gEAA6D;AAE7D,4DAAyD;AAEzD,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,CAAC,kCAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC;AAE9G,QAAA,mBAAmB,GAAgC;IAC5D,IAAI,EAAE,OAAO;IACb,KAAK,EAAE;QACH,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACR,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACtB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,2BAAY,EAAE;YAC5C,WAAW,EAAE,EAAE,IAAI,EAAE,2BAA2B,EAAE;YAClD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,6BAAa,EAAE;YAC9C,YAAY,EAAE,EAAE,IAAI,EAAE,mCAAmC,EAAE;YAC3D,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,iDAAqB,CAAC,EAAE;YAC9E,aAAa,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACR,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE;oBAC9C,GAAG,EAAE;wBACD,KAAK,EAAE;4BACH,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE;4BACvC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;yBACnC;qBACJ;iBACJ;gBACD,oBAAoB,EAAE,KAAK;gBAC3B,QAAQ,EAAE,CAAC,OAAO,CAAC;aACtB;YACD,cAAc,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACR,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE;oBAC9C,GAAG,EAAE;wBACD,KAAK,EAAE;4BACH,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE;4BACvC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;yBACnC;qBACJ;iBACJ;gBACD,oBAAoB,EAAE,KAAK;gBAC3B,QAAQ,EAAE,CAAC,OAAO,CAAC;aACtB;YACD,MAAM,EAAE;gBACJ,KAAK,EAAE;oBACH;wBACI,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE;4BACH,IAAI,EAAE,QAAQ;4BACd,IAAI,EAAE,+BAAc;yBACvB;wBACD,QAAQ,EAAE,CAAC;wBACX,QAAQ,EAAE,CAAC;wBACX,WAAW,EAAE,IAAI;qBACpB;oBACD;wBACI,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,+BAAc;qBACvB;iBACJ;aACJ;YACD,aAAa,EAAE,EAAE,IAAI,EAAE,2BAA2B,EAAE;YACpD,gBAAgB,EAAE,EAAE,IAAI,EAAE,2BAA2B,EAAE;YACvD,gBAAgB,EAAE,EAAE,IAAI,EAAE,2BAA2B,EAAE;YACvD,GAAG,EAAE,EAAE,IAAI,EAAE,2BAA2B,EAAE;YAC1C,iBAAiB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACrC,eAAe,EAAE;gBACb,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,IAAI;gBACd,UAAU,EAAE;oBACR,MAAM,EAAE;wBACJ,IAAI,EAAE,OAAO;wBACb,QAAQ,EAAE,IAAI;wBACd,KAAK,EAAE;4BACH,IAAI,EAAE,QAAQ;4BACd,UAAU,EAAE;gCACR,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gCACtB,aAAa,EAAE;oCACX,IAAI,EAAE,QAAQ;oCACd,QAAQ,EAAE,IAAI;oCACd,UAAU,EAAE;wCACR,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE;wCAC3C,gBAAgB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE;wCACpD,eAAe,EAAE;4CACb,KAAK,EAAE;gDACH,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE;gDAClC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;6CACnC;yCACJ;wCACD,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,mBAAmB,EAAE;qCAC7D;oCACD,oBAAoB,EAAE,KAAK;oCAC3B,QAAQ,EAAE,CAAC,UAAU,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,YAAY,CAAC;iCAC9E;6BACJ;4BACD,oBAAoB,EAAE,KAAK;4BAC3B,QAAQ,EAAE,CAAC,IAAI,CAAC;yBACnB;qBACJ;iBACJ;gBACD,oBAAoB,EAAE,KAAK;aAC9B;YACD,WAAW,EAAE;gBACT,KAAK,EAAE;oBACH;wBACI,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE;4BACH,IAAI,EAAE,QAAQ;4BACd,UAAU,EAAE;gCACR,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gCACvB,IAAI,EAAE;oCACF,KAAK,EAAE;wCACH;4CACI,IAAI,EAAE,QAAQ;4CACd,UAAU,EAAE;gDACR,EAAE,EAAE;oDACA,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;oDAC7D,QAAQ,EAAE,IAAI;iDACjB;gDACD,EAAE,EAAE;oDACA,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;oDAC7D,QAAQ,EAAE,IAAI;iDACjB;gDACD,EAAE,EAAE;oDACA,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;oDAC7D,QAAQ,EAAE,IAAI;iDACjB;6CACJ;4CACD,oBAAoB,EAAE,KAAK;yCAC9B;wCACD,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;qCACnC;oCACD,QAAQ,EAAE,IAAI;iCACjB;6BACJ;4BACD,oBAAoB,EAAE,KAAK;4BAC3B,QAAQ,EAAE,CAAC,KAAK,CAAC;yBACpB;qBACJ;oBACD,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;iBACnC;gBACD,QAAQ,EAAE,IAAI;aACjB;YACD,iBAAiB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE;YAC1D,uBAAuB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE;YAChE,UAAU,EAAE;gBACR,KAAK,EAAE;oBACH,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE;oBACvC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;iBACnC;aACJ;SACJ;QACD,QAAQ,EAAE;YACN,IAAI;YACJ,MAAM;YACN,aAAa;YACb,OAAO;YACP,cAAc;YACd,gBAAgB;YAChB,eAAe;YACf,gBAAgB;YAChB,QAAQ;YACR,eAAe;YACf,kBAAkB;YAClB,kBAAkB;YAClB,KAAK;YACL,mBAAmB;YACnB,mBAAmB;YACnB,yBAAyB;SAC5B;KACJ;IACD,WAAW,EAAE;QACT,WAAW,EAAE;YACT,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACR,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACtB,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE;gBACrE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE;aACxE;YACD,oBAAoB,EAAE,KAAK;YAC3B,QAAQ,EAAE,CAAC,IAAI,CAAC;SACnB;QACD,mBAAmB,EAAE;YACjB,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACR,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE;gBACrE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE;aACxE;YACD,oBAAoB,EAAE,KAAK;YAC3B,QAAQ,EAAE,CAAC,IAAI,CAAC;SACnB;KACJ;CACJ,CAAC"}
|
|
@@ -5,6 +5,7 @@ export declare class JISEventsRopidGTFSRoutesModel extends Model<InferAttributes
|
|
|
5
5
|
static tableName: string;
|
|
6
6
|
event_id: string;
|
|
7
7
|
route_id: string;
|
|
8
|
+
route_details: IJISEventsRopidGTFSRoutes["route_details"];
|
|
8
9
|
created_at: CreationOptional<Date>;
|
|
9
10
|
updated_at: CreationOptional<Date>;
|
|
10
11
|
static attributeModel: ModelAttributes<JISEventsRopidGTFSRoutesModel>;
|
|
@@ -17,6 +17,10 @@ JISEventsRopidGTFSRoutesModel.attributeModel = {
|
|
|
17
17
|
type: sequelize_1.DataTypes.STRING(50),
|
|
18
18
|
allowNull: false,
|
|
19
19
|
},
|
|
20
|
+
route_details: {
|
|
21
|
+
type: sequelize_1.DataTypes.JSONB,
|
|
22
|
+
allowNull: true,
|
|
23
|
+
},
|
|
20
24
|
created_at: {
|
|
21
25
|
type: sequelize_1.DataTypes.DATE,
|
|
22
26
|
allowNull: false,
|
|
@@ -33,6 +37,24 @@ JISEventsRopidGTFSRoutesModel.jsonSchema = {
|
|
|
33
37
|
properties: {
|
|
34
38
|
event_id: { type: "string" },
|
|
35
39
|
route_id: { type: "string" },
|
|
40
|
+
route_details: {
|
|
41
|
+
oneOf: [
|
|
42
|
+
{
|
|
43
|
+
type: "object",
|
|
44
|
+
properties: {
|
|
45
|
+
route_id: { type: "string" },
|
|
46
|
+
route_short_name: { type: "string" },
|
|
47
|
+
route_long_name: {
|
|
48
|
+
oneOf: [{ type: "string" }, { type: "null", nullable: true }],
|
|
49
|
+
},
|
|
50
|
+
route_type: { type: "integer" },
|
|
51
|
+
},
|
|
52
|
+
additionalProperties: false,
|
|
53
|
+
required: ["route_id", "route_short_name", "route_long_name", "route_type"],
|
|
54
|
+
},
|
|
55
|
+
{ type: "null", nullable: true },
|
|
56
|
+
],
|
|
57
|
+
},
|
|
36
58
|
},
|
|
37
59
|
additionalProperties: false,
|
|
38
60
|
required: ["event_id", "route_id"],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JISEventsRopidGTFSRoutesModel.js","sourceRoot":"","sources":["../../../../src/schema-definitions/jis/models/JISEventsRopidGTFSRoutesModel.ts"],"names":[],"mappings":";;;AACA,mEAO6C;AAG7C,MAAa,6BACT,SAAQ,iBAA6G;;AADzH,
|
|
1
|
+
{"version":3,"file":"JISEventsRopidGTFSRoutesModel.js","sourceRoot":"","sources":["../../../../src/schema-definitions/jis/models/JISEventsRopidGTFSRoutesModel.ts"],"names":[],"mappings":";;;AACA,mEAO6C;AAG7C,MAAa,6BACT,SAAQ,iBAA6G;;AADzH,sEAmEC;AA/DiB,uCAAS,GAAG,6BAA6B,CAAC;AAQ1C,4CAAc,GAAmD;IAC3E,QAAQ,EAAE;QACN,UAAU,EAAE,IAAI;QAChB,IAAI,EAAE,qBAAS,CAAC,IAAI;QACpB,SAAS,EAAE,KAAK;KACnB;IACD,QAAQ,EAAE;QACN,UAAU,EAAE,IAAI;QAChB,IAAI,EAAE,qBAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,SAAS,EAAE,KAAK;KACnB;IACD,aAAa,EAAE;QACX,IAAI,EAAE,qBAAS,CAAC,KAAK;QACrB,SAAS,EAAE,IAAI;KAClB;IACD,UAAU,EAAE;QACR,IAAI,EAAE,qBAAS,CAAC,IAAI;QACpB,SAAS,EAAE,KAAK;KACnB;IACD,UAAU,EAAE;QACR,IAAI,EAAE,qBAAS,CAAC,IAAI;QACpB,SAAS,EAAE,KAAK;KACnB;CACJ,CAAC;AAEY,wCAAU,GAAgD;IACpE,IAAI,EAAE,OAAO;IACb,KAAK,EAAE;QACH,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACR,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC5B,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC5B,aAAa,EAAE;gBACX,KAAK,EAAE;oBACH;wBACI,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACR,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;4BAC5B,gBAAgB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;4BACpC,eAAe,EAAE;gCACb,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;6BAChE;4BACD,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;yBAClC;wBACD,oBAAoB,EAAE,KAAK;wBAC3B,QAAQ,EAAE,CAAC,UAAU,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,YAAY,CAAC;qBAC9E;oBACD,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;iBACnC;aACJ;SACJ;QACD,oBAAoB,EAAE,KAAK;QAC3B,QAAQ,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;KACrC;CACJ,CAAC"}
|
package/docs/asyncapi.yaml
CHANGED
|
@@ -1882,6 +1882,28 @@ components:
|
|
|
1882
1882
|
id:
|
|
1883
1883
|
type: string
|
|
1884
1884
|
description: Unique GTFS identifier of the affected route
|
|
1885
|
+
route_details:
|
|
1886
|
+
type: object
|
|
1887
|
+
nullable: true
|
|
1888
|
+
description: >-
|
|
1889
|
+
Optional snapshot of the route's GTFS attributes at the time VYMI sent the event.
|
|
1890
|
+
Present on every route sent by producers that support it (older payloads omit it,
|
|
1891
|
+
or send it as null)
|
|
1892
|
+
properties:
|
|
1893
|
+
route_id:
|
|
1894
|
+
type: string
|
|
1895
|
+
route_short_name:
|
|
1896
|
+
type: string
|
|
1897
|
+
route_long_name:
|
|
1898
|
+
type: string
|
|
1899
|
+
nullable: true
|
|
1900
|
+
route_type:
|
|
1901
|
+
type: integer
|
|
1902
|
+
required:
|
|
1903
|
+
- route_id
|
|
1904
|
+
- route_short_name
|
|
1905
|
+
- route_long_name
|
|
1906
|
+
- route_type
|
|
1885
1907
|
required:
|
|
1886
1908
|
- id
|
|
1887
1909
|
last_modified_timestamp:
|
|
@@ -1291,6 +1291,7 @@ Worker má na starost stahování VYMI (JIS) událostí a infotextů, jejich tra
|
|
|
1291
1291
|
- pole `effects` je pole až 3 unikátních řetězců; v GTFS-RT `Alert.effect` se použije pouze `effects[0]`, zbývající hodnoty jsou dostupné pouze v custom-format exportu
|
|
1292
1292
|
- pole `cause_detail` je volný text zpřesňující příčinu události; může být `null`
|
|
1293
1293
|
- pole `cause` obsahuje překlady do češtiny i angličtiny; anglické hodnoty jsou zahrnuty i ve výstupu GTFS-RT alert feedu
|
|
1294
|
+
- `informed_entity.routes[].route_details` (volitelné) je snímek GTFS atributů trasy z VYMI, uložený beze změny do `jis_events_ropidgtfs_routes.route_details`; podrobněji viz [jis/index.md](./jis/index.md#informed_entityroutesroute_details-snímek-gtfs-atributů-trasy)
|
|
1294
1295
|
- pole `header_text`, `description_text`, `description_html` a `cause` mají navíc německou mutaci (`de`) v custom-format exportu a ve webhooku; `cause_detail`, `effect_detail`, `url` a `effects` němčinu nemají (VYMI ji tam neposílá) — viz [docs/jis/index.md](jis/index.md#německá-jazyková-mutace-de)
|
|
1295
1296
|
- nové pole `attachments` (JSONB, nullable) — dokumenty a odkazy přiložené k události (`{url, name: {cs, en, de}}`); vložené obrázky se nepropagují — viz [docs/jis/index.md](jis/index.md#attachments-přílohy)
|
|
1296
1297
|
|
|
@@ -1313,6 +1314,7 @@ Worker má na starost stahování VYMI (JIS) událostí a infotextů, jejich tra
|
|
|
1313
1314
|
- Popis tasku
|
|
1314
1315
|
- Task posila POST requestem aktualizace dat o změněných událostech hned po přijetí z VYMI a uložení do VP databáze na webhooky definované v module config hodnotami `jis.webhooks.eventUpdate.targets.*`
|
|
1315
1316
|
- Jako fallback při výpadku webhooku se muze dotazat uzivatel na `/v1/jis/events/custom-format`
|
|
1317
|
+
- Tělo POST požadavku má tvar `EventCustomFormat` (viz [openapi-output.yaml](./openapi-output.yaml)) rozšířený o `deleted_timestamp`; trasy jsou snapshot-first z `route_details` z příchozí zprávy, GTFS dotaz (`ropidgtfs_routes`) je jen fallback pro trasy bez `route_details`
|
|
1316
1318
|
|
|
1317
1319
|
- vstupní rabbitmq fronta
|
|
1318
1320
|
- název: vehicle-positions.jis.updateEventWebhook
|
|
@@ -1325,7 +1327,7 @@ Worker má na starost stahování VYMI (JIS) událostí a infotextů, jejich tra
|
|
|
1325
1327
|
- transformace
|
|
1326
1328
|
- [UpdateEventWebhookTransformation](../src/integration-engine/jis/transformations/UpdateEventWebhookTransformation.ts)
|
|
1327
1329
|
- data modely
|
|
1328
|
-
- RopidGTFSRoutes `ropidgtfs_routes`
|
|
1330
|
+
- RopidGTFSRoutes `ropidgtfs_routes` (fallback dotaz, jen pro trasy bez `route_details` ve vstupní zprávě)
|
|
1329
1331
|
|
|
1330
1332
|
#### _task: FetchJISEventsTask_
|
|
1331
1333
|
|
|
@@ -1653,3 +1655,4 @@ Worker má na starost stahování VYMI (JIS) událostí a infotextů, jejich tra
|
|
|
1653
1655
|
- `type` – filtrování podle typu události (`INCIDENT`, `DISRUPTION`, `SERVICE_CHANGE`)
|
|
1654
1656
|
- zdrojové tabulky: `jis_events`, `jis_events_ropidgtfs_routes`
|
|
1655
1657
|
- formát odpovědi: viz schéma `EventCustomFormat` v [openapi-output.yaml](./openapi-output.yaml)
|
|
1658
|
+
- trasy v `informed_entity.routes` jsou snapshot-first (`jis_events_ropidgtfs_routes.route_details`), s GTFS fallbackem (`ropidgtfs_routes`) jen pro starší řádky bez snímku; podrobněji viz [jis/index.md](./jis/index.md#informed_entityroutesroute_details-snímek-gtfs-atributů-trasy)
|
package/docs/jis/index.md
CHANGED
|
@@ -279,3 +279,40 @@ Pole `attachments` obsahuje dokumenty a odkazy přiložené k události (VYMI `k
|
|
|
279
279
|
### `effects` (pole příčin dopadu)
|
|
280
280
|
|
|
281
281
|
Pole `effects` může obsahovat 1–3 unikátní řetězcové hodnoty. Pouze `effects[0]` se mapuje na standardní GTFS-RT `Alert.effect`; zbývající hodnoty jsou dostupné výhradně v custom-format exportu.
|
|
282
|
+
|
|
283
|
+
### `informed_entity.routes[].route_details` (snímek GTFS atributů trasy)
|
|
284
|
+
|
|
285
|
+
Vedle kompatibilního identifikátoru `id` může VYMI u každé trasy poslat volitelné pole `route_details`
|
|
286
|
+
(`route_id`, `route_short_name`, `route_long_name` — může být `null`, `route_type`). Jde o snímek GTFS
|
|
287
|
+
atributů trasy v okamžiku, kdy VYMI událost odeslala — je zahrnut i pro trasy, které v aktuálním GTFS
|
|
288
|
+
JŘ už neexistují nebo jsou neaktivní. Pole je v PID vstupním schématu (`JISEventsJsonSchema`) volitelné
|
|
289
|
+
(není v `required` u položky `routes[]`), aby starší VYMI verze bez tohoto pole neselhávaly na validaci —
|
|
290
|
+
je ale u nového VYMI producenta odesíláno vždy.
|
|
291
|
+
|
|
292
|
+
`route_details` se ukládá tak, jak přišlo, do sloupce `jis_events_ropidgtfs_routes.route_details` (JSONB,
|
|
293
|
+
nullable). Čtecí modely (custom-format export `/v1/jis/events/custom-format` a webhook `UpdateEventWebhookTask`)
|
|
294
|
+
jsou **snapshot-first**: pokud je `route_details` u dané trasy vyplněné, použije se přímo bez dotazu do GTFS
|
|
295
|
+
dat. Teprve u starších řádků, které vznikly před zavedením tohoto sloupce a mají `route_details = null`, se
|
|
296
|
+
provede fallback dohledání aktuální GTFS trasy (`ropidgtfs_routes`) podle `id`. Pokud není k dispozici ani
|
|
297
|
+
snímek, ani odpovídající GTFS trasa, je daná trasa z výstupu vynechána (chování shodné s obdobím před
|
|
298
|
+
zavedením snímku, žádná regrese).
|
|
299
|
+
|
|
300
|
+
### Asymetrie GTFS-RT protobuf (`alerts.pb`) vs. custom-format / webhook výstup
|
|
301
|
+
|
|
302
|
+
`getCurrentIncidents` (zdroj pro `alerts.pb`) používá vůči `ropidgtfs_routes` `required: true` (inner join) —
|
|
303
|
+
událost, jejíž všechny trasy jsou v aktuálním GTFS neznámé nebo neaktivní, je z protobuf feedu úplně
|
|
304
|
+
vynechána; u smíšené události (část tras GTFS zná, část ne) zůstanou v `alerts.pb` jen GTFS-známé trasy.
|
|
305
|
+
Custom-format export a webhook naproti tomu GTFS-neznámé trasy zobrazují (díky `route_details` snímku).
|
|
306
|
+
Tato asymetrie je záměrná — `alerts.pb` konzumují GTFS-RT klienti, kteří GTFS-neznámou trasu stejně neumí
|
|
307
|
+
spárovat s jízdním řádem; custom-format/webhook konzumenti (např. web PID.cz) naopak potřebují zrušené/
|
|
308
|
+
neaktivní linky zobrazit i bez GTFS záznamu.
|
|
309
|
+
|
|
310
|
+
### Webhook výstup (`UpdateEventWebhookTask`)
|
|
311
|
+
|
|
312
|
+
Kromě uložení do databáze `UpdateEventWebhookTask` po přijetí události z VYMI odešle HTTP POST na cílové
|
|
313
|
+
adresy nakonfigurované v `module.pid.jis.webhooks.eventUpdate.targets.*`. Tělo požadavku má stejný tvar jako
|
|
314
|
+
`EventCustomFormat` (viz [openapi-output.yaml](../openapi-output.yaml)), navíc obsahuje pole
|
|
315
|
+
`deleted_timestamp` (čas smazání události, nebo `null`) — to `/v1/jis/events/custom-format` nevrací a slouží
|
|
316
|
+
konzumentům webhooku k rozpoznání smazaných událostí bez nutnosti dalšího dotazu. Trasy v `informed_entity.routes`
|
|
317
|
+
jsou stejně jako u custom-format výstupu snapshot-first s GTFS fallbackem pro starší řádky bez snímku;
|
|
318
|
+
při výpadku webhooku je fallbackem pro konzumenta dotaz na `/v1/jis/events/custom-format`.
|
package/docs/openapi-input.yaml
CHANGED
|
@@ -725,6 +725,43 @@ components:
|
|
|
725
725
|
id:
|
|
726
726
|
type: string
|
|
727
727
|
description: Unique GTFS identifier of the affected route
|
|
728
|
+
route_details:
|
|
729
|
+
type: object
|
|
730
|
+
nullable: true
|
|
731
|
+
description: >-
|
|
732
|
+
Optional snapshot of the route's GTFS attributes at the time the producer sent
|
|
733
|
+
the event, stored as-is and used to render the route in web outputs (custom-format
|
|
734
|
+
export, webhook) without a live GTFS lookup. Omit or send null for routes without
|
|
735
|
+
a snapshot (legacy producers); such rows fall back to a live GTFS lookup by
|
|
736
|
+
`id` when rendered.
|
|
737
|
+
properties:
|
|
738
|
+
route_id:
|
|
739
|
+
type: string
|
|
740
|
+
maxLength: 50
|
|
741
|
+
route_short_name:
|
|
742
|
+
type: string
|
|
743
|
+
maxLength: 255
|
|
744
|
+
route_long_name:
|
|
745
|
+
type: string
|
|
746
|
+
nullable: true
|
|
747
|
+
maxLength: 255
|
|
748
|
+
route_type:
|
|
749
|
+
type: integer
|
|
750
|
+
example: 0
|
|
751
|
+
enum:
|
|
752
|
+
- 0
|
|
753
|
+
- 1
|
|
754
|
+
- 2
|
|
755
|
+
- 3
|
|
756
|
+
- 4
|
|
757
|
+
- 7
|
|
758
|
+
- 11
|
|
759
|
+
- 1700
|
|
760
|
+
required:
|
|
761
|
+
- route_id
|
|
762
|
+
- route_short_name
|
|
763
|
+
- route_long_name
|
|
764
|
+
- route_type
|
|
728
765
|
required:
|
|
729
766
|
- id
|
|
730
767
|
attachments:
|
|
@@ -981,7 +1018,19 @@ components:
|
|
|
981
1018
|
"cs": "https://dpp.cz/omezeni-a-mimoradne-udalosti/detail/test-0"
|
|
982
1019
|
},
|
|
983
1020
|
"informed_entity": {
|
|
984
|
-
"routes": [
|
|
1021
|
+
"routes": [
|
|
1022
|
+
{
|
|
1023
|
+
"id": "L24",
|
|
1024
|
+
"route_details": {
|
|
1025
|
+
"route_id": "L24",
|
|
1026
|
+
"route_short_name": "24",
|
|
1027
|
+
"route_long_name": "Nádraží Vysočany - Spořilov",
|
|
1028
|
+
"route_type": 0
|
|
1029
|
+
}
|
|
1030
|
+
},
|
|
1031
|
+
{ "id": "L10" },
|
|
1032
|
+
{ "id": "L3" }
|
|
1033
|
+
]
|
|
985
1034
|
},
|
|
986
1035
|
"attachments": [
|
|
987
1036
|
{
|
package/docs/openapi-output.yaml
CHANGED
|
@@ -4020,16 +4020,23 @@ components:
|
|
|
4020
4020
|
id:
|
|
4021
4021
|
type: string
|
|
4022
4022
|
example: L13
|
|
4023
|
+
description: Identifier of the route as informed by VYMI
|
|
4024
|
+
route_id:
|
|
4025
|
+
type: string
|
|
4026
|
+
example: L13
|
|
4027
|
+
description: GTFS route_id resolved from the route_details snapshot (or, for legacy rows, from GTFS data)
|
|
4023
4028
|
route_short_name:
|
|
4024
4029
|
type: string
|
|
4025
4030
|
example: "13"
|
|
4026
4031
|
route_long_name:
|
|
4027
4032
|
type: string
|
|
4028
4033
|
example: "Čechovo náměstí - Olšanské hřbitovy"
|
|
4034
|
+
nullable: true
|
|
4029
4035
|
route_type:
|
|
4030
4036
|
$ref: "#/components/schemas/RouteType"
|
|
4031
4037
|
required:
|
|
4032
4038
|
- id
|
|
4039
|
+
- route_id
|
|
4033
4040
|
- route_short_name
|
|
4034
4041
|
- route_type
|
|
4035
4042
|
- route_long_name
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@golemio/pid",
|
|
3
|
-
"version": "5.18.
|
|
3
|
+
"version": "5.18.2-dev.2769428000",
|
|
4
4
|
"description": "Golemio PID Module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -81,7 +81,7 @@
|
|
|
81
81
|
"@golemio/core": "^3.0.7-dev.2 || ^3.1.0-dev.2 || ^3.0.0"
|
|
82
82
|
},
|
|
83
83
|
"dependencies": {
|
|
84
|
-
"@golemio/ovapi-gtfs-realtime-bindings": "1.4.
|
|
84
|
+
"@golemio/ovapi-gtfs-realtime-bindings": "1.4.1-dev.2464451735",
|
|
85
85
|
"@turf/turf": "^6.5.0",
|
|
86
86
|
"cheap-ruler": "^3.0.2",
|
|
87
87
|
"csv-parser": "^3.0.0",
|