@golemio/pid 3.5.0 → 3.5.1-dev.1632490375

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 (59) hide show
  1. package/db/migrations/postgresql/20250103092631-skip-missing.js +53 -0
  2. package/db/migrations/postgresql/sqls/20250103092631-skip-missing-down.sql +184 -0
  3. package/db/migrations/postgresql/sqls/20250103092631-skip-missing-up.sql +195 -0
  4. package/dist/integration-engine/ropid-gtfs/data-access/cache/RunTripsRedisRepository.js +2 -1
  5. package/dist/integration-engine/ropid-gtfs/data-access/cache/RunTripsRedisRepository.js.map +1 -1
  6. package/dist/integration-engine/vehicle-positions/workers/vehicle-positions/tasks/PropagateTrainDelayTask.js.map +1 -1
  7. package/dist/output-gateway/pid/controllers/v2/V2DepartureBoardsController.js +1 -3
  8. package/dist/output-gateway/pid/controllers/v2/V2DepartureBoardsController.js.map +1 -1
  9. package/dist/output-gateway/pid/controllers/v3/V3TransferBoardsController.d.ts +1 -0
  10. package/dist/output-gateway/pid/controllers/v3/V3TransferBoardsController.js +12 -3
  11. package/dist/output-gateway/pid/controllers/v3/V3TransferBoardsController.js.map +1 -1
  12. package/dist/output-gateway/pid/domain/DepartureInterfaces.d.ts +7 -0
  13. package/dist/output-gateway/pid/domain/DepartureInterfaces.js +3 -0
  14. package/dist/output-gateway/pid/domain/DepartureInterfaces.js.map +1 -0
  15. package/dist/output-gateway/pid/index.d.ts +4 -5
  16. package/dist/output-gateway/pid/index.js +1 -0
  17. package/dist/output-gateway/pid/index.js.map +1 -1
  18. package/dist/output-gateway/pid/ioc/Di.js +4 -0
  19. package/dist/output-gateway/pid/ioc/Di.js.map +1 -1
  20. package/dist/output-gateway/pid/ioc/OgPidToken.d.ts +2 -0
  21. package/dist/output-gateway/pid/ioc/OgPidToken.js +2 -0
  22. package/dist/output-gateway/pid/ioc/OgPidToken.js.map +1 -1
  23. package/dist/output-gateway/pid/models/PIDDepartureBoardsModel.d.ts +14 -28
  24. package/dist/output-gateway/pid/models/PIDDepartureBoardsModel.js +192 -71
  25. package/dist/output-gateway/pid/models/PIDDepartureBoardsModel.js.map +1 -1
  26. package/dist/output-gateway/pid/models/helpers/PIDDepartureModel.js +27 -15
  27. package/dist/output-gateway/pid/models/helpers/PIDDepartureModel.js.map +1 -1
  28. package/dist/output-gateway/pid/models/helpers/SkipHelper.d.ts +19 -0
  29. package/dist/output-gateway/pid/models/helpers/SkipHelper.js +116 -0
  30. package/dist/output-gateway/pid/models/helpers/SkipHelper.js.map +1 -0
  31. package/dist/output-gateway/pid/models/helpers/const.d.ts +4 -0
  32. package/dist/output-gateway/pid/models/helpers/const.js +8 -0
  33. package/dist/output-gateway/pid/models/helpers/const.js.map +1 -0
  34. package/dist/output-gateway/pid/models/helpers/interfaces/IPIDDepartureQueryOptions.d.ts +4 -1
  35. package/dist/output-gateway/pid/models/interfaces/IGetDeparturesOptions.d.ts +21 -0
  36. package/dist/output-gateway/pid/models/interfaces/IGetDeparturesOptions.js +3 -0
  37. package/dist/output-gateway/pid/models/interfaces/IGetDeparturesOptions.js.map +1 -0
  38. package/dist/output-gateway/pid/routers/v3/V3PIDRouter.js +1 -1
  39. package/dist/output-gateway/pid/routers/v3/V3PIDRouter.js.map +1 -1
  40. package/dist/output-gateway/pid/service/facade/TransferFacade.d.ts +1 -1
  41. package/dist/output-gateway/pid/service/facade/TransferFacade.js +2 -0
  42. package/dist/output-gateway/pid/service/facade/TransferFacade.js.map +1 -1
  43. package/dist/output-gateway/public/data-access/redis/PublicVehiclePositionsRepository.d.ts +4 -2
  44. package/dist/output-gateway/public/data-access/redis/PublicVehiclePositionsRepository.js +90 -68
  45. package/dist/output-gateway/public/data-access/redis/PublicVehiclePositionsRepository.js.map +1 -1
  46. package/dist/output-gateway/public/domain/repository/IVehiclePositionsRepository.d.ts +2 -1
  47. package/dist/output-gateway/ropid-gtfs/data-access/redis/RunTripsRedisRepository.d.ts +10 -0
  48. package/dist/output-gateway/ropid-gtfs/data-access/redis/RunTripsRedisRepository.js +65 -0
  49. package/dist/output-gateway/ropid-gtfs/data-access/redis/RunTripsRedisRepository.js.map +1 -0
  50. package/dist/output-gateway/ropid-gtfs/domain/repository/IRunTripsRedisRepository.d.ts +4 -0
  51. package/dist/output-gateway/ropid-gtfs/domain/repository/IRunTripsRedisRepository.js +3 -0
  52. package/dist/output-gateway/ropid-gtfs/domain/repository/IRunTripsRedisRepository.js.map +1 -0
  53. package/dist/output-gateway/shared/constants/validations.js +1 -1
  54. package/dist/output-gateway/shared/constants/validations.js.map +1 -1
  55. package/dist/schema-definitions/ropid-gtfs/redis/const.d.ts +1 -0
  56. package/dist/schema-definitions/ropid-gtfs/redis/const.js +2 -1
  57. package/dist/schema-definitions/ropid-gtfs/redis/const.js.map +1 -1
  58. package/docs/openapi-output.yaml +11 -3
  59. package/package.json +3 -3
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SkipHelper = void 0;
4
+ const RouteTypeEnums_1 = require("../../../../helpers/RouteTypeEnums");
5
+ const const_1 = require("./const");
6
+ /** Extracts the last numeric sequence from strings like:
7
+ * Os 1111 -> 1111
8
+ * Os 1111 B -> 1111
9
+ * Rx 1/1111 A -> 1111
10
+ */
11
+ const TRIP_NUMBER_REGEX = /(\d+)(?!.*\d)/;
12
+ class SkipHelper {
13
+ /**
14
+ * Used exclusively in transfer boards to skip transfers for the current trip
15
+ * (i.e., transfers within the vehicle where the transfer board is located)
16
+ */
17
+ static isMatchingTripNumber(departure, tripNumber) {
18
+ const tripShortName = departure.trip_short_name;
19
+ if (!tripShortName) {
20
+ return false;
21
+ }
22
+ const lastNumber = tripShortName.match(TRIP_NUMBER_REGEX)?.[1];
23
+ return !!lastNumber && lastNumber === tripNumber;
24
+ }
25
+ static hasNoDelayInfo(departure) {
26
+ return !departure.is_delay_available;
27
+ }
28
+ /**
29
+ * Used exclusively in departure boards when skip[]=missing is requested (without untracked)
30
+ */
31
+ static isVehicleMissing(departure, runScheduleMap, untrackedTrips, nowDate = new Date()) {
32
+ // Not missing if essential trip data is missing or if delay information is available
33
+ if (!("trip.start_timestamp" in departure) ||
34
+ departure["trip.start_timestamp"] === null ||
35
+ departure.run_number === null ||
36
+ departure.origin_route_name === null ||
37
+ departure.is_delay_available) {
38
+ return false;
39
+ }
40
+ const startTimestamp = new Date(departure["trip.start_timestamp"]);
41
+ const minutesToStart = (startTimestamp.getTime() - nowDate.getTime()) / 60000;
42
+ /// Not missing if departure is too far in the future (threshold varies for metro)
43
+ if (this.isOutsideStartThreshold(minutesToStart, departure.route_type)) {
44
+ return false;
45
+ }
46
+ // Missing if the trip should have already started
47
+ else if (this.hasAlreadyDeparted(minutesToStart)) {
48
+ return true;
49
+ }
50
+ // Cannot determine missing status without run schedule information
51
+ const runId = `${departure.origin_route_name}_${departure.run_number}`;
52
+ const runSchedule = runScheduleMap?.get(runId);
53
+ if (!runSchedule) {
54
+ return false;
55
+ }
56
+ // Not missing if this is the first trip in the run or if trip isn't found
57
+ const runTripIndex = runSchedule.findIndex((trip) => trip.trip_id === departure.trip_id);
58
+ if (runTripIndex === -1 || runTripIndex === 0) {
59
+ return false;
60
+ }
61
+ // Not missing if there's a significant gap after the previous trip
62
+ const previousRunTripEnd = new Date(runSchedule[runTripIndex - 1].end_timestamp);
63
+ if (this.hasLargeTimegapBetweenTrips(previousRunTripEnd, startTimestamp)) {
64
+ return false;
65
+ }
66
+ // Not missing if the previous trip has delay information available
67
+ const isPreviousUntracked = untrackedTrips?.has(runSchedule[runTripIndex - 1].trip_id);
68
+ if (!isPreviousUntracked) {
69
+ return false;
70
+ }
71
+ const previousStartTimestamp = new Date(runSchedule[runTripIndex - 1].start_timestamp);
72
+ const previousMinutesToStart = (previousStartTimestamp.getTime() - nowDate.getTime()) / 60000;
73
+ // Missing if previous trip should have already started
74
+ if (this.hasAlreadyDeparted(previousMinutesToStart)) {
75
+ return true;
76
+ }
77
+ // Check position of previous trip in the run
78
+ const previousRunTripIndex = runTripIndex - 1;
79
+ if (previousRunTripIndex === -1 || previousRunTripIndex === 0) {
80
+ return false;
81
+ }
82
+ // Check for gaps before the previous trip
83
+ const previousPreviousRunTripEnd = new Date(runSchedule[previousRunTripIndex - 1].end_timestamp);
84
+ if (this.hasLargeTimegapBetweenTrips(previousPreviousRunTripEnd, previousStartTimestamp)) {
85
+ return false;
86
+ }
87
+ // If we reach here, the previous untracked trip is likely missing,
88
+ // which implies the current trip is also missing
89
+ return true;
90
+ }
91
+ static isTripCanceled(departure) {
92
+ return !!departure.is_canceled;
93
+ }
94
+ static isVehicleAtStop(departure) {
95
+ if (!("arrival_datetime" in departure)) {
96
+ return false;
97
+ }
98
+ const isAtStop = departure.stop_sequence === departure["trip.last_position.this_stop_sequence"];
99
+ const isPassStop = !!departure["trip.last_position.last_stop_sequence"] &&
100
+ departure.stop_sequence <= departure["trip.last_position.last_stop_sequence"];
101
+ return isAtStop || isPassStop;
102
+ }
103
+ static isOutsideStartThreshold(minutesToStart, routeType) {
104
+ const isMetro = routeType === RouteTypeEnums_1.GTFSRouteTypeEnum.METRO;
105
+ return isMetro ? minutesToStart >= const_1.START_SOON_METRO_MINUTES_THRESHOLD : minutesToStart >= const_1.START_SOON_MINUTES_THRESHOLD;
106
+ }
107
+ static hasAlreadyDeparted(minutesToStart) {
108
+ return minutesToStart < const_1.DEPARTURED_MINUTES_THRESHOLD;
109
+ }
110
+ static hasLargeTimegapBetweenTrips(endTimestamp, startTimestamp) {
111
+ const minutesAfterPrevious = (startTimestamp.getTime() - endTimestamp.getTime()) / 60000;
112
+ return minutesAfterPrevious >= const_1.TRIP_GAP_MINUTES_THRESHOLD;
113
+ }
114
+ }
115
+ exports.SkipHelper = SkipHelper;
116
+ //# sourceMappingURL=SkipHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkipHelper.js","sourceRoot":"","sources":["../../../../../src/output-gateway/pid/models/helpers/SkipHelper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare const START_SOON_MINUTES_THRESHOLD = 30;
2
+ export declare const START_SOON_METRO_MINUTES_THRESHOLD = 5;
3
+ export declare const DEPARTURED_MINUTES_THRESHOLD = -2;
4
+ export declare const TRIP_GAP_MINUTES_THRESHOLD = 60;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TRIP_GAP_MINUTES_THRESHOLD = exports.DEPARTURED_MINUTES_THRESHOLD = exports.START_SOON_METRO_MINUTES_THRESHOLD = exports.START_SOON_MINUTES_THRESHOLD = void 0;
4
+ exports.START_SOON_MINUTES_THRESHOLD = 30;
5
+ exports.START_SOON_METRO_MINUTES_THRESHOLD = 5;
6
+ exports.DEPARTURED_MINUTES_THRESHOLD = -2;
7
+ exports.TRIP_GAP_MINUTES_THRESHOLD = 60;
8
+ //# sourceMappingURL=const.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"const.js","sourceRoot":"","sources":["../../../../../src/output-gateway/pid/models/helpers/const.ts"],"names":[],"mappings":";;;AAAa,QAAA,4BAA4B,GAAG,EAAE,CAAC;AAClC,QAAA,kCAAkC,GAAG,CAAC,CAAC;AACvC,QAAA,4BAA4B,GAAG,CAAC,CAAC,CAAC;AAClC,QAAA,0BAA0B,GAAG,EAAE,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { DepartureFilter, DepartureMode, DepartureOrder, DepartureSkip } from "../../..";
2
2
  import { IRopidDeparturesDirectionsOutput } from "../../../../../schema-definitions/ropid-departures-directions";
