@golemio/fypr 1.10.0 → 1.10.1-dev.2784614109

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 (55) hide show
  1. package/db/migrations/postgresql/20260814093009-add-device-statuses.js +16 -0
  2. package/db/migrations/postgresql/sqls/20260814093009-add-device-statuses-down.sql +1 -0
  3. package/db/migrations/postgresql/sqls/20260814093009-add-device-statuses-up.sql +6 -0
  4. package/dist/integration-engine/data-sources/DCIPStatusOverviewDataSourceFactory.d.ts +8 -0
  5. package/dist/integration-engine/data-sources/DCIPStatusOverviewDataSourceFactory.js +45 -0
  6. package/dist/integration-engine/data-sources/DCIPStatusOverviewDataSourceFactory.js.map +1 -0
  7. package/dist/integration-engine/ioc/Di.js +9 -3
  8. package/dist/integration-engine/ioc/Di.js.map +1 -1
  9. package/dist/integration-engine/ioc/FYPRIEContainerTokens.d.ts +3 -0
  10. package/dist/integration-engine/ioc/FYPRIEContainerTokens.js +5 -0
  11. package/dist/integration-engine/ioc/FYPRIEContainerTokens.js.map +1 -1
  12. package/dist/integration-engine/repositories/DeviceStatusRepository.d.ts +17 -0
  13. package/dist/integration-engine/repositories/DeviceStatusRepository.js +81 -0
  14. package/dist/integration-engine/repositories/DeviceStatusRepository.js.map +1 -0
  15. package/dist/integration-engine/workers/FYPRWorker.js +1 -0
  16. package/dist/integration-engine/workers/FYPRWorker.js.map +1 -1
  17. package/dist/integration-engine/workers/tasks/FetchDCIPStatusTask.d.ts +12 -0
  18. package/dist/integration-engine/workers/tasks/FetchDCIPStatusTask.js +55 -0
  19. package/dist/integration-engine/workers/tasks/FetchDCIPStatusTask.js.map +1 -0
  20. package/dist/output-gateway/fypr/controllers/v1/V1FyprElementKindsController.js +1 -1
  21. package/dist/output-gateway/fypr/controllers/v1/V1FyprElementKindsController.js.map +1 -1
  22. package/dist/output-gateway/fypr/data-access/FyprElementRepository.js +10 -6
  23. package/dist/output-gateway/fypr/data-access/FyprElementRepository.js.map +1 -1
  24. package/dist/output-gateway/fypr/routers/middlewares/cacheMiddleware.d.ts +12 -0
  25. package/dist/output-gateway/fypr/routers/middlewares/cacheMiddleware.js +14 -0
  26. package/dist/output-gateway/fypr/routers/middlewares/cacheMiddleware.js.map +1 -0
  27. package/dist/output-gateway/fypr/routers/v1/V1FyprElementKindsRouter.js +14 -6
  28. package/dist/output-gateway/fypr/routers/v1/V1FyprElementKindsRouter.js.map +1 -1
  29. package/dist/output-gateway/fypr/routers/v1/V1FyprMetadataRouter.js +2 -3
  30. package/dist/output-gateway/fypr/routers/v1/V1FyprMetadataRouter.js.map +1 -1
  31. package/dist/output-gateway/fypr/transformations/InformationPanelOutputTransformation.js +12 -2
  32. package/dist/output-gateway/fypr/transformations/InformationPanelOutputTransformation.js.map +1 -1
  33. package/dist/output-gateway/interfaces/IOGInformationPanelScopes.d.ts +3 -0
  34. package/dist/schema-definitions/const.d.ts +1 -0
  35. package/dist/schema-definitions/const.js +10 -1
  36. package/dist/schema-definitions/const.js.map +1 -1
  37. package/dist/schema-definitions/data-sources/DCIPStatusOverviewJSONSchema.d.ts +3 -0
  38. package/dist/schema-definitions/data-sources/DCIPStatusOverviewJSONSchema.js +25 -0
  39. package/dist/schema-definitions/data-sources/DCIPStatusOverviewJSONSchema.js.map +1 -0
  40. package/dist/schema-definitions/data-sources/interfaces/IDCIPStatusOverview.d.ts +7 -0
  41. package/dist/schema-definitions/data-sources/interfaces/IDCIPStatusOverview.js +3 -0
  42. package/dist/schema-definitions/data-sources/interfaces/IDCIPStatusOverview.js.map +1 -0
  43. package/dist/schema-definitions/index.d.ts +6 -0
  44. package/dist/schema-definitions/index.js +17 -2
  45. package/dist/schema-definitions/index.js.map +1 -1
  46. package/dist/schema-definitions/models/DeviceStatusModel.d.ts +11 -0
  47. package/dist/schema-definitions/models/DeviceStatusModel.js +22 -0
  48. package/dist/schema-definitions/models/DeviceStatusModel.js.map +1 -0
  49. package/dist/schema-definitions/models/interfaces/IDeviceStatus.d.ts +6 -0
  50. package/dist/schema-definitions/models/interfaces/IDeviceStatus.js +3 -0
  51. package/dist/schema-definitions/models/interfaces/IDeviceStatus.js.map +1 -0
  52. package/docs/asyncapi.yaml +17 -0
  53. package/docs/implementation_documentation.md +57 -2
  54. package/docs/openapi-output.yaml +70 -8
  55. package/package.json +1 -1
