@golemio/public-transport 0.1.0-dev.2772532070 → 0.1.0-dev.2775960314

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/db/migrations/postgresql/20260820000000-widen-trip-number.js +53 -0
  2. package/db/migrations/postgresql/sqls/20260813000000-init-schema-up.sql +4 -4
  3. package/db/migrations/postgresql/sqls/20260820000000-widen-trip-number-down.sql +3 -0
  4. package/db/migrations/postgresql/sqls/20260820000000-widen-trip-number-up.sql +6 -0
  5. package/dist/input-gateway/vehicle-positions/VehiclePositionsController.js +1 -1
  6. package/dist/input-gateway/vehicle-positions/VehiclePositionsRouter.js +2 -2
  7. package/dist/integration-engine/gtfs/GtfsFacade.js +3 -1
  8. package/dist/integration-engine/gtfs/GtfsFacade.js.map +1 -1
  9. package/dist/integration-engine/gtfs/GtfsMetadataRepository.d.ts +9 -6
  10. package/dist/integration-engine/gtfs/GtfsMetadataRepository.js +102 -7
  11. package/dist/integration-engine/gtfs/GtfsMetadataRepository.js.map +1 -1
  12. package/dist/integration-engine/gtfs/data-access/cache/BlockStopsRedisRepository.d.ts +8 -0
  13. package/dist/integration-engine/gtfs/data-access/cache/BlockStopsRedisRepository.js +11 -0
  14. package/dist/integration-engine/gtfs/data-access/cache/BlockStopsRedisRepository.js.map +1 -1
  15. package/dist/integration-engine/gtfs/data-access/cache/RunTripsRedisRepository.d.ts +8 -0
  16. package/dist/integration-engine/gtfs/data-access/cache/RunTripsRedisRepository.js +11 -0
  17. package/dist/integration-engine/gtfs/data-access/cache/RunTripsRedisRepository.js.map +1 -1
  18. package/dist/integration-engine/gtfs/data-access/precomputed/TripScheduleRepository.d.ts +28 -0
  19. package/dist/integration-engine/gtfs/data-access/precomputed/TripScheduleRepository.js +127 -13
  20. package/dist/integration-engine/gtfs/data-access/precomputed/TripScheduleRepository.js.map +1 -1
  21. package/dist/integration-engine/gtfs/facade/DeparturePresetsFacade.js +1 -1
  22. package/dist/integration-engine/gtfs/workers/timetables/tasks/CheckSavedRowsAndReplaceTablesTask.js +20 -17
  23. package/dist/integration-engine/gtfs/workers/timetables/tasks/CheckSavedRowsAndReplaceTablesTask.js.map +1 -1
  24. package/dist/integration-engine/gtfs/workers/timetables/tasks/DownloadDatasetsTask.js +2 -2
  25. package/dist/integration-engine/gtfs/workers/timetables/tasks/DownloadDatasetsTask.js.map +1 -1
  26. package/dist/integration-engine/gtfs/workers/timetables/tasks/ImportGtfsFromStorageTask.js +2 -2
  27. package/dist/integration-engine/gtfs/workers/timetables/tasks/ImportGtfsFromStorageTask.js.map +1 -1
  28. package/dist/integration-engine/gtfs/workers/timetables/tasks/SaveStaticDataTask.js +2 -2
  29. package/dist/integration-engine/gtfs/workers/timetables/tasks/TransformAndSaveDataTask.js +2 -2
  30. package/dist/integration-engine/gtfs/workers/timetables/tasks/TransformAndSaveDataTask.js.map +1 -1
  31. package/dist/integration-engine/jis/repositories/DeparturesPresetsRoutesRepository.js +1 -1
  32. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/helpers/TripStopsManager.js +2 -4
  33. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/helpers/TripStopsManager.js.map +1 -1
  34. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/helpers/gtfs-trip-run/AbstractGTFSTripRunManager.js +2 -4
  35. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/helpers/gtfs-trip-run/AbstractGTFSTripRunManager.js.map +1 -1
  36. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/tasks/PropagateDelayTask.js +1 -1
  37. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/tasks/PropagateDelayTask.js.map +1 -1
  38. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/tasks/PropagateTrainDelayTask.js +1 -2
  39. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/tasks/PropagateTrainDelayTask.js.map +1 -1
  40. package/dist/output-gateway/gtfs/models/GTFSRoutesModel.d.ts +2 -1
  41. package/dist/output-gateway/gtfs/models/GTFSRoutesModel.js +2 -1
  42. package/dist/output-gateway/gtfs/models/GTFSRoutesModel.js.map +1 -1
  43. package/dist/output-gateway/gtfs/models/GTFSStopModel.d.ts +2 -1
  44. package/dist/output-gateway/gtfs/models/GTFSStopModel.js +5 -2
  45. package/dist/output-gateway/gtfs/models/GTFSStopModel.js.map +1 -1
  46. package/dist/output-gateway/gtfs/routers/v1/V1GTFSRouter.js +9 -5
  47. package/dist/output-gateway/gtfs/routers/v1/V1GTFSRouter.js.map +1 -1
  48. package/dist/output-gateway/shared/data-access/GtfsFeedRepository.d.ts +13 -0
  49. package/dist/output-gateway/{gtfs → shared}/data-access/GtfsFeedRepository.js +11 -3
  50. package/dist/output-gateway/shared/data-access/GtfsFeedRepository.js.map +1 -0
  51. package/dist/output-gateway/vehicle-positions/data-access/interfaces/ITripWithPositionRepository.d.ts +2 -0
  52. package/dist/output-gateway/vehicle-positions/data-access/views/TripWithLastPositionRepository.d.ts +2 -0
  53. package/dist/output-gateway/vehicle-positions/data-access/views/TripWithLastPositionRepository.js +8 -0
  54. package/dist/output-gateway/vehicle-positions/data-access/views/TripWithLastPositionRepository.js.map +1 -1
  55. package/dist/output-gateway/vehicle-positions/routers/v1/V1VehiclePositionsRouter.d.ts +6 -0
  56. package/dist/output-gateway/vehicle-positions/routers/v1/V1VehiclePositionsRouter.js +19 -1
  57. package/dist/output-gateway/vehicle-positions/routers/v1/V1VehiclePositionsRouter.js.map +1 -1
  58. package/dist/schema-definitions/gtfs/GtfsPrecomputed.js +1 -1
  59. package/dist/schema-definitions/gtfs/GtfsPrecomputed.js.map +1 -1
  60. package/dist/schema-definitions/gtfs/const.d.ts +1 -1
  61. package/dist/schema-definitions/gtfs/const.js +1 -1
  62. package/dist/schema-definitions/vehicle-positions/interfaces/IMpvMessageInterfaces.d.ts +2 -2
  63. package/docs/asyncapi.yaml +2 -2
  64. package/docs/cache/types/redis.md +6 -6
  65. package/docs/follow-ups.md +124 -65
  66. package/docs/implementation_documentation.md +10 -10
  67. package/docs/openapi-input.yaml +5 -5
  68. package/docs/openapi-output.yaml +30 -60
  69. package/package.json +1 -1
  70. package/dist/output-gateway/gtfs/data-access/GtfsFeedRepository.d.ts +0 -11
  71. 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 ('PID', 'Prague Integrated Transport', 'Europe/Prague');
32
- INSERT INTO public_transport.gtfs_feeds (code, name, timezone) VALUES ('kodis-czechia-cz', 'KODIS', 'Europe/Prague');
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 smallint,
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 smallint,
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 = "PID") => {
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. "PID"). Registered both with
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 "PID".
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":"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"}
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
- }>) => Promise<boolean>;
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 "PID" for call sites that predate multi-feed support (e.g. departures-presets,
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 = "PID") => this.feedRepository.getFeedIdByCode(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":"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"}
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":";;;;;;;;;;;;;AAAA,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;;AAdQ,8DAAyB;AACpB,0CAAgB,GAAG,qBAAqB,AAAxB,CAAyB;oCAD9C,yBAAyB;IADrC,IAAA,qBAAU,GAAE;;GACA,yBAAyB,CAerC"}
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;AAC3E,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;;AAdL,0DAeC;AAdiB,wCAAgB,GAAG,0CAAkC,CAAC"}
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
  }