@golemio/public-transport 0.1.0-dev.2772532070 → 0.1.0-dev.2780201953
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/20260820000000-widen-trip-number.js +53 -0
- package/db/migrations/postgresql/sqls/20260813000000-init-schema-up.sql +4 -4
- package/db/migrations/postgresql/sqls/20260820000000-widen-trip-number-down.sql +3 -0
- package/db/migrations/postgresql/sqls/20260820000000-widen-trip-number-up.sql +6 -0
- package/dist/input-gateway/vehicle-positions/VehiclePositionsController.js +1 -1
- package/dist/input-gateway/vehicle-positions/VehiclePositionsRouter.js +2 -2
- package/dist/integration-engine/gtfs/GtfsFacade.js +3 -1
- package/dist/integration-engine/gtfs/GtfsFacade.js.map +1 -1
- package/dist/integration-engine/gtfs/GtfsMetadataRepository.d.ts +9 -6
- package/dist/integration-engine/gtfs/GtfsMetadataRepository.js +102 -7
- package/dist/integration-engine/gtfs/GtfsMetadataRepository.js.map +1 -1
- package/dist/integration-engine/gtfs/data-access/cache/BlockStopsRedisRepository.d.ts +8 -0
- package/dist/integration-engine/gtfs/data-access/cache/BlockStopsRedisRepository.js +11 -0
- package/dist/integration-engine/gtfs/data-access/cache/BlockStopsRedisRepository.js.map +1 -1
- package/dist/integration-engine/gtfs/data-access/cache/RunTripsRedisRepository.d.ts +8 -0
- package/dist/integration-engine/gtfs/data-access/cache/RunTripsRedisRepository.js +11 -0
- package/dist/integration-engine/gtfs/data-access/cache/RunTripsRedisRepository.js.map +1 -1
- package/dist/integration-engine/gtfs/data-access/precomputed/TripScheduleRepository.d.ts +28 -0
- package/dist/integration-engine/gtfs/data-access/precomputed/TripScheduleRepository.js +127 -13
- package/dist/integration-engine/gtfs/data-access/precomputed/TripScheduleRepository.js.map +1 -1
- package/dist/integration-engine/gtfs/facade/DeparturePresetsFacade.js +1 -1
- package/dist/integration-engine/gtfs/workers/timetables/tasks/CheckSavedRowsAndReplaceTablesTask.js +20 -17
- package/dist/integration-engine/gtfs/workers/timetables/tasks/CheckSavedRowsAndReplaceTablesTask.js.map +1 -1
- package/dist/integration-engine/gtfs/workers/timetables/tasks/DownloadDatasetsTask.js +2 -2
- package/dist/integration-engine/gtfs/workers/timetables/tasks/DownloadDatasetsTask.js.map +1 -1
- package/dist/integration-engine/gtfs/workers/timetables/tasks/ImportGtfsFromStorageTask.js +24 -21
- package/dist/integration-engine/gtfs/workers/timetables/tasks/ImportGtfsFromStorageTask.js.map +1 -1
- package/dist/integration-engine/gtfs/workers/timetables/tasks/SaveStaticDataTask.js +2 -2
- package/dist/integration-engine/gtfs/workers/timetables/tasks/TransformAndSaveDataTask.js +2 -2
- package/dist/integration-engine/gtfs/workers/timetables/tasks/TransformAndSaveDataTask.js.map +1 -1
- package/dist/integration-engine/jis/repositories/DeparturesPresetsRoutesRepository.js +1 -1
- package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/helpers/TripStopsManager.js +2 -4
- package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/helpers/TripStopsManager.js.map +1 -1
- package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/helpers/gtfs-trip-run/AbstractGTFSTripRunManager.js +2 -4
- package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/helpers/gtfs-trip-run/AbstractGTFSTripRunManager.js.map +1 -1
- package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/tasks/PropagateDelayTask.js +1 -1
- package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/tasks/PropagateDelayTask.js.map +1 -1
- package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/tasks/PropagateTrainDelayTask.js +1 -2
- package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/tasks/PropagateTrainDelayTask.js.map +1 -1
- package/dist/output-gateway/gtfs/models/GTFSRoutesModel.d.ts +2 -1
- package/dist/output-gateway/gtfs/models/GTFSRoutesModel.js +2 -1
- package/dist/output-gateway/gtfs/models/GTFSRoutesModel.js.map +1 -1
- package/dist/output-gateway/gtfs/models/GTFSStopModel.d.ts +2 -1
- package/dist/output-gateway/gtfs/models/GTFSStopModel.js +5 -2
- package/dist/output-gateway/gtfs/models/GTFSStopModel.js.map +1 -1
- package/dist/output-gateway/gtfs/routers/v1/V1GTFSRouter.js +9 -5
- package/dist/output-gateway/gtfs/routers/v1/V1GTFSRouter.js.map +1 -1
- package/dist/output-gateway/shared/data-access/GtfsFeedRepository.d.ts +13 -0
- package/dist/output-gateway/{gtfs → shared}/data-access/GtfsFeedRepository.js +11 -3
- package/dist/output-gateway/shared/data-access/GtfsFeedRepository.js.map +1 -0
- package/dist/output-gateway/vehicle-positions/data-access/interfaces/ITripWithPositionRepository.d.ts +2 -0
- package/dist/output-gateway/vehicle-positions/data-access/views/TripWithLastPositionRepository.d.ts +2 -0
- package/dist/output-gateway/vehicle-positions/data-access/views/TripWithLastPositionRepository.js +8 -0
- package/dist/output-gateway/vehicle-positions/data-access/views/TripWithLastPositionRepository.js.map +1 -1
- package/dist/output-gateway/vehicle-positions/routers/v1/V1VehiclePositionsRouter.d.ts +6 -0
- package/dist/output-gateway/vehicle-positions/routers/v1/V1VehiclePositionsRouter.js +19 -1
- package/dist/output-gateway/vehicle-positions/routers/v1/V1VehiclePositionsRouter.js.map +1 -1
- package/dist/schema-definitions/gtfs/GtfsPrecomputed.js +1 -1
- package/dist/schema-definitions/gtfs/GtfsPrecomputed.js.map +1 -1
- package/dist/schema-definitions/gtfs/const.d.ts +1 -1
- package/dist/schema-definitions/gtfs/const.js +1 -1
- package/dist/schema-definitions/vehicle-positions/interfaces/IMpvMessageInterfaces.d.ts +2 -2
- package/docs/asyncapi.yaml +2 -2
- package/docs/cache/types/redis.md +6 -6
- package/docs/follow-ups.md +124 -65
- package/docs/implementation_documentation.md +10 -10
- package/docs/openapi-input.yaml +5 -5
- package/docs/openapi-output.yaml +30 -60
- package/package.json +1 -1
- package/dist/output-gateway/gtfs/data-access/GtfsFeedRepository.d.ts +0 -11
- package/dist/output-gateway/gtfs/data-access/GtfsFeedRepository.js.map +0 -1
|
@@ -0,0 +1,53 @@
|
|
|
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
|
+
/**
|
|
11
|
+
* We receive the dbmigrate dependency from dbmigrate initially.
|
|
12
|
+
* This enables us to not have to rely on NODE_PATH.
|
|
13
|
+
*/
|
|
14
|
+
exports.setup = function(options, seedLink) {
|
|
15
|
+
dbm = options.dbmigrate;
|
|
16
|
+
type = dbm.dataType;
|
|
17
|
+
seed = seedLink;
|
|
18
|
+
Promise = options.Promise;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
exports.up = function(db) {
|
|
22
|
+
var filePath = path.join(__dirname, 'sqls', '20260820000000-widen-trip-number-up.sql');
|
|
23
|
+
return new Promise( function( resolve, reject ) {
|
|
24
|
+
fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){
|
|
25
|
+
if (err) return reject(err);
|
|
26
|
+
console.log('received data: ' + data);
|
|
27
|
+
|
|
28
|
+
resolve(data);
|
|
29
|
+
});
|
|
30
|
+
})
|
|
31
|
+
.then(function(data) {
|
|
32
|
+
return db.runSql(data);
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
exports.down = function(db) {
|
|
37
|
+
var filePath = path.join(__dirname, 'sqls', '20260820000000-widen-trip-number-down.sql');
|
|
38
|
+
return new Promise( function( resolve, reject ) {
|
|
39
|
+
fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){
|
|
40
|
+
if (err) return reject(err);
|
|
41
|
+
console.log('received data: ' + data);
|
|
42
|
+
|
|
43
|
+
resolve(data);
|
|
44
|
+
});
|
|
45
|
+
})
|
|
46
|
+
.then(function(data) {
|
|
47
|
+
return db.runSql(data);
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
exports._meta = {
|
|
52
|
+
"version": 1
|
|
53
|
+
};
|
|
@@ -28,8 +28,8 @@ ALTER TABLE ONLY public_transport.gtfs_feeds ALTER COLUMN feed_id SET DEFAULT ne
|
|
|
28
28
|
ALTER TABLE ONLY public_transport.gtfs_feeds ADD CONSTRAINT gtfs_feeds_pkey PRIMARY KEY (feed_id);
|
|
29
29
|
ALTER TABLE ONLY public_transport.gtfs_feeds ADD CONSTRAINT gtfs_feeds_code_key UNIQUE (code);
|
|
30
30
|
|
|
31
|
-
INSERT INTO public_transport.gtfs_feeds (code, name, timezone) VALUES ('
|
|
32
|
-
INSERT INTO public_transport.gtfs_feeds (code, name, timezone) VALUES ('kodis
|
|
31
|
+
INSERT INTO public_transport.gtfs_feeds (code, name, timezone) VALUES ('pid', 'Prague Integrated Transport', 'Europe/Prague');
|
|
32
|
+
INSERT INTO public_transport.gtfs_feeds (code, name, timezone) VALUES ('kodis', 'KODIS', 'Europe/Prague');
|
|
33
33
|
|
|
34
34
|
|
|
35
35
|
--
|
|
@@ -1608,7 +1608,7 @@ CREATE TABLE public_transport.gtfs_precomputed_trip_schedule (
|
|
|
1608
1608
|
first_stop_id character varying(255),
|
|
1609
1609
|
last_stop_id character varying(255),
|
|
1610
1610
|
origin_route_name character varying(50),
|
|
1611
|
-
trip_number
|
|
1611
|
+
trip_number integer,
|
|
1612
1612
|
route_licence_number bigint,
|
|
1613
1613
|
direction_id smallint,
|
|
1614
1614
|
shape_id character varying(15),
|
|
@@ -1699,7 +1699,7 @@ CREATE TABLE public_transport.gtfs_run_numbers (
|
|
|
1699
1699
|
update_batch_id bigint,
|
|
1700
1700
|
updated_at timestamp with time zone,
|
|
1701
1701
|
updated_by character varying(150),
|
|
1702
|
-
trip_number
|
|
1702
|
+
trip_number integer,
|
|
1703
1703
|
route_licence_number bigint,
|
|
1704
1704
|
feed_id integer NOT NULL
|
|
1705
1705
|
) PARTITION BY LIST (feed_id);
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
-- Narrowing back fails if any stored trip_number exceeds smallint -- delete such rows first.
|
|
2
|
+
ALTER TABLE public_transport.gtfs_precomputed_trip_schedule ALTER COLUMN trip_number TYPE smallint;
|
|
3
|
+
ALTER TABLE public_transport.gtfs_run_numbers ALTER COLUMN trip_number TYPE smallint;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
-- Widen trip_number: KODIS train numbers exceed smallint range (e.g. 95566).
|
|
2
|
+
-- ALTER on the partitioned parents cascades to all attached partitions; tmp tables are transient
|
|
3
|
+
-- (recreated per import via LIKE parent). No-op on fresh environments where the init migration
|
|
4
|
+
-- already creates these columns as integer.
|
|
5
|
+
ALTER TABLE public_transport.gtfs_precomputed_trip_schedule ALTER COLUMN trip_number TYPE integer;
|
|
6
|
+
ALTER TABLE public_transport.gtfs_run_numbers ALTER COLUMN trip_number TYPE integer;
|
|
@@ -18,7 +18,7 @@ class VehiclePositionsController extends controllers_1.BaseController {
|
|
|
18
18
|
/**
|
|
19
19
|
* Data processing
|
|
20
20
|
*/
|
|
21
|
-
this.processData = async (inputData, feedCode = "
|
|
21
|
+
this.processData = async (inputData, feedCode = "pid") => {
|
|
22
22
|
try {
|
|
23
23
|
if (!FEED_CODE_PATTERN.test(feedCode)) {
|
|
24
24
|
throw new golemio_errors_1.CustomError(`Invalid feedCode: "${feedCode}"`, true, this.name, 422);
|
|
@@ -12,10 +12,10 @@ class VehiclePositionsRouter extends AbstractRouter_1.AbstractRouter {
|
|
|
12
12
|
* Initiates all routes. Should respond with correct data to a HTTP requests to all routes.
|
|
13
13
|
*/
|
|
14
14
|
this.initRoutes = () => {
|
|
15
|
-
// :feedCode identifies which feed these positions belong to (e.g. "
|
|
15
|
+
// :feedCode identifies which feed these positions belong to (e.g. "pid"). Registered both with
|
|
16
16
|
// and without the segment (rather than an optional ":feedCode?", which the router's
|
|
17
17
|
// path-to-regexp version rejects) so the legacy producer posting to the bare path keeps working;
|
|
18
|
-
// the controller defaults a missing feedCode to "
|
|
18
|
+
// the controller defaults a missing feedCode to "pid".
|
|
19
19
|
this.router.post("/", (0, helpers_1.checkContentTypeMiddleware)(["text/xml"]), this.Post);
|
|
20
20
|
this.router.post("/:feedCode", (0, helpers_1.checkContentTypeMiddleware)(["text/xml"]), this.Post);
|
|
21
21
|
};
|
|
@@ -39,7 +39,7 @@ let GtfsFacade = class GtfsFacade {
|
|
|
39
39
|
this.databaseConnector = databaseConnector;
|
|
40
40
|
this.name = this.constructor.name;
|
|
41
41
|
this.checkSavedTmpTables = async (dataset, version, feedCode) => {
|
|
42
|
-
const tables = await this.gtfsMetadataRepository.getAllSaved(dataset, version);
|
|
42
|
+
const tables = await this.gtfsMetadataRepository.getAllSaved(dataset, version, feedCode);
|
|
43
43
|
const tablesArray = [];
|
|
44
44
|
for (const table of tables) {
|
|
45
45
|
const tmpTableName = gtfs_1.Gtfs[table.dataValues.tn].pgTableName + (0, FeedTableSuffix_1.feedTableSuffix)(SourceTableSuffixEnum_1.SourceTableSuffixEnum.Tmp, feedCode);
|
|
@@ -68,6 +68,7 @@ let GtfsFacade = class GtfsFacade {
|
|
|
68
68
|
const tables = await this.gtfsMetadataRepository.find({
|
|
69
69
|
attributes: [[sequelize_1.default.literal(`DISTINCT "key"`), "tn"]],
|
|
70
70
|
where: {
|
|
71
|
+
feed_id: feedId,
|
|
71
72
|
[sequelize_1.default.Op.or]: datasetInfo.map((item) => ({
|
|
72
73
|
dataset: item.dataset,
|
|
73
74
|
type: shared_1.MetaTypeEnum.STATE,
|
|
@@ -93,6 +94,7 @@ let GtfsFacade = class GtfsFacade {
|
|
|
93
94
|
await this.gtfsMetadataRepository.destroy({
|
|
94
95
|
transaction: t,
|
|
95
96
|
where: {
|
|
97
|
+
feed_id: feedId,
|
|
96
98
|
[sequelize_1.default.Op.or]: datasetInfo.map((item) => ({
|
|
97
99
|
dataset: item.dataset,
|
|
98
100
|
version: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GtfsFacade.js","sourceRoot":"","sources":["../../../src/integration-engine/gtfs/GtfsFacade.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,2DAM0C;AAC1C,sCAAiF;AACjF,0DAAuC;AACvC,wDAAmD;AAGnD,wEAAqE;AACrE,2EAAoE;AACpE,6EAAwE;AACxE,oFAAuE;AACvE,iEAAwE;AACxE,qEAAkE;AAClE,iEAA8D;AAC9D,+DAA4D;AAC5D,2EAAwE;AACxE,iEAA8D;AAC9D,gFAAuF;AAQhF,IAAM,UAAU,GAAhB,MAAM,UAAU;IAQnB,YAC+C,cAAsC,EAEjF,sBAAsD,EACN,mBAAiD,EAC5D,iBAA6C;QAJ/B,mBAAc,GAAd,cAAc,CAAgB;QAEzE,2BAAsB,GAAtB,sBAAsB,CAAwB;QACE,wBAAmB,GAAnB,mBAAmB,CAAsB;QACpD,sBAAiB,GAAjB,iBAAiB,CAAoB;QAZ9E,SAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QAoB9B,wBAAmB,GAAG,KAAK,EAAE,OAAe,EAAE,OAAe,EAAE,QAAgB,EAAiB,EAAE;YACrG,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"GtfsFacade.js","sourceRoot":"","sources":["../../../src/integration-engine/gtfs/GtfsFacade.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
import { GtfsFeedRepository } from "./data-access/GtfsFeedRepository";
|
|
2
|
-
import { MetaStateEnum, RopidMetadataModel } from "../shared";
|
|
2
|
+
import { ILastModifiedInfo, MetaStateEnum, RopidMetadataModel } from "../shared";
|
|
3
3
|
import { BulkCreateOptions, DestroyOptions } from "@golemio/core/dist/shared/sequelize";
|
|
4
4
|
export declare class GtfsMetadataRepository extends RopidMetadataModel {
|
|
5
5
|
private readonly feedRepository;
|
|
6
6
|
constructor(feedRepository: GtfsFeedRepository);
|
|
7
7
|
private readonly resolveFeedId;
|
|
8
|
-
getAllSaved: (dataset: string, version: number) => Promise<any[]>;
|
|
8
|
+
getAllSaved: (dataset: string, version: number, feedCode?: string) => Promise<any[]>;
|
|
9
9
|
checkAllTablesHasSavedState: (datasets: Array<{
|
|
10
10
|
dataset: string;
|
|
11
11
|
version: number;
|
|
12
|
-
}
|
|
13
|
-
checkIfNewVersionIsAlreadyDeployed: (dataset: string, version: number) => Promise<boolean>;
|
|
14
|
-
updateState: (dataset: string, name: string, state: MetaStateEnum, version: number) => Promise<any>;
|
|
15
|
-
getNumberOfDownloadRetries: (dataset: string, version: number) => Promise<number>;
|
|
12
|
+
}>, feedCode?: string) => Promise<boolean>;
|
|
13
|
+
checkIfNewVersionIsAlreadyDeployed: (dataset: string, version: number, feedCode?: string) => Promise<boolean>;
|
|
14
|
+
updateState: (dataset: string, name: string, state: MetaStateEnum, version: number, feedCode?: string) => Promise<any>;
|
|
15
|
+
getNumberOfDownloadRetries: (dataset: string, version: number, feedCode?: string) => Promise<number>;
|
|
16
|
+
getLastModified: (dataset: string, feedCode?: string) => Promise<ILastModifiedInfo>;
|
|
17
|
+
isDeployed: (dataset: string, feedCode?: string) => Promise<boolean>;
|
|
18
|
+
rollbackFailedSaving: (dataset: string, version: number, feedCode?: string) => Promise<any>;
|
|
16
19
|
save: (data: Record<string, unknown> | Array<Record<string, unknown>>, useTmpTable?: boolean, feedCode?: string) => Promise<any>;
|
|
17
20
|
bulkCreate: (data: Array<Record<string, unknown>>, options: BulkCreateOptions, feedCode?: string) => Promise<void>;
|
|
18
21
|
destroy: (options: DestroyOptions) => Promise<void>;
|
|
@@ -21,16 +21,18 @@ const GtfsContainerToken_1 = require("./ioc/GtfsContainerToken");
|
|
|
21
21
|
const shared_1 = require("../shared");
|
|
22
22
|
const gtfs_1 = require("../../schema-definitions/gtfs");
|
|
23
23
|
const GtfsMetadataDto_1 = require("../../schema-definitions/gtfs/models/GtfsMetadataDto");
|
|
24
|
+
const helpers_1 = require("@golemio/core/dist/integration-engine/helpers");
|
|
24
25
|
const sequelize_1 = __importDefault(require("@golemio/core/dist/shared/sequelize"));
|
|
25
26
|
const tsyringe_1 = require("@golemio/core/dist/shared/tsyringe");
|
|
26
27
|
let GtfsMetadataRepository = class GtfsMetadataRepository extends shared_1.RopidMetadataModel {
|
|
27
28
|
constructor(feedRepository) {
|
|
28
29
|
super(gtfs_1.Gtfs, GtfsMetadataDto_1.GtfsMetadataDto.attributeModel, GtfsMetadataDto_1.GtfsMetadataDto.jsonSchema);
|
|
29
30
|
this.feedRepository = feedRepository;
|
|
30
|
-
// defaults to "
|
|
31
|
+
// defaults to "pid" for call sites that predate multi-feed support (e.g. departures-presets,
|
|
31
32
|
// run-numbers) and don't yet pass their own feedCode -- see Project Direction in CLAUDE.md
|
|
32
|
-
this.resolveFeedId = (feedCode = "
|
|
33
|
-
this.getAllSaved = async (dataset, version) => {
|
|
33
|
+
this.resolveFeedId = (feedCode = "pid") => this.feedRepository.getFeedIdByCode(feedCode);
|
|
34
|
+
this.getAllSaved = async (dataset, version, feedCode) => {
|
|
35
|
+
const feed_id = await this.resolveFeedId(feedCode);
|
|
34
36
|
const tables = await this.sequelizeModel.findAll({
|
|
35
37
|
attributes: [["key", "tn"]],
|
|
36
38
|
where: {
|
|
@@ -38,13 +40,16 @@ let GtfsMetadataRepository = class GtfsMetadataRepository extends shared_1.Ropid
|
|
|
38
40
|
type: shared_1.MetaTypeEnum.STATE,
|
|
39
41
|
value: shared_1.MetaStateEnum.SAVED,
|
|
40
42
|
version,
|
|
43
|
+
feed_id,
|
|
41
44
|
},
|
|
42
45
|
});
|
|
43
46
|
return tables;
|
|
44
47
|
};
|
|
45
|
-
this.checkAllTablesHasSavedState = async (datasets) => {
|
|
48
|
+
this.checkAllTablesHasSavedState = async (datasets, feedCode) => {
|
|
49
|
+
const feed_id = await this.resolveFeedId(feedCode);
|
|
46
50
|
const notSaved = await this.sequelizeModel.count({
|
|
47
51
|
where: {
|
|
52
|
+
feed_id,
|
|
48
53
|
[sequelize_1.default.Op.or]: datasets.map((item) => ({
|
|
49
54
|
dataset: item.dataset,
|
|
50
55
|
version: item.version,
|
|
@@ -55,7 +60,8 @@ let GtfsMetadataRepository = class GtfsMetadataRepository extends shared_1.Ropid
|
|
|
55
60
|
});
|
|
56
61
|
return notSaved === 0;
|
|
57
62
|
};
|
|
58
|
-
this.checkIfNewVersionIsAlreadyDeployed = async (dataset, version) => {
|
|
63
|
+
this.checkIfNewVersionIsAlreadyDeployed = async (dataset, version, feedCode) => {
|
|
64
|
+
const feed_id = await this.resolveFeedId(feedCode);
|
|
59
65
|
const alreadyDeployed = await this.sequelizeModel.count({
|
|
60
66
|
where: {
|
|
61
67
|
dataset,
|
|
@@ -63,11 +69,13 @@ let GtfsMetadataRepository = class GtfsMetadataRepository extends shared_1.Ropid
|
|
|
63
69
|
type: shared_1.MetaTypeEnum.DATASET_INFO,
|
|
64
70
|
value: "true",
|
|
65
71
|
version,
|
|
72
|
+
feed_id,
|
|
66
73
|
},
|
|
67
74
|
});
|
|
68
75
|
return alreadyDeployed !== 0;
|
|
69
76
|
};
|
|
70
|
-
this.updateState = async (dataset, name, state, version) => {
|
|
77
|
+
this.updateState = async (dataset, name, state, version, feedCode) => {
|
|
78
|
+
const feed_id = await this.resolveFeedId(feedCode);
|
|
71
79
|
return this.sequelizeModel.update({
|
|
72
80
|
dataset,
|
|
73
81
|
key: name,
|
|
@@ -80,10 +88,12 @@ let GtfsMetadataRepository = class GtfsMetadataRepository extends shared_1.Ropid
|
|
|
80
88
|
key: name,
|
|
81
89
|
type: shared_1.MetaTypeEnum.STATE,
|
|
82
90
|
version,
|
|
91
|
+
feed_id,
|
|
83
92
|
},
|
|
84
93
|
});
|
|
85
94
|
};
|
|
86
|
-
this.getNumberOfDownloadRetries = async (dataset, version) => {
|
|
95
|
+
this.getNumberOfDownloadRetries = async (dataset, version, feedCode) => {
|
|
96
|
+
const feed_id = await this.resolveFeedId(feedCode);
|
|
87
97
|
const numberOfRetries = await this.sequelizeModel.findOne({
|
|
88
98
|
attributes: [["value", "retries"]],
|
|
89
99
|
where: {
|
|
@@ -91,6 +101,7 @@ let GtfsMetadataRepository = class GtfsMetadataRepository extends shared_1.Ropid
|
|
|
91
101
|
key: shared_1.MetaDatasetInfoKeyEnum.NUMBER_OF_RETRIES,
|
|
92
102
|
type: shared_1.MetaTypeEnum.DATASET_INFO,
|
|
93
103
|
version: version - 1,
|
|
104
|
+
feed_id,
|
|
94
105
|
},
|
|
95
106
|
});
|
|
96
107
|
if (!numberOfRetries) {
|
|
@@ -98,6 +109,90 @@ let GtfsMetadataRepository = class GtfsMetadataRepository extends shared_1.Ropid
|
|
|
98
109
|
}
|
|
99
110
|
return +numberOfRetries.dataValues.retries;
|
|
100
111
|
};
|
|
112
|
+
// Overrides shadowing the feed-blind base implementations. Both base and subclass define these as
|
|
113
|
+
// arrow-function class properties, so the subclass initializer (running after super()) wins for
|
|
114
|
+
// every dispatch, including base-internal `this.` calls. The base stays untouched because its
|
|
115
|
+
// other subclass (ropid-vymi) backs a table without feed_id.
|
|
116
|
+
this.getLastModified = async (dataset, feedCode) => {
|
|
117
|
+
try {
|
|
118
|
+
const feed_id = await this.resolveFeedId(feedCode);
|
|
119
|
+
const lastMod = await this.sequelizeModel.findOne({
|
|
120
|
+
order: [["version", "DESC"]],
|
|
121
|
+
where: {
|
|
122
|
+
dataset,
|
|
123
|
+
key: shared_1.MetaDatasetInfoKeyEnum.LAST_MODIFIED,
|
|
124
|
+
type: shared_1.MetaTypeEnum.DATASET_INFO,
|
|
125
|
+
feed_id,
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
return lastMod
|
|
129
|
+
? {
|
|
130
|
+
lastModified: lastMod.dataValues ? lastMod.dataValues.value : null,
|
|
131
|
+
version: lastMod.dataValues ? parseInt(lastMod.dataValues.version, 10) : 1,
|
|
132
|
+
}
|
|
133
|
+
: {
|
|
134
|
+
lastModified: null,
|
|
135
|
+
version: 0,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
helpers_1.log.warn(err);
|
|
140
|
+
return {
|
|
141
|
+
lastModified: null,
|
|
142
|
+
version: 0,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
this.isDeployed = async (dataset, feedCode) => {
|
|
147
|
+
try {
|
|
148
|
+
const feed_id = await this.resolveFeedId(feedCode);
|
|
149
|
+
const metaRecord = await this.sequelizeModel.findOne({
|
|
150
|
+
attributes: ["key", "value"],
|
|
151
|
+
where: {
|
|
152
|
+
dataset,
|
|
153
|
+
type: shared_1.MetaTypeEnum.DATASET_INFO,
|
|
154
|
+
feed_id,
|
|
155
|
+
},
|
|
156
|
+
order: [
|
|
157
|
+
["version", "DESC"],
|
|
158
|
+
["id", "DESC"],
|
|
159
|
+
],
|
|
160
|
+
raw: true,
|
|
161
|
+
});
|
|
162
|
+
return !!(metaRecord?.key === shared_1.MetaDatasetInfoKeyEnum.DEPLOYED && metaRecord.value === "true");
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
helpers_1.log.warn(err);
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
this.rollbackFailedSaving = async (dataset, version, feedCode) => {
|
|
170
|
+
await this.save({
|
|
171
|
+
dataset,
|
|
172
|
+
key: shared_1.MetaDatasetInfoKeyEnum.FAILED,
|
|
173
|
+
type: shared_1.MetaTypeEnum.DATASET_INFO,
|
|
174
|
+
value: new Date().toISOString(),
|
|
175
|
+
version,
|
|
176
|
+
}, undefined, feedCode);
|
|
177
|
+
const feed_id = await this.resolveFeedId(feedCode);
|
|
178
|
+
const numberOfRetries = (await this.sequelizeModel.findOne({
|
|
179
|
+
attributes: [["value", "retries"]],
|
|
180
|
+
where: {
|
|
181
|
+
dataset,
|
|
182
|
+
key: shared_1.MetaDatasetInfoKeyEnum.NUMBER_OF_RETRIES,
|
|
183
|
+
type: shared_1.MetaTypeEnum.DATASET_INFO,
|
|
184
|
+
version: version - 1,
|
|
185
|
+
feed_id,
|
|
186
|
+
},
|
|
187
|
+
}))?.dataValues?.retries ?? 0;
|
|
188
|
+
await this.save({
|
|
189
|
+
dataset,
|
|
190
|
+
key: shared_1.MetaDatasetInfoKeyEnum.NUMBER_OF_RETRIES,
|
|
191
|
+
type: shared_1.MetaTypeEnum.DATASET_INFO,
|
|
192
|
+
value: +numberOfRetries + 1,
|
|
193
|
+
version,
|
|
194
|
+
}, undefined, feedCode);
|
|
195
|
+
};
|
|
101
196
|
// useTmpTable is unused here (gtfs_metadata has no tmp-table concept) -- kept as position 2 to
|
|
102
197
|
// stay LSP-compatible with PostgresModel.save's signature; feedCode is this override's own addition
|
|
103
198
|
this.save = async (data, useTmpTable, feedCode) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GtfsMetadataRepository.js","sourceRoot":"","sources":["../../../src/integration-engine/gtfs/GtfsMetadataRepository.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,yEAA6E;AAC7E,iEAAqE;AACrE,
|
|
1
|
+
{"version":3,"file":"GtfsMetadataRepository.js","sourceRoot":"","sources":["../../../src/integration-engine/gtfs/GtfsMetadataRepository.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,13 @@
|
|
|
1
|
+
import { ITripStopsCacheDto } from "../../../../schema-definitions/vehicle-positions/redis/interfaces/ITripStopsCacheDto";
|
|
1
2
|
import { RedisModel } from "@golemio/core/dist/integration-engine/models/RedisModel";
|
|
2
3
|
export declare class BlockStopsRedisRepository extends RedisModel {
|
|
3
4
|
static NAMESPACE_PREFIX: string;
|
|
4
5
|
constructor();
|
|
6
|
+
/**
|
|
7
|
+
* Keys are feed-namespaced (block ids are only unique within a feed). Use these methods instead
|
|
8
|
+
* of the base get/set so no call site can construct an unqualified key. A nullish block id
|
|
9
|
+
* interpolates as "null"/"undefined" (a guaranteed cache miss), same as the former inline keys.
|
|
10
|
+
*/
|
|
11
|
+
getBlockSchedule(feedId: number, blockId: string | null | undefined): Promise<ITripStopsCacheDto | null>;
|
|
12
|
+
setBlockSchedule(feedId: number, blockId: string, data: ITripStopsCacheDto, expireTimestamp?: number): Promise<any>;
|
|
5
13
|
}
|
|
@@ -24,6 +24,17 @@ let BlockStopsRedisRepository = BlockStopsRedisRepository_1 = class BlockStopsRe
|
|
|
24
24
|
prefix: BlockStopsRedisRepository_1.NAMESPACE_PREFIX,
|
|
25
25
|
}, new golemio_validator_1.JSONSchemaValidator("GTFSBlockStopsRedisRepositoryValidator", TripStopsCacheDtoSchema_1.TripStopsCacheDtoSchema));
|
|
26
26
|
}
|
|
27
|
+
/**
|
|
28
|
+
* Keys are feed-namespaced (block ids are only unique within a feed). Use these methods instead
|
|
29
|
+
* of the base get/set so no call site can construct an unqualified key. A nullish block id
|
|
30
|
+
* interpolates as "null"/"undefined" (a guaranteed cache miss), same as the former inline keys.
|
|
31
|
+
*/
|
|
32
|
+
getBlockSchedule(feedId, blockId) {
|
|
33
|
+
return this.get(`${feedId}_${blockId}`);
|
|
34
|
+
}
|
|
35
|
+
setBlockSchedule(feedId, blockId, data, expireTimestamp) {
|
|
36
|
+
return this.set(`${feedId}_${blockId}`, data, undefined, expireTimestamp);
|
|
37
|
+
}
|
|
27
38
|
};
|
|
28
39
|
exports.BlockStopsRedisRepository = BlockStopsRedisRepository;
|
|
29
40
|
BlockStopsRedisRepository.NAMESPACE_PREFIX = "ptGtfsBlockSchedule";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BlockStopsRedisRepository.js","sourceRoot":"","sources":["../../../../../src/integration-engine/gtfs/data-access/cache/BlockStopsRedisRepository.ts"],"names":[],"mappings":";;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"BlockStopsRedisRepository.js","sourceRoot":"","sources":["../../../../../src/integration-engine/gtfs/data-access/cache/BlockStopsRedisRepository.ts"],"names":[],"mappings":";;;;;;;;;;;;;AACA,oIAAuG;AACvG,wFAAqF;AACrF,mFAAkF;AAClF,iEAAgE;AAGzD,IAAM,yBAAyB,iCAA/B,MAAM,yBAA0B,SAAQ,uBAAU;IAGrD;QACI,KAAK,CACD,+BAA+B,EAC/B;YACI,kBAAkB,EAAE,IAAI,CAAC,KAAK;YAC9B,oBAAoB,EAAE,IAAI,CAAC,SAAS;YACpC,wBAAwB,EAAE,KAAK;YAC/B,MAAM,EAAE,2BAAyB,CAAC,gBAAgB;SACrD,EACD,IAAI,uCAAmB,CAAC,wCAAwC,EAAE,iDAAuB,CAAC,CAC7F,CAAC;IACN,CAAC;IAED;;;;OAIG;IACI,gBAAgB,CAAC,MAAc,EAAE,OAAkC;QACtE,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,OAAO,EAAE,CAAC,CAAC;IAC5C,CAAC;IAEM,gBAAgB,CAAC,MAAc,EAAE,OAAe,EAAE,IAAwB,EAAE,eAAwB;QACvG,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;IAC9E,CAAC;;AA3BQ,8DAAyB;AACpB,0CAAgB,GAAG,qBAAqB,AAAxB,CAAyB;oCAD9C,yBAAyB;IADrC,IAAA,qBAAU,GAAE;;GACA,yBAAyB,CA4BrC"}
|
|
@@ -1,5 +1,13 @@
|
|
|
1
|
+
import { IGtfsRunTripCacheDto } from "../../../../schema-definitions/vehicle-positions/redis/interfaces/IGtfsRunTripCacheDto";
|
|
1
2
|
import { RedisModel } from "@golemio/core/dist/integration-engine/models/RedisModel";
|
|
2
3
|
export declare class RunTripsRedisRepository extends RedisModel {
|
|
3
4
|
static NAMESPACE_PREFIX: string;
|
|
4
5
|
constructor();
|
|
6
|
+
/**
|
|
7
|
+
* Keys are feed-namespaced (route/run numbers are only unique within a feed). Use these methods
|
|
8
|
+
* instead of the base get/set so no call site can construct an unqualified key. Nullish route/run
|
|
9
|
+
* values interpolate as "null"/"undefined" (a guaranteed cache miss), same as the former inline keys.
|
|
10
|
+
*/
|
|
11
|
+
getRunSchedule(feedId: number, routeId: string | null | undefined, runNumber: string | number | null | undefined): Promise<IGtfsRunTripCacheDto | null>;
|
|
12
|
+
setRunSchedule(feedId: number, routeId: string, runNumber: string | number, data: IGtfsRunTripCacheDto, expireTimestamp?: number): Promise<any>;
|
|
5
13
|
}
|
|
@@ -14,6 +14,17 @@ class RunTripsRedisRepository extends RedisModel_1.RedisModel {
|
|
|
14
14
|
prefix: RunTripsRedisRepository.NAMESPACE_PREFIX,
|
|
15
15
|
}, new golemio_validator_1.JSONSchemaValidator("GTFSRunTripsRedisRepositoryValidator", GtfsRunTripCacheDtoSchema_1.GtfsRunTripCacheDtoSchema));
|
|
16
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* Keys are feed-namespaced (route/run numbers are only unique within a feed). Use these methods
|
|
19
|
+
* instead of the base get/set so no call site can construct an unqualified key. Nullish route/run
|
|
20
|
+
* values interpolate as "null"/"undefined" (a guaranteed cache miss), same as the former inline keys.
|
|
21
|
+
*/
|
|
22
|
+
getRunSchedule(feedId, routeId, runNumber) {
|
|
23
|
+
return this.get(`${feedId}_${routeId}_${runNumber}`);
|
|
24
|
+
}
|
|
25
|
+
setRunSchedule(feedId, routeId, runNumber, data, expireTimestamp) {
|
|
26
|
+
return this.set(`${feedId}_${routeId}_${runNumber}`, data, undefined, expireTimestamp);
|
|
27
|
+
}
|
|
17
28
|
}
|
|
18
29
|
exports.RunTripsRedisRepository = RunTripsRedisRepository;
|
|
19
30
|
RunTripsRedisRepository.NAMESPACE_PREFIX = const_1.GTFS_RUN_SCHEDULE_NAMESPACE_PREFIX;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RunTripsRedisRepository.js","sourceRoot":"","sources":["../../../../../src/integration-engine/gtfs/data-access/cache/RunTripsRedisRepository.ts"],"names":[],"mappings":";;;AAAA,2EAA2E;
|
|
1
|
+
{"version":3,"file":"RunTripsRedisRepository.js","sourceRoot":"","sources":["../../../../../src/integration-engine/gtfs/data-access/cache/RunTripsRedisRepository.ts"],"names":[],"mappings":";;;AAAA,2EAA2E;AAE3E,wIAA2G;AAC3G,wFAAqF;AACrF,mFAAkF;AAElF,MAAa,uBAAwB,SAAQ,uBAAU;IAGnD;QACI,KAAK,CACD,6BAA6B,EAC7B;YACI,kBAAkB,EAAE,IAAI,CAAC,KAAK;YAC9B,oBAAoB,EAAE,IAAI,CAAC,SAAS;YACpC,wBAAwB,EAAE,KAAK;YAC/B,MAAM,EAAE,uBAAuB,CAAC,gBAAgB;SACnD,EACD,IAAI,uCAAmB,CAAC,sCAAsC,EAAE,qDAAyB,CAAC,CAC7F,CAAC;IACN,CAAC;IAED;;;;OAIG;IACI,cAAc,CACjB,MAAc,EACd,OAAkC,EAClC,SAA6C;QAE7C,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,OAAO,IAAI,SAAS,EAAE,CAAC,CAAC;IACzD,CAAC;IAEM,cAAc,CACjB,MAAc,EACd,OAAe,EACf,SAA0B,EAC1B,IAA0B,EAC1B,eAAwB;QAExB,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,OAAO,IAAI,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;IAC3F,CAAC;;AArCL,0DAsCC;AArCiB,wCAAgB,GAAG,0CAAkC,CAAC"}
|
|
@@ -5,5 +5,33 @@ import { SourceTableSuffixEnum } from "../../helpers/SourceTableSuffixEnum";
|
|
|
5
5
|
export declare class TripScheduleRepository extends PostgresModel implements IModel {
|
|
6
6
|
constructor();
|
|
7
7
|
findAll: (options: FindOptions) => Promise<IScheduleDto[]>;
|
|
8
|
+
/**
|
|
9
|
+
* The schedule rows (the CIS lin/spoj <-> GTFS trip crosswalk the MPV matcher reads) can come from
|
|
10
|
+
* two sources:
|
|
11
|
+
* - the ROPID RUN_NUMBERS dataset (`gtfs_run_numbers`) when the feed delivers it (PID) — richer,
|
|
12
|
+
* it also carries the vehicle run number used by the runs pipelines and run-based delay propagation;
|
|
13
|
+
* - the feed's own GTFS identifiers otherwise (e.g. kodis): `route_id` IS the CIS licence number and
|
|
14
|
+
* the second `_`-separated segment of `trip_id` is the CIS trip number, so both matching columns are
|
|
15
|
+
* derived directly; `run_number` stays NULL, which disables run-based delay propagation for the feed
|
|
16
|
+
* (see docs/follow-ups.md).
|
|
17
|
+
* The strategy is picked per feed from data presence, so a feed that starts delivering run numbers
|
|
18
|
+
* upgrades automatically on its next import/refresh.
|
|
19
|
+
*/
|
|
8
20
|
populate: (sourceTableSuffix: SourceTableSuffixEnum, feedCode: string, feedId: number) => Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* A feed imported without the RUN_NUMBERS dataset has an empty (import path — `gtfs_prepareTmpTables`
|
|
23
|
+
* creates every source tmp table) or entirely missing (refresh path — the hotswap only ever attaches
|
|
24
|
+
* staged tables) run_numbers table; both mean "derive the identifiers from GTFS".
|
|
25
|
+
*/
|
|
26
|
+
private hasRunNumbersData;
|
|
27
|
+
/** Original strategy: the ROPID crosswalk is the root; it owns licence/trip/run numbers. */
|
|
28
|
+
private buildRunNumbersSql;
|
|
29
|
+
/**
|
|
30
|
+
* GTFS-derived strategy: `gtfs_trips` is the root. Verified against the kodis feed (2026-08-20):
|
|
31
|
+
* bus `route_id` is the 6-digit CIS licence number and `trip_id` is
|
|
32
|
+
* `<route_id>_<cisTripNumber>_<validFrom>` (odd/even trip numbers match direction_id on all bus
|
|
33
|
+
* trips). Non-numeric values (train route ids like "S1") yield NULL licence numbers, which simply
|
|
34
|
+
* never match — trains are matched by the separate gtfs_trips-based train matcher anyway.
|
|
35
|
+
*/
|
|
36
|
+
private buildGtfsDerivedSql;
|
|
9
37
|
}
|