3
+ import { IScheduleDto } from "../../../../../schema-definitions/vehicle-positions/redis/interfaces/IGtfsRunTripCacheDto";
3
4
  export default interface IPIDDepartureQueryOptions {
4
5
  limit: number;
5
6
  offset: number;
@@ -10,5 +11,7 @@ export default interface IPIDDepartureQueryOptions {
10
11
  skip: DepartureSkip[];
11
12
  departuresDirections: IRopidDeparturesDirectionsOutput[];
12
13
  timezone: string;
13
- tripNumber?: string;
14
+ tripNumber: string | null;
15
+ runScheduleMap: Map<string, IScheduleDto[]> | null;
16
+ untrackedTrips: Set<string> | null;
14
17
  }
@@ -0,0 +1,21 @@
1
+ import type { DepartureFilter, DepartureMode, DepartureOrder, DepartureSkip } from "../..";
2
+ import type { Moment } from "@golemio/core/dist/shared/moment-timezone";
3
+ export interface IGetDeparturesOptions {
4
+ aswIds?: string[];
5
+ cisIds?: string[];
6
+ gtfsIds?: string[];
7
+ names?: string[];
8
+ total: number;
9
+ limit: number;
10
+ offset: number;
11
+ mode: DepartureMode;
12
+ minutesBefore: number;
13
+ minutesAfter: number;
14
+ timeFrom?: Moment;
15
+ order: DepartureOrder;
16
+ filter: DepartureFilter;
17
+ skip: DepartureSkip[];
18
+ includeMetroTrains?: boolean;
19
+ airCondition?: boolean;
20
+ timezone: string;
21
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=IGetDeparturesOptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IGetDeparturesOptions.js","sourceRoot":"","sources":["../../../../../src/output-gateway/pid/models/interfaces/IGetDeparturesOptions.ts"],"names":[],"mappings":""}
@@ -20,7 +20,7 @@ class V3PIDRouter extends AbstractRouter_1.AbstractRouter {
20
20
  this.registerInfotextsRoutes = () => {
21
21
  this.router.get("/transferboards", [
22
22
  (0, express_validator_1.query)("cisId").exists().isInt().not().isArray(),
23
- (0, express_validator_1.query)("tripNumber").exists().isInt().not().isArray(),
23
+ (0, express_validator_1.query)("tripNumber").optional().isInt({ min: 0 }).not().isArray(),
24
24
  (0, express_validator_1.query)("timeFrom").optional().isISO8601().custom(ParamValidatorManager_1.ParamValidatorManager.getTimeFromValidator()).not().isArray(),
25
25
  ], Validation_1.checkErrors,
26
26
  // max-age 5 seconds, stale-while-revalidate 5 seconds
@@ -1 +1 @@
1
- {"version":3,"file":"V3PIDRouter.js","sourceRoot":"","sources":["../../../../../src/output-gateway/pid/routers/v3/V3PIDRouter.ts"],"names":[],"mappings":";;;AAEA,+EAA8E;AAC9E,qCAAgD;AAChD,qDAAoD;AACpD,yDAAoD;AACpD,sFAAmF;AAEnF,6EAA2E;AAC3E,+DAAuE;AACvE,+DAA2D;AAC3D,mFAAoE;AAEpE,MAAa,WAAY,SAAQ,+BAAc;IAM3C;QACI,KAAK,CAAC,wBAAY,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QANlB,WAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;QAaxB,eAAU,GAAG,GAAS,EAAE;YAC9B,IAAI,CAAC,uBAAuB,EAAE,CAAC;QACnC,CAAC,CAAC;QAEM,4BAAuB,GAAG,GAAG,EAAE;YACnC,IAAI,CAAC,MAAM,CAAC,GAAG,CACX,iBAAiB,EACjB;gBACI,IAAA,yBAAK,EAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE;gBAC/C,IAAA,yBAAK,EAAC,YAAY,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE;gBACpD,IAAA,yBAAK,EAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,6CAAqB,CAAC,oBAAoB,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE;aAChH,EACD,wBAAW;YACX,sDAAsD;YACtD,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,EAC9C,IAAI,CAAC,wBAAwB,CAAC,qBAAqB,CACtD,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,GAAG,CACX,YAAY,EACZ,wBAAW;YACX,wDAAwD;YACxD,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,EAChD,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAC3C,CAAC;QACN,CAAC,CAAC;QA/BE,IAAI,CAAC,qBAAqB,GAAG,mBAAc,CAAC,OAAO,CAAwB,oBAAc,CAAC,qBAAqB,CAAC,CAAC;QACjH,IAAI,CAAC,wBAAwB,GAAG,mBAAc,CAAC,OAAO,CAA6B,uBAAU,CAAC,0BAA0B,CAAC,CAAC;QAC1H,IAAI,CAAC,mBAAmB,GAAG,mBAAc,CAAC,OAAO,CAAwB,uBAAU,CAAC,qBAAqB,CAAC,CAAC;QAC3G,IAAI,CAAC,UAAU,EAAE,CAAC;IACtB,CAAC;CA4BJ;AAxCD,kCAwCC;AAED,MAAM,WAAW,GAAmB,IAAI,WAAW,EAAE,CAAC;AAC7C,kCAAW"}
1
+ {"version":3,"file":"V3PIDRouter.js","sourceRoot":"","sources":["../../../../../src/output-gateway/pid/routers/v3/V3PIDRouter.ts"],"names":[],"mappings":";;;AAEA,+EAA8E;AAC9E,qCAAgD;AAChD,qDAAoD;AACpD,yDAAoD;AACpD,sFAAmF;AAEnF,6EAA2E;AAC3E,+DAAuE;AACvE,+DAA2D;AAC3D,mFAAoE;AAEpE,MAAa,WAAY,SAAQ,+BAAc;IAM3C;QACI,KAAK,CAAC,wBAAY,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QANlB,WAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;QAaxB,eAAU,GAAG,GAAS,EAAE;YAC9B,IAAI,CAAC,uBAAuB,EAAE,CAAC;QACnC,CAAC,CAAC;QAEM,4BAAuB,GAAG,GAAG,EAAE;YACnC,IAAI,CAAC,MAAM,CAAC,GAAG,CACX,iBAAiB,EACjB;gBACI,IAAA,yBAAK,EAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE;gBAC/C,IAAA,yBAAK,EAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE;gBAChE,IAAA,yBAAK,EAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,6CAAqB,CAAC,oBAAoB,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE;aAChH,EACD,wBAAW;YACX,sDAAsD;YACtD,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,EAC9C,IAAI,CAAC,wBAAwB,CAAC,qBAAqB,CACtD,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,GAAG,CACX,YAAY,EACZ,wBAAW;YACX,wDAAwD;YACxD,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,EAChD,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAC3C,CAAC;QACN,CAAC,CAAC;QA/BE,IAAI,CAAC,qBAAqB,GAAG,mBAAc,CAAC,OAAO,CAAwB,oBAAc,CAAC,qBAAqB,CAAC,CAAC;QACjH,IAAI,CAAC,wBAAwB,GAAG,mBAAc,CAAC,OAAO,CAA6B,uBAAU,CAAC,0BAA0B,CAAC,CAAC;QAC1H,IAAI,CAAC,mBAAmB,GAAG,mBAAc,CAAC,OAAO,CAAwB,uBAAU,CAAC,qBAAqB,CAAC,CAAC;QAC3G,IAAI,CAAC,UAAU,EAAE,CAAC;IACtB,CAAC;CA4BJ;AAxCD,kCAwCC;AAED,MAAM,WAAW,GAAmB,IAAI,WAAW,EAAE,CAAC;AAC7C,kCAAW"}
@@ -12,7 +12,7 @@ export declare class TransferFacade {
12
12
  * - Process them (filter, sort, etc.)
13
13
  * - Transform them to DTO
14
14
  */
15
- getTransferDepartures(stopIds: string[], tripNumber: string, currentMoment: Moment, minutesOffset: number, timeZone?: string): Promise<ITransferOutputDto[]>;
15
+ getTransferDepartures(stopIds: string[], tripNumber: string | null, currentMoment: Moment, minutesOffset: number, timeZone?: string): Promise<ITransferOutputDto[]>;
16
16
  /**
17
17
  * Fallback options as defined by ROPID
18
18
  */
@@ -84,6 +84,8 @@ let TransferFacade = exports.TransferFacade = class TransferFacade {
84
84
  filter: pid_1.DepartureFilter.ROUTE_HEADING_ONCE_NOGAP_FILL,
85
85
  skip: [pid_1.DepartureSkip.CANCELED],
86
86
  departuresDirections: [],
87
+ runScheduleMap: null,
88
+ untrackedTrips: null, // not used in this context
87
89
  };
88
90
  }
89
91
  };
@@ -1 +1 @@
1
- {"version":3,"file":"TransferFacade.js","sourceRoot":"","sources":["../../../../../src/output-gateway/pid/service/facade/TransferFacade.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,+BAAgI;AAChI,mDAA2D;AAC3D,qDAAoD;AACpD,+FAA0E;AAC1E,0HAAoG;AACpG,4CAA8C;AAC9C,6EAA8F;AAE9F,iEAAwE;AACxE,wGAAqG;AAG9F,IAAM,cAAc,4BAApB,MAAM,cAAc;IACvB,YACqD,mBAAyC,EAC9B,uBAAwD;QADnE,wBAAmB,GAAnB,mBAAmB,CAAsB;QAC9B,4BAAuB,GAAvB,uBAAuB,CAAiC;IACrH,CAAC;IAEJ;;;;;OAKG;IACI,KAAK,CAAC,qBAAqB,CAC9B,OAAiB,EACjB,UAAkB,EAClB,aAAqB,EACrB,aAAqB,EACrB,QAAQ,GAAG,yBAAgB,CAAC,QAAQ;QAEpC,IAAI,iBAAiB,GAAyB,EAAE,CAAC;QACjD,IAAI;YACA,iBAAiB,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,qBAAqB,CAAC;gBACrE,QAAQ,EAAE,OAAO;gBACjB,aAAa;gBACb,aAAa;aAChB,CAAC,CAAC;SACN;QAAC,OAAO,KAAK,EAAE;YACZ,IAAI,KAAK,YAAY,qCAAoB,EAAE;gBACvC,MAAM,KAAK,CAAC;aACf;YAED,MAAM,IAAI,6BAAY,CAAC,wCAAwC,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;SACvG;QAED,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE;YAChC,OAAO,EAAE,CAAC;SACb;QAED,IAAI,kBAAkB,GAAyB,EAAE,CAAC;QAClD,IAAI;YACA,MAAM,mBAAmB,GAAG,IAAI,2BAAkB,CAAC,iBAAiB,EAAE;gBAClE,GAAG,IAAI,CAAC,cAAc;gBACtB,QAAQ,EAAE,QAAQ;gBAClB,UAAU;aACb,CAAC,CAAC,yBAAyB,EAAE,CAAC;YAE/B,kBAAkB,GAAG,IAAI,CAAC,uBAAuB,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;SACzF;QAAC,OAAO,KAAK,EAAE;YACZ,IAAI,KAAK,YAAY,qCAAoB,EAAE;gBACvC,MAAM,KAAK,CAAC;aACf;YAED,MAAM,IAAI,6BAAY,CAAC,uCAAuC,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;SACtG;QAED,OAAO,kBAAkB,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,IAAY,cAAc;QACtB,OAAO;YACH,KAAK,EAAE,EAAE;YACT,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,CAAC;YACT,IAAI,EAAE,mBAAa,CAAC,UAAU;YAC9B,KAAK,EAAE,oBAAc,CAAC,IAAI;YAC1B,MAAM,EAAE,qBAAe,CAAC,6BAA6B;YACrD,IAAI,EAAE,CAAC,mBAAa,CAAC,QAAQ,CAAC;YAC9B,oBAAoB,EAAE,EAAE;SAC3B,CAAC;IACN,CAAC;CACJ,CAAA;yBAzEY,cAAc;IAD1B,IAAA,qBAAU,GAAE;IAGJ,WAAA,IAAA,iBAAM,EAAC,uBAAU,CAAC,oBAAoB,CAAC,CAAA;IACvC,WAAA,IAAA,iBAAM,EAAC,uBAAU,CAAC,+BAA+B,CAAC,CAAA;qCADmB,kCAAoB;QACL,iEAA+B;GAH/G,cAAc,CAyE1B"}
1
+ {"version":3,"file":"TransferFacade.js","sourceRoot":"","sources":["../../../../../src/output-gateway/pid/service/facade/TransferFacade.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,+BAAgI;AAChI,mDAA2D;AAC3D,qDAAoD;AACpD,+FAA0E;AAC1E,0HAAoG;AACpG,4CAA8C;AAC9C,6EAA8F;AAE9F,iEAAwE;AACxE,wGAAqG;AAG9F,IAAM,cAAc,4BAApB,MAAM,cAAc;IACvB,YACqD,mBAAyC,EAC9B,uBAAwD;QADnE,wBAAmB,GAAnB,mBAAmB,CAAsB;QAC9B,4BAAuB,GAAvB,uBAAuB,CAAiC;IACrH,CAAC;IAEJ;;;;;OAKG;IACI,KAAK,CAAC,qBAAqB,CAC9B,OAAiB,EACjB,UAAyB,EACzB,aAAqB,EACrB,aAAqB,EACrB,QAAQ,GAAG,yBAAgB,CAAC,QAAQ;QAEpC,IAAI,iBAAiB,GAAyB,EAAE,CAAC;QACjD,IAAI;YACA,iBAAiB,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,qBAAqB,CAAC;gBACrE,QAAQ,EAAE,OAAO;gBACjB,aAAa;gBACb,aAAa;aAChB,CAAC,CAAC;SACN;QAAC,OAAO,KAAK,EAAE;YACZ,IAAI,KAAK,YAAY,qCAAoB,EAAE;gBACvC,MAAM,KAAK,CAAC;aACf;YAED,MAAM,IAAI,6BAAY,CAAC,wCAAwC,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;SACvG;QAED,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE;YAChC,OAAO,EAAE,CAAC;SACb;QAED,IAAI,kBAAkB,GAAyB,EAAE,CAAC;QAClD,IAAI;YACA,MAAM,mBAAmB,GAAG,IAAI,2BAAkB,CAAC,iBAAiB,EAAE;gBAClE,GAAG,IAAI,CAAC,cAAc;gBACtB,QAAQ,EAAE,QAAQ;gBAClB,UAAU;aACb,CAAC,CAAC,yBAAyB,EAAE,CAAC;YAE/B,kBAAkB,GAAG,IAAI,CAAC,uBAAuB,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;SACzF;QAAC,OAAO,KAAK,EAAE;YACZ,IAAI,KAAK,YAAY,qCAAoB,EAAE;gBACvC,MAAM,KAAK,CAAC;aACf;YAED,MAAM,IAAI,6BAAY,CAAC,uCAAuC,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;SACtG;QAED,OAAO,kBAAkB,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,IAAY,cAAc;QACtB,OAAO;YACH,KAAK,EAAE,EAAE;YACT,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,CAAC;YACT,IAAI,EAAE,mBAAa,CAAC,UAAU;YAC9B,KAAK,EAAE,oBAAc,CAAC,IAAI;YAC1B,MAAM,EAAE,qBAAe,CAAC,6BAA6B;YACrD,IAAI,EAAE,CAAC,mBAAa,CAAC,QAAQ,CAAC;YAC9B,oBAAoB,EAAE,EAAE;YACxB,cAAc,EAAE,IAAI;YACpB,cAAc,EAAE,IAAI,EAAE,2BAA2B;SACpD,CAAC;IACN,CAAC;CACJ,CAAA;yBA3EY,cAAc;IAD1B,IAAA,qBAAU,GAAE;IAGJ,WAAA,IAAA,iBAAM,EAAC,uBAAU,CAAC,oBAAoB,CAAC,CAAA;IACvC,WAAA,IAAA,iBAAM,EAAC,uBAAU,CAAC,+BAA+B,CAAC,CAAA;qCADmB,kCAAoB;QACL,iEAA+B;GAH/G,cAAc,CA2E1B"}
@@ -8,10 +8,12 @@ export declare class PublicVehiclePositionsRepository implements IVehiclePositio
8
8
  private log;
9
9
  private setName;
10
10
  constructor(redisConnector: IoRedisConnector, log: ILogger);
11
+ setCurrentSetName(name: string): void;
11
12
  getAllVehicleIds(boundingBox: IBoundingBoxWithCenter): Promise<string[]>;
12
13
  getAllVehiclePositions(vehicleIds: string[], tripIds?: string[]): Promise<IPublicApiCacheDto[]>;
13
14
  getAllVehiclePositionsForMultipleTrips(tripIds: string[]): Promise<Map<string, IPublicApiCacheDto[]>>;
14
- private getCanceledTrips;
15
+ getTripsWithUntrackedVehicles(tripIds: string[]): Promise<Set<string>>;
15
16
  getDetailedVehiclePosition(vehicleId: string, tripId?: string): Promise<IPublicApiCacheDto | null>;
16
- setCurrentSetName(name: string): void;
17
+ private getVehicleIdsForMultiple;
18
+ private getCanceledTrips;
17
19
  }
@@ -24,6 +24,9 @@ let PublicVehiclePositionsRepository = exports.PublicVehiclePositionsRepository
24
24
  this.log = log;
25
25
  this.setName = undefined; // loaded via pub sub
26
26
  }
27
+ setCurrentSetName(name) {
28
+ this.setName = name;
29
+ }
27
30
  async getAllVehicleIds(boundingBox) {
28
31
  if (!this.setName) {
29
32
  this.log.debug("Empty setName for public vehicle positions api.");
@@ -37,8 +40,8 @@ let PublicVehiclePositionsRepository = exports.PublicVehiclePositionsRepository
37
40
  try {
38
41
  vehicleIds = (await connection.geosearch(this.setName, "FROMLONLAT", boundingBox.centerPoint.longitude, boundingBox.centerPoint.latitude, "BYBOX", boundingBox.width, boundingBox.height, "m", "ASC"));
39
42
  }
40
- catch (err) {
41
- throw new golemio_errors_1.GeneralError(`${this.constructor.name}: Cannot get vehicle ids from cache: ${err.message}`, this.constructor.name, err);
43
+ catch (error) {
44
+ throw new golemio_errors_1.GeneralError("Cannot get vehicle ids from cache", this.constructor.name, error);
42
45
  }
43
46
  return vehicleIds;
44
47
  }
@@ -61,8 +64,8 @@ let PublicVehiclePositionsRepository = exports.PublicVehiclePositionsRepository
61
64
  }
62
65
  vehiclePositions = await connection.mget(keys);
63
66
  }
64
- catch (err) {
65
- throw new golemio_errors_1.GeneralError(`${this.constructor.name}: Cannot get vehicle positions from cache: ${err.message}`, this.constructor.name, err);
67
+ catch (error) {
68
+ throw new golemio_errors_1.GeneralError("Cannot get vehicle positions from cache", this.constructor.name, error);
66
69
  }
67
70
  const parsedVehiclePositions = [];
68
71
  for (const vehiclePosition of vehiclePositions) {
@@ -72,8 +75,8 @@ let PublicVehiclePositionsRepository = exports.PublicVehiclePositionsRepository
72
75
  try {
73
76
  parsedVehiclePositions.push(JSON.parse(vehiclePosition));
74
77
  }
75
- catch (err) {
76
- throw new golemio_errors_1.GeneralError(`${this.constructor.name}: Cannot parse vehicle position: ${err.message}`, this.constructor.name, err);
78
+ catch (error) {
79
+ throw new golemio_errors_1.GeneralError("Cannot parse vehicle position", this.constructor.name, error);
77
80
  }
78
81
  }
79
82
  return parsedVehiclePositions;
@@ -87,46 +90,20 @@ let PublicVehiclePositionsRepository = exports.PublicVehiclePositionsRepository
87
90
  if (!this.redisConnector.isConnected()) {
88
91
  await this.redisConnector.connect();
89
92
  }
90
- const vehicleIdsByTrip = new Map();
91
- const vehicleIdsByFutureTrip = new Map();
92
- const connection = this.redisConnector.getConnection();
93
- const pipeline = connection.pipeline();
94
- const futurePipeline = connection.pipeline();
95
- for (const tripId of tripIds) {
96
- pipeline.lrange(`${this.setName}:trip-${tripId}`, 0, -1);
97
- futurePipeline.lrange(`${this.setName}:future-trip-${tripId}`, 0, -1);
98
- }
99
- try {
100
- const [trips, futureTrips] = await Promise.all([pipeline.exec(), futurePipeline.exec()]);
101
- for (const [err, vehicleIds] of trips) {
102
- if (err) {
103
- throw new golemio_errors_1.GeneralError("Cannot get vehicle ids for trip from cache", this.constructor.name, err);
104
- }
105
- vehicleIdsByTrip.set(tripIds[vehicleIdsByTrip.size], vehicleIds);
106
- }
107
- for (const [err, vehicleIds] of futureTrips) {
108
- if (err) {
109
- throw new golemio_errors_1.GeneralError("Cannot get vehicle ids for future-trip from cache", this.constructor.name, err);
110
- }
111
- vehicleIdsByFutureTrip.set(tripIds[vehicleIdsByFutureTrip.size], vehicleIds);
112
- }
113
- }
114
- catch (err) {
115
- if (err instanceof golemio_errors_1.GeneralError) {
116
- throw err;
117
- }
118
- throw new golemio_errors_1.GeneralError("Cannot get vehicle ids for trip from cache", this.constructor.name, err);
119
- }
120
- const positionValues = Array.from(new Set([...vehicleIdsByTrip.values(), ...vehicleIdsByFutureTrip.values()].flat()));
121
- if (positionValues.length > 0) {
122
- const allPositions = await this.getAllVehiclePositions(positionValues);
93
+ const [vehicleIdsCurrent, vehicleIdsFuture] = await Promise.all([
94
+ this.getVehicleIdsForMultiple(tripIds, "trip"),
95
+ this.getVehicleIdsForMultiple(tripIds, "future-trip"),
96
+ ]);
97
+ const vehicleIds = Array.from(new Set([...vehicleIdsCurrent, ...vehicleIdsFuture]));
98
+ if (vehicleIds.length > 0) {
99
+ const allPositions = await this.getAllVehiclePositions(vehicleIds);
123
100
  for (const position of allPositions) {
124
101
  if (!positionsByTrip.has(position.gtfs_trip_id)) {
125
102
  positionsByTrip.set(position.gtfs_trip_id, []);
126
103
  }
127
104
  positionsByTrip.get(position.gtfs_trip_id).push(position);
128
105
  }
129
- const futurePositions = await this.getAllVehiclePositions(positionValues, tripIds);
106
+ const futurePositions = await this.getAllVehiclePositions(vehicleIds, tripIds);
130
107
  for (const position of futurePositions) {
131
108
  if (!positionsByTrip.has(position.gtfs_trip_id)) {
132
109
  positionsByTrip.set(position.gtfs_trip_id, []);
@@ -140,31 +117,29 @@ let PublicVehiclePositionsRepository = exports.PublicVehiclePositionsRepository
140
117
  }
141
118
  return positionsByTrip;
142
119
  }
143
- async getCanceledTrips(tripIds) {
144
- const connection = this.redisConnector.getConnection();
145
- const parsedCanceledTrips = [];
146
- if (tripIds.length === 0) {
147
- return [];
120
+ async getTripsWithUntrackedVehicles(tripIds) {
121
+ const untrackedTrips = new Set();
122
+ if (!this.setName || tripIds.length === 0) {
123
+ this.log.debug("Empty setName for public vehicle positions api or empty trip ids.");
124
+ return untrackedTrips;
148
125
  }
149
- const keys = [];
150
- for (const tripId of tripIds) {
151
- keys.push(`${this.setName}:canceled-trips-${tripId}`);
126
+ if (!this.redisConnector.isConnected()) {
127
+ await this.redisConnector.connect();
152
128
  }
153
- const canceledTrips = await connection.mget(keys);
154
- for (const canceledTrip of canceledTrips) {
155
- if (canceledTrip === null) {
156
- continue;
157
- }
158
- else {
159
- try {
160
- parsedCanceledTrips.push(JSON.parse(canceledTrip));
161
- }
162
- catch (err) {
163
- throw new golemio_errors_1.GeneralError(`${this.constructor.name}: Cannot parse canceled trip: ${err.message}`, this.constructor.name, err);
129
+ const vehicleIds = await this.getVehicleIdsForMultiple(tripIds, "trip");
130
+ try {
131
+ // TODO optimization point here - use JSON.GET once it's available in the redis/valkey server
132
+ const allPositions = await this.getAllVehiclePositions(vehicleIds);
133
+ for (let i = 0; i < allPositions.length; i++) {
134
+ if (allPositions[i].delay === null) {
135
+ untrackedTrips.add(allPositions[i].gtfs_trip_id);
164
136
  }
165
137
  }
166
138
  }
167
- return parsedCanceledTrips;
139
+ catch (error) {
140
+ throw new golemio_errors_1.GeneralError("Cannot get vehicle positions from cache", this.constructor.name, error);
141
+ }
142
+ return untrackedTrips;
168
143
  }
169
144
  // Current trips are saved in the cache with key made from vehicleId only. For future trips tripId has to be also provided.
170
145
  async getDetailedVehiclePosition(vehicleId, tripId) {
@@ -181,9 +156,9 @@ let PublicVehiclePositionsRepository = exports.PublicVehiclePositionsRepository
181
156
  const key = tripId ? `${this.setName}:future-trip-${vehicleId}-${tripId}` : `${this.setName}:vehicle-${vehicleId}`;
182
157
  vehiclePosition = await connection.get(key);
183
158
  }
184
- catch (err) {
185
- this.log.error(`${this.constructor.name}: Cannot get vehicle position from cache: ${err.message}`);
186
- throw new golemio_errors_1.GeneralError(`${this.constructor.name}: Cannot get vehicle position from cache: ${err.message}`, this.constructor.name, err);
159
+ catch (error) {
160
+ this.log.error(error, "Cannot get vehicle position from cache");
161
+ throw new golemio_errors_1.GeneralError("Cannot get vehicle position from cache", this.constructor.name, error);
187
162
  }
188
163
  if (vehiclePosition === null) {
189
164
  this.log.info(`${this.constructor.name}: Cannot find vehicle_id ${vehicleId}`);
@@ -192,13 +167,60 @@ let PublicVehiclePositionsRepository = exports.PublicVehiclePositionsRepository
192
167
  try {
193
168
  return JSON.parse(vehiclePosition);
194
169
  }
195
- catch (err) {
196
- this.log.error(`${this.constructor.name}: Cannot parse ${vehicleId}: ${err.message}`);
197
- throw new golemio_errors_1.GeneralError(`${this.constructor.name}: Cannot parse ${vehicleId}: ${err.message}`, this.constructor.name, err);
170
+ catch (error) {
171
+ this.log.error(error, `Cannot parse ${vehicleId}`);
172
+ throw new golemio_errors_1.GeneralError(`Cannot parse ${vehicleId}`, this.constructor.name, error);
198
173
  }
199
174
  }
200
- setCurrentSetName(name) {
201
- this.setName = name;
175
+ async getVehicleIdsForMultiple(tripIds, keyPrefix) {
176
+ const vehicleIdsByTrip = new Map();
177
+ const connection = this.redisConnector.getConnection();
178
+ const pipeline = connection.pipeline();
179
+ for (const tripId of tripIds) {
180
+ pipeline.lrange(`${this.setName}:${keyPrefix}-${tripId}`, 0, -1);
181
+ }
182
+ try {
183
+ const trips = await pipeline.exec();
184
+ for (const [error, vehicleIds] of trips) {
185
+ if (error) {
186
+ throw new golemio_errors_1.GeneralError(`Cannot get vehicle ids for ${keyPrefix} from cache`, this.constructor.name, error);
187
+ }
188
+ vehicleIdsByTrip.set(tripIds[vehicleIdsByTrip.size], vehicleIds);
189
+ }
190
+ }
191
+ catch (error) {
192
+ if (error instanceof golemio_errors_1.GeneralError) {
193
+ throw error;
194
+ }
195
+ throw new golemio_errors_1.GeneralError(`Cannot get vehicle ids for ${keyPrefix} from cache`, this.constructor.name, error);
196
+ }
197
+ return Array.from(vehicleIdsByTrip.values()).flat();
198
+ }
199
+ async getCanceledTrips(tripIds) {
200
+ const connection = this.redisConnector.getConnection();
201
+ const parsedCanceledTrips = [];
202
+ if (tripIds.length === 0) {
203
+ return [];
204
+ }
205
+ const keys = [];
206
+ for (const tripId of tripIds) {
207
+ keys.push(`${this.setName}:canceled-trips-${tripId}`);
208
+ }
209
+ const canceledTrips = await connection.mget(keys);
210
+ for (const canceledTrip of canceledTrips) {
211
+ if (canceledTrip === null) {
212
+ continue;
213
+ }
214
+ else {
215
+ try {
216
+ parsedCanceledTrips.push(JSON.parse(canceledTrip));
217
+ }
218
+ catch (error) {
219
+ throw new golemio_errors_1.GeneralError("Cannot parse canceled trip", this.constructor.name, error);
220
+ }
221
+ }
222
+ }
223
+ return parsedCanceledTrips;
202
224
  }
203
225
  };
204
226
  exports.PublicVehiclePositionsRepository = PublicVehiclePositionsRepository = __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"PublicVehiclePositionsRepository.js","sourceRoot":"","sources":["../../../../../src/output-gateway/public/data-access/redis/PublicVehiclePositionsRepository.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PublicVehiclePositionsRepository.js","sourceRoot":"","sources":["../../../../../src/output-gateway/public/data-access/redis/PublicVehiclePositionsRepository.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  import { IPublicApiCacheDto } from "../../../../schema-definitions/vehicle-positions/redis/interfaces/IPublicApiCacheDto";
2
2
  import { IBoundingBoxWithCenter } from "../IBoudingBox";
3
3
  export interface IVehiclePositionsRepository {
4
+ setCurrentSetName(name: string): void;
4
5
  getAllVehicleIds(boundingBox: IBoundingBoxWithCenter): Promise<string[]>;
5
6
  getAllVehiclePositions(vehicleIds: string[]): Promise<IPublicApiCacheDto[]>;
6
7
  getAllVehiclePositionsForMultipleTrips(tripIds: string[]): Promise<Map<string, IPublicApiCacheDto[]>>;
7
8
  getDetailedVehiclePosition(vehicleId: string, tripdId?: string): Promise<IPublicApiCacheDto | null>;
8
- setCurrentSetName(name: string): void;
9
+ getTripsWithUntrackedVehicles(tripIds: string[]): Promise<Set<string>>;
9
10
  }
@@ -0,0 +1,10 @@
1
+ import { IRunTripsRedisRepository } from "../../domain/repository/IRunTripsRedisRepository";
2
+ import { IGtfsRunTripCacheDto } from "../../../../schema-definitions/vehicle-positions/redis/interfaces/IGtfsRunTripCacheDto";
3
+ import { IoRedisConnector } from "@golemio/core/dist/helpers/data-access/redis/IoRedisConnector";
4
+ import { ILogger } from "@golemio/core/dist/helpers/logger/LoggerProvider";
5
+ export declare class RunTripsRedisRepository implements IRunTripsRedisRepository {
6
+ private redisConnector;
7
+ private log;
8
+ constructor(redisConnector: IoRedisConnector, log: ILogger);
9
+ getMultipleSchedule(runTuples: string[]): Promise<Array<IGtfsRunTripCacheDto | null>>;
10
+ }
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.RunTripsRedisRepository = void 0;
16
+ const const_1 = require("../../../../schema-definitions/ropid-gtfs/redis/const");
17
+ const IoRedisConnector_1 = require("@golemio/core/dist/helpers/data-access/redis/IoRedisConnector");
18
+ const CoreToken_1 = require("@golemio/core/dist/helpers/ioc/CoreToken");
19
+ const ioc_1 = require("@golemio/core/dist/output-gateway/ioc");
20
+ const golemio_errors_1 = require("@golemio/core/dist/shared/golemio-errors");
21
+ const tsyringe_1 = require("@golemio/core/dist/shared/tsyringe");
22
+ let RunTripsRedisRepository = exports.RunTripsRedisRepository = class RunTripsRedisRepository {
23
+ constructor(redisConnector, log) {
24
+ this.redisConnector = redisConnector;
25
+ this.log = log;
26
+ }
27
+ async getMultipleSchedule(runTuples) {
28
+ if (!runTuples.length) {
29
+ return [];
30
+ }
31
+ if (!this.redisConnector.isConnected()) {
32
+ await this.redisConnector.connect();
33
+ }
34
+ const connection = this.redisConnector.getConnection();
35
+ let runTripCache = [];
36
+ try {
37
+ runTripCache = await connection.mget(runTuples.map((runTuple) => `${const_1.GTFS_RUN_SCHEDULE_NAMESPACE_PREFIX}:${runTuple}`));
38
+ }
39
+ catch (error) {
40
+ throw new golemio_errors_1.GeneralError("Cannot get run trips from cache", this.constructor.name, error);
41
+ }
42
+ let gtfsRunTripDtos = [];
43
+ for (const cache of runTripCache) {
44
+ if (cache === null) {
45
+ this.log.info(`${this.constructor.name}: Cannot find run trip cache`);
46
+ gtfsRunTripDtos.push(null);
47
+ continue;
48
+ }
49
+ try {
50
+ gtfsRunTripDtos.push(JSON.parse(cache));
51
+ }
52
+ catch (error) {
53
+ throw new golemio_errors_1.GeneralError("Cannot parse run trip cache", this.constructor.name, error);
54
+ }
55
+ }
56
+ return gtfsRunTripDtos;
57
+ }
58
+ };
59
+ exports.RunTripsRedisRepository = RunTripsRedisRepository = __decorate([
60
+ (0, tsyringe_1.injectable)(),
61
+ __param(0, (0, tsyringe_1.inject)(ioc_1.ContainerToken.RedisConnector)),
62
+ __param(1, (0, tsyringe_1.inject)(CoreToken_1.CoreToken.Logger)),
63
+ __metadata("design:paramtypes", [IoRedisConnector_1.IoRedisConnector, Object])
64
+ ], RunTripsRedisRepository);
65
+ //# sourceMappingURL=RunTripsRedisRepository.js.map