@@ -0,0 +1,16 @@
1
+ 'use strict';
2
+
3
+ const fs = require('fs/promises');
4
+ const path = require('path');
5
+
6
+ const runSql = (db, name) =>
7
+ fs.readFile(path.join(__dirname, 'sqls', name), 'utf-8').then((sql) => {
8
+ console.log('received data: ' + sql);
9
+ return db.runSql(sql);
10
+ });
11
+
12
+ exports.up = (db) => runSql(db, '20260814093009-add-device-statuses-up.sql');
13
+
14
+ exports.down = (db) => runSql(db, '20260814093009-add-device-statuses-down.sql');
15
+
16
+ exports._meta = { version: 1 };
@@ -0,0 +1 @@
1
+ DROP TABLE device_statuses;
@@ -0,0 +1,6 @@
1
+ CREATE TABLE device_statuses (
2
+ device_id VARCHAR(255) PRIMARY KEY,
3
+ last_contact TIMESTAMPTZ NULL,
4
+ status VARCHAR(50) NOT NULL,
5
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
6
+ );
@@ -0,0 +1,8 @@
1
+ import { IDCIPStatusOverview } from "../../schema-definitions/data-sources/interfaces/IDCIPStatusOverview";
2
+ import { ISimpleConfig } from "@golemio/core/dist/helpers/configuration/ISimpleConfig";
3
+ import { IDataSource } from "@golemio/core/dist/integration-engine";
4
+ export declare class DCIPStatusOverviewDataSourceFactory {
5
+ private readonly config;
6
+ constructor(config: ISimpleConfig);
7
+ getDataSource(): IDataSource<IDCIPStatusOverview[]>;
8
+ }
@@ -0,0 +1,45 @@
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.DCIPStatusOverviewDataSourceFactory = void 0;
16
+ const DCIPStatusOverviewJSONSchema_1 = require("../../schema-definitions/data-sources/DCIPStatusOverviewJSONSchema");
17
+ const CoreToken_1 = require("@golemio/core/dist/helpers/ioc/CoreToken");
18
+ const integration_engine_1 = require("@golemio/core/dist/integration-engine");
19
+ const HTTPFetchProtocolStrategy_1 = require("@golemio/core/dist/integration-engine/datasources/protocol-strategy/HTTPFetchProtocolStrategy");
20
+ const golemio_validator_1 = require("@golemio/core/dist/shared/golemio-validator");
21
+ const tsyringe_1 = require("@golemio/core/dist/shared/tsyringe");
22
+ let DCIPStatusOverviewDataSourceFactory = class DCIPStatusOverviewDataSourceFactory {
23
+ constructor(config) {
24
+ this.config = config;
25
+ }
26
+ getDataSource() {
27
+ const baseUrl = this.config.getValue("module.fypr.dcipApi.baseUrl");
28
+ const urlPath = this.config.getValue("module.fypr.dcipApi.statusOverviewPath", "/api/v1/status-overview");
29
+ const timeoutInSeconds = this.config.getValue("module.fypr.dcipApi.clientTimeoutInSeconds", 20);
30
+ const apiKey = this.config.getValue("module.fypr.dcipApi.apiKey", "");
31
+ return new integration_engine_1.DataSource("DCIPStatusOverviewDataSource", new HTTPFetchProtocolStrategy_1.HTTPFetchProtocolStrategy({
32
+ method: "GET",
33
+ url: new URL(urlPath, baseUrl).toString(),
34
+ headers: { "X-Api-Key": apiKey },
35
+ timeoutInSeconds,
36
+ }), new integration_engine_1.JSONDataTypeStrategy({ resultsPath: "" }), new golemio_validator_1.JSONSchemaValidator("DCIPStatusOverviewValidator", DCIPStatusOverviewJSONSchema_1.dcipStatusOverviewJSONSchema));
37
+ }
38
+ };
39
+ exports.DCIPStatusOverviewDataSourceFactory = DCIPStatusOverviewDataSourceFactory;
40
+ exports.DCIPStatusOverviewDataSourceFactory = DCIPStatusOverviewDataSourceFactory = __decorate([
41
+ (0, tsyringe_1.injectable)(),
42
+ __param(0, (0, tsyringe_1.inject)(CoreToken_1.CoreToken.SimpleConfig)),
43
+ __metadata("design:paramtypes", [Object])
44
+ ], DCIPStatusOverviewDataSourceFactory);
45
+ //# sourceMappingURL=DCIPStatusOverviewDataSourceFactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DCIPStatusOverviewDataSourceFactory.js","sourceRoot":"","sources":["../../../src/integration-engine/data-sources/DCIPStatusOverviewDataSourceFactory.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,qHAA8F;AAG9F,wEAAqE;AACrE,8EAAsG;AACtG,6IAA0I;AAC1I,mFAAkF;AAClF,iEAAwE;AAGjE,IAAM,mCAAmC,GAAzC,MAAM,mCAAmC;IAC5C,YAA6D,MAAqB;QAArB,WAAM,GAAN,MAAM,CAAe;IAAG,CAAC;IAE/E,aAAa;QAChB,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAS,6BAA6B,CAAC,CAAC;QAC5E,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAS,wCAAwC,EAAE,yBAAyB,CAAC,CAAC;QAClH,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAS,4CAA4C,EAAE,EAAE,CAAW,CAAC;QAClH,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAS,4BAA4B,EAAE,EAAE,CAAW,CAAC;QAExF,OAAO,IAAI,+BAAU,CACjB,8BAA8B,EAC9B,IAAI,qDAAyB,CAAC;YAC1B,MAAM,EAAE,KAAK;YACb,GAAG,EAAE,IAAI,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE;YACzC,OAAO,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE;YAChC,gBAAgB;SACnB,CAAC,EACF,IAAI,yCAAoB,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,EAC7C,IAAI,uCAAmB,CAAC,6BAA6B,EAAE,2DAA4B,CAAC,CACvF,CAAC;IACN,CAAC;CACJ,CAAA;AArBY,kFAAmC;8CAAnC,mCAAmC;IAD/C,IAAA,qBAAU,GAAE;IAEI,WAAA,IAAA,iBAAM,EAAC,qBAAS,CAAC,YAAY,CAAC,CAAA;;GADlC,mCAAmC,CAqB/C"}
@@ -6,6 +6,7 @@ const DBFYPRInformationPanelsDataSourceFactory_1 = require("../data-sources/DBFY
6
6
  const DBFYPRObelisksDataSourceFactory_1 = require("../data-sources/DBFYPRObelisksDataSourceFactory");
7
7
  const DBFYPRSignpostsDataSourceFactory_1 = require("../data-sources/DBFYPRSignpostsDataSourceFactory");
8
8
  const DBFYPRTotemsDataSourceFactory_1 = require("../data-sources/DBFYPRTotemsDataSourceFactory");
9
+ const DCIPStatusOverviewDataSourceFactory_1 = require("../data-sources/DCIPStatusOverviewDataSourceFactory");
9
10
  const DisplayCasesTransformation_1 = require("../transformations/DisplayCasesTransformation");
10
11
  const InformationPanelsTransformation_1 = require("../transformations/InformationPanelsTransformation");
11
12
  const ObelisksTransformation_1 = require("../transformations/ObelisksTransformation");
@@ -28,6 +29,8 @@ const ObeliskRepository_1 = require("../repositories/ObeliskRepository");
28
29
  const SignpostRepository_1 = require("../repositories/SignpostRepository");
29
30
  const TotemRepository_1 = require("../repositories/TotemRepository");
30
31
  const UpdatePresetsTask_1 = require("../workers/tasks/UpdatePresetsTask");
32
+ const DeviceStatusRepository_1 = require("../repositories/DeviceStatusRepository");
33
+ const FetchDCIPStatusTask_1 = require("../workers/tasks/FetchDCIPStatusTask");
31
34
  //#region Initialization
32
35
  exports.fyprIEContainer = Di_1.IntegrationEngineContainer.createChildContainer();
33
36
  //#endregion
@@ -37,7 +40,8 @@ exports.fyprIEContainer
37
40
  .registerSingleton(FYPRIEContainerTokens_1.fyprIEContainerTokens.DBFYPRInformationPanelsDataSourceFactory, DBFYPRInformationPanelsDataSourceFactory_1.DBFYPRInformationPanelsDataSourceFactory)
38
41
  .registerSingleton(FYPRIEContainerTokens_1.fyprIEContainerTokens.DBFYPRObelisksDataSourceFactory, DBFYPRObelisksDataSourceFactory_1.DBFYPRObelisksDataSourceFactory)
39
42
  .registerSingleton(FYPRIEContainerTokens_1.fyprIEContainerTokens.DBFYPRSignpostsDataSourceFactory, DBFYPRSignpostsDataSourceFactory_1.DBFYPRSignpostsDataSourceFactory)
40
- .registerSingleton(FYPRIEContainerTokens_1.fyprIEContainerTokens.DBFYPRTotemsDataSourceFactory, DBFYPRTotemsDataSourceFactory_1.DBFYPRTotemsDataSourceFactory);
43
+ .registerSingleton(FYPRIEContainerTokens_1.fyprIEContainerTokens.DBFYPRTotemsDataSourceFactory, DBFYPRTotemsDataSourceFactory_1.DBFYPRTotemsDataSourceFactory)
44
+ .registerSingleton(FYPRIEContainerTokens_1.fyprIEContainerTokens.DCIPStatusOverviewDataSourceFactory, DCIPStatusOverviewDataSourceFactory_1.DCIPStatusOverviewDataSourceFactory);
41
45
  //#endregion
42
46
  //#region Repositories
43
47
  exports.fyprIEContainer
@@ -48,7 +52,8 @@ exports.fyprIEContainer
48
52
  .registerSingleton(FYPRIEContainerTokens_1.fyprIEContainerTokens.TotemRepository, TotemRepository_1.TotemRepository)
49
53
  .registerSingleton(FYPRIEContainerTokens_1.fyprIEContainerTokens.InformationPanelPresetsRepository, InformationPanelPresetsRepository_1.InformationPanelPresetsRepository)
50
54
  .registerSingleton(FYPRIEContainerTokens_1.fyprIEContainerTokens.InformationPanelPresetsStopsRepository, InformationPanelPresetsStopsRepository_1.InformationPanelPresetsStopsRepository)
51
- .registerSingleton(FYPRIEContainerTokens_1.fyprIEContainerTokens.InformationPanelPresetsRoutesRepository, InformationPanelPresetsRoutesRepository_1.InformationPanelPresetsRoutesRepository);
55
+ .registerSingleton(FYPRIEContainerTokens_1.fyprIEContainerTokens.InformationPanelPresetsRoutesRepository, InformationPanelPresetsRoutesRepository_1.InformationPanelPresetsRoutesRepository)
56
+ .registerSingleton(FYPRIEContainerTokens_1.fyprIEContainerTokens.DeviceStatusRepository, DeviceStatusRepository_1.DeviceStatusRepository);
52
57
  //#endregion
53
58
  //#region Tasks
54
59
  exports.fyprIEContainer
@@ -58,7 +63,8 @@ exports.fyprIEContainer
58
63
  .registerSingleton(FYPRIEContainerTokens_1.fyprIEContainerTokens.UpdateObelisksTask, UpdateObelisksTask_1.UpdateObelisksTask)
59
64
  .registerSingleton(FYPRIEContainerTokens_1.fyprIEContainerTokens.UpdateSignpostsTask, UpdateSignpostsTask_1.UpdateSignpostsTask)
60
65
  .registerSingleton(FYPRIEContainerTokens_1.fyprIEContainerTokens.UpdateTotemsTask, UpdateTotemsTask_1.UpdateTotemsTask)
61
- .registerSingleton(FYPRIEContainerTokens_1.fyprIEContainerTokens.UpdatePresetsTask, UpdatePresetsTask_1.UpdatePresetsTask);
66
+ .registerSingleton(FYPRIEContainerTokens_1.fyprIEContainerTokens.UpdatePresetsTask, UpdatePresetsTask_1.UpdatePresetsTask)
67
+ .registerSingleton(FYPRIEContainerTokens_1.fyprIEContainerTokens.FetchDCIPStatusTask, FetchDCIPStatusTask_1.FetchDCIPStatusTask);
62
68
  //#endregion
63
69
  //#region Transformations
64
70
  exports.fyprIEContainer
@@ -1 +1 @@
1
- {"version":3,"file":"Di.js","sourceRoot":"","sources":["../../../src/integration-engine/ioc/Di.ts"],"names":[],"mappings":";;;AAAA,6GAA2G;AAC3G,uHAAqH;AACrH,qGAAmG;AACnG,uGAAqG;AACrG,iGAA+F;AAC/F,8FAA4F;AAC5F,wGAAsG;AACtG,sFAAoF;AACpF,wFAAsF;AACtF,kFAAgF;AAChF,sEAAoE;AACpE,oFAAkF;AAClF,8FAA4F;AAC5F,4EAA0E;AAC1E,8EAA4E;AAC5E,wEAAsE;AACtE,qEAA0F;AAE1F,mEAAgE;AAChE,iFAA+E;AAC/E,yGAAuG;AACvG,qHAAmH;AACnH,mHAAiH;AACjH,2FAAyF;AACzF,yEAAuE;AACvE,2EAAyE;AACzE,qEAAmE;AACnE,0EAAwE;AAExE,wBAAwB;AACX,QAAA,eAAe,GAAwB,+BAA0B,CAAC,oBAAoB,EAAE,CAAC;AACtG,YAAY;AAEZ,sBAAsB;AACtB,uBAAe;KACV,iBAAiB,CAAC,6CAAqB,CAAC,mCAAmC,EAAE,yEAAmC,CAAC;KACjH,iBAAiB,CAAC,6CAAqB,CAAC,wCAAwC,EAAE,mFAAwC,CAAC;KAC3H,iBAAiB,CAAC,6CAAqB,CAAC,+BAA+B,EAAE,iEAA+B,CAAC;KACzG,iBAAiB,CAAC,6CAAqB,CAAC,gCAAgC,EAAE,mEAAgC,CAAC;KAC3G,iBAAiB,CAAC,6CAAqB,CAAC,6BAA6B,EAAE,6DAA6B,CAAC,CAAC;AAC3G,YAAY;AAEZ,sBAAsB;AACtB,uBAAe;KACV,iBAAiB,CAAC,6CAAqB,CAAC,qBAAqB,EAAE,6CAAqB,CAAC;KACrF,iBAAiB,CAAC,6CAAqB,CAAC,0BAA0B,EAAE,uDAA0B,CAAC;KAC/F,iBAAiB,CAAC,6CAAqB,CAAC,iBAAiB,EAAE,qCAAiB,CAAC;KAC7E,iBAAiB,CAAC,6CAAqB,CAAC,kBAAkB,EAAE,uCAAkB,CAAC;KAC/E,iBAAiB,CAAC,6CAAqB,CAAC,eAAe,EAAE,iCAAe,CAAC;KACzE,iBAAiB,CAAC,6CAAqB,CAAC,iCAAiC,EAAE,qEAAiC,CAAC;KAC7G,iBAAiB,CAAC,6CAAqB,CAAC,sCAAsC,EAAE,+EAAsC,CAAC;KACvH,iBAAiB,CAAC,6CAAqB,CAAC,uCAAuC,EAAE,iFAAuC,CAAC,CAAC;AAC/H,YAAY;AAEZ,eAAe;AACf,uBAAe;KACV,iBAAiB,CAAC,6CAAqB,CAAC,eAAe,EAAE,iCAAe,CAAC;KACzE,iBAAiB,CAAC,6CAAqB,CAAC,sBAAsB,EAAE,+CAAsB,CAAC;KACvF,iBAAiB,CAAC,6CAAqB,CAAC,2BAA2B,EAAE,yDAA2B,CAAC;KACjG,iBAAiB,CAAC,6CAAqB,CAAC,kBAAkB,EAAE,uCAAkB,CAAC;KAC/E,iBAAiB,CAAC,6CAAqB,CAAC,mBAAmB,EAAE,yCAAmB,CAAC;KACjF,iBAAiB,CAAC,6CAAqB,CAAC,gBAAgB,EAAE,mCAAgB,CAAC;KAC3E,iBAAiB,CAAC,6CAAqB,CAAC,iBAAiB,EAAE,qCAAiB,CAAC,CAAC;AACnF,YAAY;AAEZ,yBAAyB;AACzB,uBAAe;KACV,iBAAiB,CAAC,6CAAqB,CAAC,0BAA0B,EAAE,uDAA0B,CAAC;KAC/F,iBAAiB,CAAC,6CAAqB,CAAC,+BAA+B,EAAE,iEAA+B,CAAC;KACzG,iBAAiB,CAAC,6CAAqB,CAAC,sBAAsB,EAAE,+CAAsB,CAAC;KACvF,iBAAiB,CAAC,6CAAqB,CAAC,uBAAuB,EAAE,iDAAuB,CAAC;KACzF,iBAAiB,CAAC,6CAAqB,CAAC,oBAAoB,EAAE,2CAAoB,CAAC,CAAC;AACzF,YAAY"}
1
+ {"version":3,"file":"Di.js","sourceRoot":"","sources":["../../../src/integration-engine/ioc/Di.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ export declare const fyprIEContainerTokens: {
4
4
  DBFYPRObelisksDataSourceFactory: symbol;
5
5
  DBFYPRSignpostsDataSourceFactory: symbol;
6
6
  DBFYPRTotemsDataSourceFactory: symbol;
7
+ DCIPStatusOverviewDataSourceFactory: symbol;
7
8
  DisplayCaseRepository: symbol;
8
9
  InformationPanelRepository: symbol;
9
10
  ObeliskRepository: symbol;
@@ -12,6 +13,7 @@ export declare const fyprIEContainerTokens: {
12
13
  InformationPanelPresetsRepository: symbol;
13
14
  InformationPanelPresetsStopsRepository: symbol;
14
15
  InformationPanelPresetsRoutesRepository: symbol;
16
+ DeviceStatusRepository: symbol;
15
17
  FetchDBFYPRTask: symbol;
16
18
  UpdateDisplayCasesTask: symbol;
17
19
  UpdateInformationPanelsTask: symbol;
@@ -19,6 +21,7 @@ export declare const fyprIEContainerTokens: {
19
21
  UpdateSignpostsTask: symbol;
20
22
  UpdateTotemsTask: symbol;
21
23
  UpdatePresetsTask: symbol;
24
+ FetchDCIPStatusTask: symbol;
22
25
  DisplayCasesTransformation: symbol;
23
26
  InformationPanelsTransformation: symbol;
24
27
  ObelisksTransformation: symbol;
@@ -8,6 +8,7 @@ exports.fyprIEContainerTokens = {
8
8
  DBFYPRObelisksDataSourceFactory: Symbol("DBFYPRObelisksDataSourceFactory"),
9
9
  DBFYPRSignpostsDataSourceFactory: Symbol("DBFYPRSignpostsDataSourceFactory"),
10
10
  DBFYPRTotemsDataSourceFactory: Symbol("DBFYPRTotemsDataSourceFactory"),
11
+ DCIPStatusOverviewDataSourceFactory: Symbol("DCIPStatusOverviewDataSourceFactory"),
11
12
  //#endregion
12
13
  //#region Repositories
13
14
  DisplayCaseRepository: Symbol("DisplayCaseRepository"),
@@ -21,6 +22,9 @@ exports.fyprIEContainerTokens = {
21
22
  InformationPanelPresetsStopsRepository: Symbol("InformationPanelPresetsStopsRepository"),
22
23
  InformationPanelPresetsRoutesRepository: Symbol("InformationPanelPresetsRoutesRepository"),
23
24
  //#endregion
25
+ //#region Repositories (device status)
26
+ DeviceStatusRepository: Symbol("DeviceStatusRepository"),
27
+ //#endregion
24
28
  //#region Tasks
25
29
  FetchDBFYPRTask: Symbol("FetchDBFYPRTask"),
26
30
  UpdateDisplayCasesTask: Symbol("UpdateDisplayCasesTask"),
@@ -29,6 +33,7 @@ exports.fyprIEContainerTokens = {
29
33
  UpdateSignpostsTask: Symbol("UpdateSignpostsTask"),
30
34
  UpdateTotemsTask: Symbol("UpdateTotemsTask"),
31
35
  UpdatePresetsTask: Symbol("UpdatePresetsTask"),
36
+ FetchDCIPStatusTask: Symbol("FetchDCIPStatusTask"),
32
37
  //#endregion
33
38
  //#region Transformations
34
39
  DisplayCasesTransformation: Symbol("DisplayCasesTransformation"),
@@ -1 +1 @@
1
- {"version":3,"file":"FYPRIEContainerTokens.js","sourceRoot":"","sources":["../../../src/integration-engine/ioc/FYPRIEContainerTokens.ts"],"names":[],"mappings":";;;AAAa,QAAA,qBAAqB,GAAG;IACjC,sBAAsB;IACtB,mCAAmC,EAAE,MAAM,CAAC,qCAAqC,CAAC;IAClF,wCAAwC,EAAE,MAAM,CAAC,0CAA0C,CAAC;IAC5F,+BAA+B,EAAE,MAAM,CAAC,iCAAiC,CAAC;IAC1E,gCAAgC,EAAE,MAAM,CAAC,kCAAkC,CAAC;IAC5E,6BAA6B,EAAE,MAAM,CAAC,+BAA+B,CAAC;IACtE,YAAY;IAEZ,sBAAsB;IACtB,qBAAqB,EAAE,MAAM,CAAC,uBAAuB,CAAC;IACtD,0BAA0B,EAAE,MAAM,CAAC,4BAA4B,CAAC;IAChE,iBAAiB,EAAE,MAAM,CAAC,mBAAmB,CAAC;IAC9C,kBAAkB,EAAE,MAAM,CAAC,oBAAoB,CAAC;IAChD,eAAe,EAAE,MAAM,CAAC,iBAAiB,CAAC;IAC1C,YAAY;IAEZ,gCAAgC;IAChC,iCAAiC,EAAE,MAAM,CAAC,mCAAmC,CAAC;IAC9E,sCAAsC,EAAE,MAAM,CAAC,wCAAwC,CAAC;IACxF,uCAAuC,EAAE,MAAM,CAAC,yCAAyC,CAAC;IAC1F,YAAY;IAEZ,eAAe;IACf,eAAe,EAAE,MAAM,CAAC,iBAAiB,CAAC;IAC1C,sBAAsB,EAAE,MAAM,CAAC,wBAAwB,CAAC;IACxD,2BAA2B,EAAE,MAAM,CAAC,6BAA6B,CAAC;IAClE,kBAAkB,EAAE,MAAM,CAAC,oBAAoB,CAAC;IAChD,mBAAmB,EAAE,MAAM,CAAC,qBAAqB,CAAC;IAClD,gBAAgB,EAAE,MAAM,CAAC,kBAAkB,CAAC;IAC5C,iBAAiB,EAAE,MAAM,CAAC,mBAAmB,CAAC;IAC9C,YAAY;IAEZ,yBAAyB;IACzB,0BAA0B,EAAE,MAAM,CAAC,4BAA4B,CAAC;IAChE,+BAA+B,EAAE,MAAM,CAAC,iCAAiC,CAAC;IAC1E,sBAAsB,EAAE,MAAM,CAAC,wBAAwB,CAAC;IACxD,uBAAuB,EAAE,MAAM,CAAC,yBAAyB,CAAC;IAC1D,oBAAoB,EAAE,MAAM,CAAC,sBAAsB,CAAC;IACpD,YAAY;CACf,CAAC"}
1
+ {"version":3,"file":"FYPRIEContainerTokens.js","sourceRoot":"","sources":["../../../src/integration-engine/ioc/FYPRIEContainerTokens.ts"],"names":[],"mappings":";;;AAAa,QAAA,qBAAqB,GAAG;IACjC,sBAAsB;IACtB,mCAAmC,EAAE,MAAM,CAAC,qCAAqC,CAAC;IAClF,wCAAwC,EAAE,MAAM,CAAC,0CAA0C,CAAC;IAC5F,+BAA+B,EAAE,MAAM,CAAC,iCAAiC,CAAC;IAC1E,gCAAgC,EAAE,MAAM,CAAC,kCAAkC,CAAC;IAC5E,6BAA6B,EAAE,MAAM,CAAC,+BAA+B,CAAC;IACtE,mCAAmC,EAAE,MAAM,CAAC,qCAAqC,CAAC;IAClF,YAAY;IAEZ,sBAAsB;IACtB,qBAAqB,EAAE,MAAM,CAAC,uBAAuB,CAAC;IACtD,0BAA0B,EAAE,MAAM,CAAC,4BAA4B,CAAC;IAChE,iBAAiB,EAAE,MAAM,CAAC,mBAAmB,CAAC;IAC9C,kBAAkB,EAAE,MAAM,CAAC,oBAAoB,CAAC;IAChD,eAAe,EAAE,MAAM,CAAC,iBAAiB,CAAC;IAC1C,YAAY;IAEZ,gCAAgC;IAChC,iCAAiC,EAAE,MAAM,CAAC,mCAAmC,CAAC;IAC9E,sCAAsC,EAAE,MAAM,CAAC,wCAAwC,CAAC;IACxF,uCAAuC,EAAE,MAAM,CAAC,yCAAyC,CAAC;IAC1F,YAAY;IAEZ,sCAAsC;IACtC,sBAAsB,EAAE,MAAM,CAAC,wBAAwB,CAAC;IACxD,YAAY;IAEZ,eAAe;IACf,eAAe,EAAE,MAAM,CAAC,iBAAiB,CAAC;IAC1C,sBAAsB,EAAE,MAAM,CAAC,wBAAwB,CAAC;IACxD,2BAA2B,EAAE,MAAM,CAAC,6BAA6B,CAAC;IAClE,kBAAkB,EAAE,MAAM,CAAC,oBAAoB,CAAC;IAChD,mBAAmB,EAAE,MAAM,CAAC,qBAAqB,CAAC;IAClD,gBAAgB,EAAE,MAAM,CAAC,kBAAkB,CAAC;IAC5C,iBAAiB,EAAE,MAAM,CAAC,mBAAmB,CAAC;IAC9C,mBAAmB,EAAE,MAAM,CAAC,qBAAqB,CAAC;IAClD,YAAY;IAEZ,yBAAyB;IACzB,0BAA0B,EAAE,MAAM,CAAC,4BAA4B,CAAC;IAChE,+BAA+B,EAAE,MAAM,CAAC,iCAAiC,CAAC;IAC1E,sBAAsB,EAAE,MAAM,CAAC,wBAAwB,CAAC;IACxD,uBAAuB,EAAE,MAAM,CAAC,yBAAyB,CAAC;IAC1D,oBAAoB,EAAE,MAAM,CAAC,sBAAsB,CAAC;IACpD,YAAY;CACf,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { ILogger } from "@golemio/core/dist/helpers";
2
+ import { IDatabaseConnector } from "@golemio/core/dist/helpers/data-access/postgres/IDatabaseConnector";
3
+ import { AbstractValidatableRepository } from "@golemio/core/dist/helpers/data-access/postgres/repositories/AbstractValidatableRepository";
4
+ import { JSONSchemaValidator } from "@golemio/core/dist/shared/golemio-validator";
5
+ import { IDCIPStatusOverview } from "../../schema-definitions/data-sources/interfaces/IDCIPStatusOverview";
6
+ import { IDeviceStatus } from "../../schema-definitions/models/interfaces/IDeviceStatus";
7
+ export declare class DeviceStatusRepository extends AbstractValidatableRepository {
8
+ schema: string;
9
+ tableName: string;
10
+ validator: JSONSchemaValidator;
11
+ private sequelizeModel;
12
+ constructor(connector: IDatabaseConnector, log: ILogger);
13
+ /** Upsert only — a device missing from the current DCIP response keeps its last known status. */
14
+ updateList(data: IDCIPStatusOverview[]): Promise<IDeviceStatus[]>;
15
+ private dedupeByDeviceId;
16
+ private lastContactTime;
17
+ }
@@ -0,0 +1,81 @@
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.DeviceStatusRepository = void 0;
16
+ const AbstractValidatableRepository_1 = require("@golemio/core/dist/helpers/data-access/postgres/repositories/AbstractValidatableRepository");
17
+ const CoreToken_1 = require("@golemio/core/dist/helpers/ioc/CoreToken");
18
+ const golemio_errors_1 = require("@golemio/core/dist/shared/golemio-errors");
19
+ const golemio_validator_1 = require("@golemio/core/dist/shared/golemio-validator");
20
+ const tsyringe_1 = require("@golemio/core/dist/shared/tsyringe");
21
+ const const_1 = require("../../schema-definitions/const");
22
+ const DCIPStatusOverviewJSONSchema_1 = require("../../schema-definitions/data-sources/DCIPStatusOverviewJSONSchema");
23
+ const DeviceStatusModel_1 = require("../../schema-definitions/models/DeviceStatusModel");
24
+ let DeviceStatusRepository = class DeviceStatusRepository extends AbstractValidatableRepository_1.AbstractValidatableRepository {
25
+ constructor(connector, log) {
26
+ super(connector, log);
27
+ this.schema = const_1.PG_SCHEMA;
28
+ this.tableName = DeviceStatusModel_1.DeviceStatusModel.tableName;
29
+ this.validator = new golemio_validator_1.JSONSchemaValidator("DeviceStatusRepository", DCIPStatusOverviewJSONSchema_1.dcipStatusOverviewJSONSchema);
30
+ this.sequelizeModel = connector
31
+ .getConnection()
32
+ .define(this.tableName, DeviceStatusModel_1.DeviceStatusModel.attributeModel, { schema: this.schema, timestamps: false });
33
+ }
34
+ /** Upsert only — a device missing from the current DCIP response keeps its last known status. */
35
+ async updateList(data) {
36
+ await this.validator.Validate(data);
37
+ const deduped = this.dedupeByDeviceId(data);
38
+ if (!deduped.length) {
39
+ return [];
40
+ }
41
+ try {
42
+ const rows = await this.sequelizeModel.bulkCreate(deduped.map(({ device_id, last_contact, status }) => ({
43
+ device_id,
44
+ last_contact: last_contact ? new Date(last_contact) : null,
45
+ status,
46
+ updated_at: new Date(),
47
+ })), { updateOnDuplicate: DeviceStatusModel_1.DeviceStatusModel.getUpdateAttributes() });
48
+ return rows;
49
+ }
50
+ catch (err) {
51
+ throw new golemio_errors_1.GeneralError("updateList error", this.constructor.name, err);
52
+ }
53
+ }
54
+ // A duplicate device_id would make bulkCreate's ON CONFLICT clause fail (it cannot update the
55
+ // same row twice in one statement), and the source does not guarantee ordering — so the entry
56
+ // with the newest last_contact wins, not the last one in the array.
57
+ dedupeByDeviceId(data) {
58
+ const byDeviceId = new Map();
59
+ for (const item of data) {
60
+ const kept = byDeviceId.get(item.device_id);
61
+ if (!kept || this.lastContactTime(item) >= this.lastContactTime(kept)) {
62
+ byDeviceId.set(item.device_id, item);
63
+ }
64
+ }
65
+ if (byDeviceId.size !== data.length) {
66
+ this.log.warn(`${this.constructor.name}.updateList: DCIP response contained ${data.length - byDeviceId.size} duplicate device_id(s); kept the entry with the newest last_contact for each`);
67
+ }
68
+ return [...byDeviceId.values()];
69
+ }
70
+ lastContactTime(item) {
71
+ return item.last_contact ? Date.parse(item.last_contact) : -Infinity;
72
+ }
73
+ };
74
+ exports.DeviceStatusRepository = DeviceStatusRepository;
75
+ exports.DeviceStatusRepository = DeviceStatusRepository = __decorate([
76
+ (0, tsyringe_1.injectable)(),
77
+ __param(0, (0, tsyringe_1.inject)(CoreToken_1.CoreToken.PostgresConnector)),
78
+ __param(1, (0, tsyringe_1.inject)(CoreToken_1.CoreToken.Logger)),
79
+ __metadata("design:paramtypes", [Object, Object])
80
+ ], DeviceStatusRepository);
81
+ //# sourceMappingURL=DeviceStatusRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeviceStatusRepository.js","sourceRoot":"","sources":["../../../src/integration-engine/repositories/DeviceStatusRepository.ts"],"names":[],"mappings":"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"}
@@ -24,6 +24,7 @@ class FYPRWorker extends workers_1.AbstractWorker {
24
24
  Di_1.fyprIEContainer.resolve(FYPRIEContainerTokens_1.fyprIEContainerTokens.UpdateSignpostsTask),
25
25
  Di_1.fyprIEContainer.resolve(FYPRIEContainerTokens_1.fyprIEContainerTokens.UpdateTotemsTask),
26
26
  Di_1.fyprIEContainer.resolve(FYPRIEContainerTokens_1.fyprIEContainerTokens.UpdatePresetsTask),
27
+ Di_1.fyprIEContainer.resolve(FYPRIEContainerTokens_1.fyprIEContainerTokens.FetchDCIPStatusTask),
27
28
  ];
28
29
  for (const task of tasks) {
29
30
  this.registerTask(task);
@@ -1 +1 @@
1
- {"version":3,"file":"FYPRWorker.js","sourceRoot":"","sources":["../../../src/integration-engine/workers/FYPRWorker.ts"],"names":[],"mappings":";;;AAAA,kCAA6C;AAC7C,wEAAsE;AACtE,2EAA+E;AAE/E,2CAA+C;AAS/C,MAAa,UAAW,SAAQ,wBAAc;IAG1C;QACI,KAAK,EAAE,CAAC;QAHgB,SAAI,GAAG,4BAAgB,CAAC,WAAW,EAAE,CAAC;QAI9D,IAAI,CAAC,aAAa,EAAE,CAAC;IACzB,CAAC;IAEe,YAAY,CAAC,IAAW;QACpC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;IAC7C,CAAC;IAEO,aAAa;QACjB,MAAM,KAAK,GAAG;YACV,oBAAe,CAAC,OAAO,CAAkB,6CAAqB,CAAC,eAAe,CAAC;YAC/E,oBAAe,CAAC,OAAO,CAAyB,6CAAqB,CAAC,sBAAsB,CAAC;YAC7F,oBAAe,CAAC,OAAO,CAA8B,6CAAqB,CAAC,2BAA2B,CAAC;YACvG,oBAAe,CAAC,OAAO,CAAqB,6CAAqB,CAAC,kBAAkB,CAAC;YACrF,oBAAe,CAAC,OAAO,CAAsB,6CAAqB,CAAC,mBAAmB,CAAC;YACvF,oBAAe,CAAC,OAAO,CAAmB,6CAAqB,CAAC,gBAAgB,CAAC;YACjF,oBAAe,CAAC,OAAO,CAAoB,6CAAqB,CAAC,iBAAiB,CAAC;SACtF,CAAC;QACF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;IACL,CAAC;CACJ;AA3BD,gCA2BC"}
1
+ {"version":3,"file":"FYPRWorker.js","sourceRoot":"","sources":["../../../src/integration-engine/workers/FYPRWorker.ts"],"names":[],"mappings":";;;AAAA,kCAA6C;AAC7C,wEAAsE;AACtE,2EAA+E;AAE/E,2CAA+C;AAU/C,MAAa,UAAW,SAAQ,wBAAc;IAG1C;QACI,KAAK,EAAE,CAAC;QAHgB,SAAI,GAAG,4BAAgB,CAAC,WAAW,EAAE,CAAC;QAI9D,IAAI,CAAC,aAAa,EAAE,CAAC;IACzB,CAAC;IAEe,YAAY,CAAC,IAAW;QACpC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;IAC7C,CAAC;IAEO,aAAa;QACjB,MAAM,KAAK,GAAG;YACV,oBAAe,CAAC,OAAO,CAAkB,6CAAqB,CAAC,eAAe,CAAC;YAC/E,oBAAe,CAAC,OAAO,CAAyB,6CAAqB,CAAC,sBAAsB,CAAC;YAC7F,oBAAe,CAAC,OAAO,CAA8B,6CAAqB,CAAC,2BAA2B,CAAC;YACvG,oBAAe,CAAC,OAAO,CAAqB,6CAAqB,CAAC,kBAAkB,CAAC;YACrF,oBAAe,CAAC,OAAO,CAAsB,6CAAqB,CAAC,mBAAmB,CAAC;YACvF,oBAAe,CAAC,OAAO,CAAmB,6CAAqB,CAAC,gBAAgB,CAAC;YACjF,oBAAe,CAAC,OAAO,CAAoB,6CAAqB,CAAC,iBAAiB,CAAC;YACnF,oBAAe,CAAC,OAAO,CAAsB,6CAAqB,CAAC,mBAAmB,CAAC;SAC1F,CAAC;QACF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;IACL,CAAC;CACJ;AA5BD,gCA4BC"}
@@ -0,0 +1,12 @@
1
+ import { DCIPStatusOverviewDataSourceFactory } from "../../data-sources/DCIPStatusOverviewDataSourceFactory";
2
+ import { DeviceStatusRepository } from "../../repositories/DeviceStatusRepository";
3
+ import { AbstractEmptyTask } from "@golemio/core/dist/integration-engine";
4
+ export declare class FetchDCIPStatusTask extends AbstractEmptyTask {
5
+ private readonly dataSourceFactory;
6
+ private readonly deviceStatusRepository;
7
+ readonly queueName = "fetchDCIPStatus";
8
+ readonly queueTtl: number;
9
+ private consecutiveFailures;
10
+ constructor(dataSourceFactory: DCIPStatusOverviewDataSourceFactory, deviceStatusRepository: DeviceStatusRepository);
11
+ protected execute(): Promise<void>;
12
+ }
@@ -0,0 +1,55 @@
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.FetchDCIPStatusTask = void 0;
16
+ const DCIPStatusOverviewDataSourceFactory_1 = require("../../data-sources/DCIPStatusOverviewDataSourceFactory");
17
+ const DeviceStatusRepository_1 = require("../../repositories/DeviceStatusRepository");
18
+ const FYPRIEContainerTokens_1 = require("../../ioc/FYPRIEContainerTokens");
19
+ const integration_engine_1 = require("@golemio/core/dist/integration-engine");
20
+ const golemio_errors_1 = require("@golemio/core/dist/shared/golemio-errors");
21
+ const tsyringe_1 = require("@golemio/core/dist/shared/tsyringe");
22
+ const constants_1 = require("../constants");
23
+ let FetchDCIPStatusTask = class FetchDCIPStatusTask extends integration_engine_1.AbstractEmptyTask {
24
+ constructor(dataSourceFactory, deviceStatusRepository) {
25
+ super(constants_1.FYPR_WORKER_NAME.toLowerCase());
26
+ this.dataSourceFactory = dataSourceFactory;
27
+ this.deviceStatusRepository = deviceStatusRepository;
28
+ this.queueName = "fetchDCIPStatus";
29
+ this.queueTtl = 55 * 1000;
30
+ // This task runs every minute, so a broken source produces one error per minute in Loki.
31
+ // Alert rules match on the stable keyword; the consecutive-failure count lets them fire
32
+ // only on sustained outages (e.g. 3+ in a row) instead of a single network hiccup.
33
+ this.consecutiveFailures = 0;
34
+ }
35
+ async execute() {
36
+ try {
37
+ const data = await this.dataSourceFactory.getDataSource().getAll();
38
+ await this.deviceStatusRepository.updateList(data);
39
+ this.consecutiveFailures = 0;
40
+ }
41
+ catch (err) {
42
+ this.consecutiveFailures++;
43
+ throw new golemio_errors_1.GeneralError(`DCIP_STATUS_IMPORT_FAILED (${this.consecutiveFailures} in a row): error while importing DCIP status overview`, this.constructor.name, err);
44
+ }
45
+ }
46
+ };
47
+ exports.FetchDCIPStatusTask = FetchDCIPStatusTask;
48
+ exports.FetchDCIPStatusTask = FetchDCIPStatusTask = __decorate([
49
+ (0, tsyringe_1.injectable)(),
50
+ __param(0, (0, tsyringe_1.inject)(FYPRIEContainerTokens_1.fyprIEContainerTokens.DCIPStatusOverviewDataSourceFactory)),
51
+ __param(1, (0, tsyringe_1.inject)(FYPRIEContainerTokens_1.fyprIEContainerTokens.DeviceStatusRepository)),
52
+ __metadata("design:paramtypes", [DCIPStatusOverviewDataSourceFactory_1.DCIPStatusOverviewDataSourceFactory,
53
+ DeviceStatusRepository_1.DeviceStatusRepository])
54
+ ], FetchDCIPStatusTask);
55
+ //# sourceMappingURL=FetchDCIPStatusTask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FetchDCIPStatusTask.js","sourceRoot":"","sources":["../../../../src/integration-engine/workers/tasks/FetchDCIPStatusTask.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,gHAA2G;AAC3G,sFAAiF;AACjF,2EAAsE;AACtE,8EAA0E;AAC1E,6EAAwE;AACxE,iEAAwE;AACxE,4CAAgD;AAGzC,IAAM,mBAAmB,GAAzB,MAAM,mBAAoB,SAAQ,sCAAiB;IAStD,YAEI,iBAAuE,EAEvE,sBAA+D;QAE/D,KAAK,CAAC,4BAAgB,CAAC,WAAW,EAAE,CAAC,CAAC;QAJrB,sBAAiB,GAAjB,iBAAiB,CAAqC;QAEtD,2BAAsB,GAAtB,sBAAsB,CAAwB;QAZ1C,cAAS,GAAG,iBAAiB,CAAC;QAC9B,aAAQ,GAAG,EAAE,GAAG,IAAI,CAAC;QAE9C,yFAAyF;QACzF,wFAAwF;QACxF,mFAAmF;QAC3E,wBAAmB,GAAG,CAAC,CAAC;IAShC,CAAC;IAEkB,KAAK,CAAC,OAAO;QAC5B,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE,CAAC;YACnE,MAAM,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACnD,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3B,MAAM,IAAI,6BAAY,CAClB,8BAA8B,IAAI,CAAC,mBAAmB,wDAAwD,EAC9G,IAAI,CAAC,WAAW,CAAC,IAAI,EACrB,GAAG,CACN,CAAC;QACN,CAAC;IACL,CAAC;CACJ,CAAA;AAhCY,kDAAmB;8BAAnB,mBAAmB;IAD/B,IAAA,qBAAU,GAAE;IAWJ,WAAA,IAAA,iBAAM,EAAC,6CAAqB,CAAC,mCAAmC,CAAC,CAAA;IAEjE,WAAA,IAAA,iBAAM,EAAC,6CAAqB,CAAC,sBAAsB,CAAC,CAAA;qCADjB,yEAAmC;QAE9B,+CAAsB;GAb1D,mBAAmB,CAgC/B"}
@@ -30,7 +30,7 @@ let V1FyprElementKindsController = class V1FyprElementKindsController {
30
30
  const { kind, limit, offset, jis, scopes, state, hasDeviceId } = (0, express_validator_1.matchedData)(req);
31
31
  const effectiveLimit = req.query.limit !== undefined ? Number(limit) : this.defaultLimit;
32
32
  const where = kind === "information-panels" ? this.buildInformationPanelWhere({ jis, state, hasDeviceId }) : {};
33
- const embeds = scopes ? [scopes] : undefined;
33
+ const embeds = scopes ? (Array.isArray(scopes) ? scopes : [scopes]) : undefined;
34
34
  const data = await this.getRepositoryByKind(kind).getAll({
35
35
  limit: effectiveLimit,
36
36
  offset: offset != null ? Number(offset) : undefined,
@@ -1 +1 @@
1
- {"version":3,"file":"V1FyprElementKindsController.js","sourceRoot":"","sources":["../../../../../src/output-gateway/fypr/controllers/v1/V1FyprElementKindsController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"V1FyprElementKindsController.js","sourceRoot":"","sources":["../../../../../src/output-gateway/fypr/controllers/v1/V1FyprElementKindsController.ts"],"names":[],"mappings":"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"}
@@ -22,13 +22,17 @@ class FyprElementRepository extends AbstractBasicRepository_1.AbstractBasicRepos
22
22
  const embedModel = sequelize.models[cfg.tableName] ??
23
23
  sequelize.define(cfg.tableName, cfg.attributeModel, { schema: const_1.PG_SCHEMA, timestamps: false });
24
24
  if (!this.sequelizeModel.associations[cfg.as]) {
25
- this.sequelizeModel.hasMany(embedModel, {
26
- foreignKey: cfg.foreignKey,
27
- sourceKey: cfg.sourceKey,
28
- as: cfg.as,
29
- });
25
+ const associationOptions = { foreignKey: cfg.foreignKey, sourceKey: cfg.sourceKey, as: cfg.as };
26
+ if (cfg.cardinality === "one") {
27
+ this.sequelizeModel.hasOne(embedModel, associationOptions);
28
+ }
29
+ else {
30
+ this.sequelizeModel.hasMany(embedModel, associationOptions);
31
+ }
30
32
  }
31
- return [key, { model: embedModel, as: cfg.as }];
33
+ // required: false explicitly an embed must never turn the query into an
34
+ // INNER JOIN and drop parent rows that have no related record.
35
+ return [key, { model: embedModel, as: cfg.as, required: false }];
32
36
  }));
33
37
  }
34
38
  return this._embedIncludes;
@@ -1 +1 @@
1
- {"version":3,"file":"FyprElementRepository.js","sourceRoot":"","sources":["../../../../src/output-gateway/fypr/data-access/FyprElementRepository.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FyprElementRepository.js","sourceRoot":"","sources":["../../../../src/output-gateway/fypr/data-access/FyprElementRepository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { ISimpleConfig } from "@golemio/core/dist/helpers/configuration/ISimpleConfig";
2
+ import { CacheHeaderMiddleware } from "@golemio/core/dist/output-gateway/CacheHeaderMiddleware";
3
+ import { RequestHandler } from "@golemio/core/dist/shared/express";
4
+ /**
5
+ * Builds a Cache-Control middleware from a `<configKeyPrefix>.maxAge` / `.staleWhileRevalidate`
6
+ * config pair, falling back to the given defaults. Centralized so each router's cache TTL can be
7
+ * tuned independently of the others without re-deriving the config lookup in every router.
8
+ */
9
+ export declare function resolveCacheMiddleware(cacheHeaderMiddleware: CacheHeaderMiddleware, config: ISimpleConfig, configKeyPrefix: string, defaults: {
10
+ maxAge: number;
11
+ staleWhileRevalidate: number;
12
+ }): RequestHandler;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveCacheMiddleware = resolveCacheMiddleware;
4
+ /**
5
+ * Builds a Cache-Control middleware from a `<configKeyPrefix>.maxAge` / `.staleWhileRevalidate`
6
+ * config pair, falling back to the given defaults. Centralized so each router's cache TTL can be
7
+ * tuned independently of the others without re-deriving the config lookup in every router.
8
+ */
9
+ function resolveCacheMiddleware(cacheHeaderMiddleware, config, configKeyPrefix, defaults) {
10
+ const maxAge = config.getValue(`${configKeyPrefix}.maxAge`, defaults.maxAge);
11
+ const staleWhileRevalidate = config.getValue(`${configKeyPrefix}.staleWhileRevalidate`, defaults.staleWhileRevalidate);
12
+ return cacheHeaderMiddleware.getMiddleware(maxAge, staleWhileRevalidate);
13
+ }
14
+ //# sourceMappingURL=cacheMiddleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cacheMiddleware.js","sourceRoot":"","sources":["../../../../../src/output-gateway/fypr/routers/middlewares/cacheMiddleware.ts"],"names":[],"mappings":";;AASA,wDAYC;AAjBD;;;;GAIG;AACH,SAAgB,sBAAsB,CAClC,qBAA4C,EAC5C,MAAqB,EACrB,eAAuB,EACvB,QAA0D;IAE1D,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAS,GAAG,eAAe,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAW,CAAC;IAC/F,MAAM,oBAAoB,GAAG,MAAM,CAAC,QAAQ,CACxC,GAAG,eAAe,uBAAuB,EACzC,QAAQ,CAAC,oBAAoB,CACtB,CAAC;IACZ,OAAO,qBAAqB,CAAC,aAAa,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;AAC7E,CAAC"}
@@ -4,6 +4,7 @@ exports.v1FyprElementKindsRouter = exports.V1FyprElementKindsRouter = void 0;
4
4
  const Di_1 = require("../../../ioc/Di");
5
5
  const FYPROGContainerTokens_1 = require("../../../ioc/FYPROGContainerTokens");
6
6
  const constants_1 = require("../../../shared/constants");
7
+ const cacheMiddleware_1 = require("../middlewares/cacheMiddleware");
7
8
  const index_1 = require("../../../../schema-definitions/index");
8
9
  const CoreToken_1 = require("@golemio/core/dist/helpers/ioc/CoreToken");
9
10
  const AbstractRouter_1 = require("@golemio/core/dist/helpers/routing/AbstractRouter");
@@ -22,14 +23,21 @@ class V1FyprElementKindsRouter extends AbstractRouter_1.AbstractRouter {
22
23
  }
23
24
  initRoutes() {
24
25
  const config = ioc_1.OutputGatewayContainer.resolve(CoreToken_1.CoreToken.SimpleConfig);
25
- const maxAge = config.getValue("module.fypr.output-gateway.elements.cache.maxAge", 5 * 60);
26
- const staleWhileRevalidate = config.getValue("module.fypr.output-gateway.elements.cache.staleWhileRevalidate", 60);
27
- const cacheMiddleware = this.cacheHeaderMiddleware.getMiddleware(maxAge, staleWhileRevalidate);
26
+ const cacheMiddleware = (0, cacheMiddleware_1.resolveCacheMiddleware)(this.cacheHeaderMiddleware, config, "module.fypr.output-gateway.elements.cache", { maxAge: 5 * 60, staleWhileRevalidate: 60 });
27
+ // DCIP refreshes device statuses ~1×/min, so the 5-minute default above would be too stale.
28
+ const deviceStatusCacheMiddleware = (0, cacheMiddleware_1.resolveCacheMiddleware)(this.cacheHeaderMiddleware, config, "module.fypr.output-gateway.deviceStatuses.cache", { maxAge: 60, staleWhileRevalidate: 30 });
29
+ const listCacheMiddleware = (req, res, next) => {
30
+ const scopes = req.query.scopes;
31
+ const requestsDeviceStatus = Array.isArray(scopes)
32
+ ? scopes.includes(index_1.SCOPE_DEVICE_STATUS)
33
+ : scopes === index_1.SCOPE_DEVICE_STATUS;
34
+ (requestsDeviceStatus ? deviceStatusCacheMiddleware : cacheMiddleware)(req, res, next);
35
+ };
28
36
  const kindParamMiddleware = (0, express_validator_1.param)("kind")
29
37
  .isIn(constants_1.fyprElementKinds)
30
38
  .withMessage(`kind must be one of: ${constants_1.fyprElementKinds.join(", ")}`);
31
39
  this.router.get("/", cacheMiddleware, this.controller.getIndex(`/${this.version}/${this.path}`));
32
- this.router.get("/:kind", kindParamMiddleware, ...this.informationPanelsQueryMiddleware(), (0, Validation_1.paginationLimitMiddleware)("FyprElementKindsRouter"), Validation_1.checkErrors, cacheMiddleware, this.controller.getAll);
40
+ this.router.get("/:kind", kindParamMiddleware, ...this.informationPanelsQueryMiddleware(), (0, Validation_1.paginationLimitMiddleware)("FyprElementKindsRouter"), Validation_1.checkErrors, listCacheMiddleware, this.controller.getAll);
33
41
  this.router.get("/:kind/:id", kindParamMiddleware, (0, express_validator_1.param)("id").isUUID(), Validation_1.checkErrors, cacheMiddleware, this.controller.getOne);
34
42
  }
35
43
  // Optional query filters that only apply to the information-panels listing. checkExact (in
@@ -46,8 +54,8 @@ class V1FyprElementKindsRouter extends AbstractRouter_1.AbstractRouter {
46
54
  .optional()
47
55
  .custom(InformationPanelsOnlyValidator_1.InformationPanelsOnlyValidator.field("scopes"))
48
56
  .bail()
49
- .isIn(["routes"])
50
- .withMessage("scopes must be one of: routes");
57
+ .isIn(index_1.informationPanelScopes)
58
+ .withMessage(`scopes must be one of: ${index_1.informationPanelScopes.join(", ")}`);
51
59
  const state = (0, express_validator_1.query)("state")
52
60
  .optional()
53
61
  .custom(InformationPanelsOnlyValidator_1.InformationPanelsOnlyValidator.field("state"))
@@ -1 +1 @@
1
- {"version":3,"file":"V1FyprElementKindsRouter.js","sourceRoot":"","sources":["../../../../../src/output-gateway/fypr/routers/v1/V1FyprElementKindsRouter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"V1FyprElementKindsRouter.js","sourceRoot":"","sources":["../../../../../src/output-gateway/fypr/routers/v1/V1FyprElementKindsRouter.ts"],"names":[],"mappings":"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"}