@golemio/chmu 1.1.1-dev.2644315801 → 1.1.1-dev.2644362300
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/db/migrations/postgresql/20260619120000-opendata-columns.js +49 -0
- package/db/migrations/postgresql/sqls/20260619120000-opendata-columns-down.sql +36 -0
- package/db/migrations/postgresql/sqls/20260619120000-opendata-columns-up.sql +40 -0
- package/dist/integration-engine/data-access/MeasurementsRepository.js +1 -1
- package/dist/integration-engine/data-access/MeasurementsRepository.js.map +1 -1
- package/dist/integration-engine/data-access/StationsRepository.d.ts +8 -0
- package/dist/integration-engine/data-access/StationsRepository.js +56 -0
- package/dist/integration-engine/data-access/StationsRepository.js.map +1 -0
- package/dist/integration-engine/datasources/OpendataDatasource.d.ts +30 -0
- package/dist/integration-engine/datasources/OpendataDatasource.js +80 -0
- package/dist/integration-engine/datasources/OpendataDatasource.js.map +1 -0
- package/dist/integration-engine/ioc/Di.js +8 -0
- package/dist/integration-engine/ioc/Di.js.map +1 -1
- package/dist/integration-engine/ioc/ModuleContainerToken.d.ts +4 -0
- package/dist/integration-engine/ioc/ModuleContainerToken.js +5 -0
- package/dist/integration-engine/ioc/ModuleContainerToken.js.map +1 -1
- package/dist/integration-engine/transformations/MeasurementsTransformation.js +18 -0
- package/dist/integration-engine/transformations/MeasurementsTransformation.js.map +1 -1
- package/dist/integration-engine/transformations/OpendataMeasurementsTransformation.d.ts +15 -0
- package/dist/integration-engine/transformations/OpendataMeasurementsTransformation.js +131 -0
- package/dist/integration-engine/transformations/OpendataMeasurementsTransformation.js.map +1 -0
- package/dist/integration-engine/workers/ChmuWorker.js +1 -0
- package/dist/integration-engine/workers/ChmuWorker.js.map +1 -1
- package/dist/integration-engine/workers/interfaces/IDownloadOpendataMessage.d.ts +8 -0
- package/dist/integration-engine/workers/interfaces/IDownloadOpendataMessage.js +3 -0
- package/dist/integration-engine/workers/interfaces/IDownloadOpendataMessage.js.map +1 -0
- package/dist/integration-engine/workers/tasks/DownloadMeasurementsTask.js +2 -2
- package/dist/integration-engine/workers/tasks/DownloadMeasurementsTask.js.map +1 -1
- package/dist/integration-engine/workers/tasks/DownloadOpendataMeasurementsTask.d.ts +22 -0
- package/dist/integration-engine/workers/tasks/DownloadOpendataMeasurementsTask.js +112 -0
- package/dist/integration-engine/workers/tasks/DownloadOpendataMeasurementsTask.js.map +1 -0
- package/dist/integration-engine/workers/tasks/DownloadOpendataMessageSchema.d.ts +6 -0
- package/dist/integration-engine/workers/tasks/DownloadOpendataMessageSchema.js +33 -0
- package/dist/integration-engine/workers/tasks/DownloadOpendataMessageSchema.js.map +1 -0
- package/dist/schema-definitions/datasources/OpendataSchemaProvider.d.ts +55 -0
- package/dist/schema-definitions/datasources/OpendataSchemaProvider.js +47 -0
- package/dist/schema-definitions/datasources/OpendataSchemaProvider.js.map +1 -0
- package/dist/schema-definitions/datasources/interfaces/IInputOpendataRecord.d.ts +15 -0
- package/dist/schema-definitions/datasources/interfaces/IInputOpendataRecord.js +3 -0
- package/dist/schema-definitions/datasources/interfaces/IInputOpendataRecord.js.map +1 -0
- package/dist/schema-definitions/definitions/interfaces/IMeasurementDto.d.ts +18 -0
- package/dist/schema-definitions/definitions/models/MeasurementModel.d.ts +18 -0
- package/dist/schema-definitions/definitions/models/MeasurementModel.js +37 -1
- package/dist/schema-definitions/definitions/models/MeasurementModel.js.map +1 -1
- package/docs/asyncapi.yaml +35 -3
- package/docs/implementation_documentation.md +81 -23
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IDownloadOpendataMessage.js","sourceRoot":"","sources":["../../../../src/integration-engine/workers/interfaces/IDownloadOpendataMessage.ts"],"names":[],"mappings":""}
|
|
@@ -20,12 +20,12 @@ const ChmuDatasource_1 = __importDefault(require("../../datasources/ChmuDatasour
|
|
|
20
20
|
const ModuleContainerToken_1 = require("../../ioc/ModuleContainerToken");
|
|
21
21
|
const MeasurementsTransformation_1 = require("../../transformations/MeasurementsTransformation");
|
|
22
22
|
const integration_engine_1 = require("@golemio/core/dist/integration-engine");
|
|
23
|
-
const ContainerToken_1 = require("@golemio/core/dist/integration-engine/ioc/ContainerToken");
|
|
24
23
|
const QueueManager_1 = require("@golemio/core/dist/integration-engine/queueprocessors/QueueManager");
|
|
25
24
|
const golemio_errors_1 = require("@golemio/core/dist/shared/golemio-errors");
|
|
26
25
|
const luxon_1 = require("@golemio/core/dist/shared/luxon");
|
|
27
26
|
const tsyringe_1 = require("@golemio/core/dist/shared/tsyringe");
|
|
28
27
|
const DownloadMeasurementsMessageSchema_1 = require("./DownloadMeasurementsMessageSchema");
|
|
28
|
+
const CoreToken_1 = require("@golemio/core/dist/helpers/ioc/CoreToken");
|
|
29
29
|
let DownloadMeasurementsTask = class DownloadMeasurementsTask extends integration_engine_1.AbstractTask {
|
|
30
30
|
constructor(datasource, transformation, repository, logger) {
|
|
31
31
|
super(""); // done in worker
|
|
@@ -88,7 +88,7 @@ DownloadMeasurementsTask = __decorate([
|
|
|
88
88
|
__param(0, (0, tsyringe_1.inject)(ModuleContainerToken_1.ModuleContainerToken.ChmuDatasource)),
|
|
89
89
|
__param(1, (0, tsyringe_1.inject)(ModuleContainerToken_1.ModuleContainerToken.MeasurementsTransformation)),
|
|
90
90
|
__param(2, (0, tsyringe_1.inject)(ModuleContainerToken_1.ModuleContainerToken.MeasurementsRepository)),
|
|
91
|
-
__param(3, (0, tsyringe_1.inject)(
|
|
91
|
+
__param(3, (0, tsyringe_1.inject)(CoreToken_1.CoreToken.Logger)),
|
|
92
92
|
__metadata("design:paramtypes", [ChmuDatasource_1.default,
|
|
93
93
|
MeasurementsTransformation_1.MeasurementsTransformation,
|
|
94
94
|
MeasurementsRepository_1.MeasurementsRepository, Object])
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DownloadMeasurementsTask.js","sourceRoot":"","sources":["../../../../src/integration-engine/workers/tasks/DownloadMeasurementsTask.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,qFAAgF;AAChF,sFAA4D;AAC5D,yEAAoE;AACpE,iGAA4F;AAE5F,8EAAqE;AACrE,
|
|
1
|
+
{"version":3,"file":"DownloadMeasurementsTask.js","sourceRoot":"","sources":["../../../../src/integration-engine/workers/tasks/DownloadMeasurementsTask.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { StationsRepository } from "../../data-access/StationsRepository";
|
|
2
|
+
import { MeasurementsRepository } from "../../data-access/MeasurementsRepository";
|
|
3
|
+
import OpendataDatasource from "../../datasources/OpendataDatasource";
|
|
4
|
+
import { OpendataMeasurementsTransformation } from "../../transformations/OpendataMeasurementsTransformation";
|
|
5
|
+
import { ILogger } from "@golemio/core/dist/helpers/logger/LoggerProvider";
|
|
6
|
+
import { AbstractTask } from "@golemio/core/dist/integration-engine";
|
|
7
|
+
import IDownloadOpendataMessage from "../interfaces/IDownloadOpendataMessage";
|
|
8
|
+
import { DownloadOpendataMessageSchema } from "./DownloadOpendataMessageSchema";
|
|
9
|
+
export default class DownloadOpendataMeasurementsTask extends AbstractTask<IDownloadOpendataMessage> {
|
|
10
|
+
private stationsRepository;
|
|
11
|
+
private datasource;
|
|
12
|
+
private transformation;
|
|
13
|
+
private repository;
|
|
14
|
+
private logger;
|
|
15
|
+
queueName: string;
|
|
16
|
+
protected schema: typeof DownloadOpendataMessageSchema;
|
|
17
|
+
constructor(stationsRepository: StationsRepository, datasource: OpendataDatasource, transformation: OpendataMeasurementsTransformation, repository: MeasurementsRepository, logger: ILogger);
|
|
18
|
+
protected execute: (data: IDownloadOpendataMessage) => Promise<void>;
|
|
19
|
+
private generateSubtasks;
|
|
20
|
+
private processStationMeasurements;
|
|
21
|
+
private validateMessageData;
|
|
22
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
15
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
16
|
+
};
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
const StationsRepository_1 = require("../../data-access/StationsRepository");
|
|
19
|
+
const MeasurementsRepository_1 = require("../../data-access/MeasurementsRepository");
|
|
20
|
+
const OpendataDatasource_1 = __importDefault(require("../../datasources/OpendataDatasource"));
|
|
21
|
+
const ModuleContainerToken_1 = require("../../ioc/ModuleContainerToken");
|
|
22
|
+
const OpendataMeasurementsTransformation_1 = require("../../transformations/OpendataMeasurementsTransformation");
|
|
23
|
+
const integration_engine_1 = require("@golemio/core/dist/integration-engine");
|
|
24
|
+
const QueueManager_1 = require("@golemio/core/dist/integration-engine/queueprocessors/QueueManager");
|
|
25
|
+
const golemio_errors_1 = require("@golemio/core/dist/shared/golemio-errors");
|
|
26
|
+
const luxon_1 = require("@golemio/core/dist/shared/luxon");
|
|
27
|
+
const tsyringe_1 = require("@golemio/core/dist/shared/tsyringe");
|
|
28
|
+
const DownloadOpendataMessageSchema_1 = require("./DownloadOpendataMessageSchema");
|
|
29
|
+
const CoreToken_1 = require("@golemio/core/dist/helpers/ioc/CoreToken");
|
|
30
|
+
let DownloadOpendataMeasurementsTask = class DownloadOpendataMeasurementsTask extends integration_engine_1.AbstractTask {
|
|
31
|
+
constructor(stationsRepository, datasource, transformation, repository, logger) {
|
|
32
|
+
super(""); // queue prefix is set by the worker
|
|
33
|
+
this.stationsRepository = stationsRepository;
|
|
34
|
+
this.datasource = datasource;
|
|
35
|
+
this.transformation = transformation;
|
|
36
|
+
this.repository = repository;
|
|
37
|
+
this.logger = logger;
|
|
38
|
+
this.queueName = "downloadOpendataMeasurementsTask";
|
|
39
|
+
this.schema = DownloadOpendataMessageSchema_1.DownloadOpendataMessageSchema;
|
|
40
|
+
this.execute = async (data) => {
|
|
41
|
+
const { date } = this.validateMessageData(data);
|
|
42
|
+
try {
|
|
43
|
+
if (data.wsi && data.station_id) {
|
|
44
|
+
await this.processStationMeasurements(data.station_id, data.wsi, new Date(date));
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
await this.generateSubtasks(date);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
if (error instanceof golemio_errors_1.AbstractGolemioError) {
|
|
52
|
+
throw error;
|
|
53
|
+
}
|
|
54
|
+
this.logger.error(error, `${this.constructor.name}: Unable to download chmu opendata measurements data.`);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
async generateSubtasks(date) {
|
|
59
|
+
const stations = await this.stationsRepository.getStationsWithWsi();
|
|
60
|
+
if (stations.length === 0) {
|
|
61
|
+
this.logger.warn(`${this.constructor.name}: no stations with WSI found - skipping. Populate chmu.stations.wsi first.`);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
for (const station of stations) {
|
|
65
|
+
await QueueManager_1.QueueManager.sendMessageToExchange(this.queuePrefix, this.queueName, {
|
|
66
|
+
date,
|
|
67
|
+
station_id: station.station_id,
|
|
68
|
+
wsi: station.wsi,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
this.logger.debug(`${this.constructor.name}: dispatched ${stations.length} subtasks for date ${date}.`);
|
|
72
|
+
}
|
|
73
|
+
async processStationMeasurements(stationId, wsi, date) {
|
|
74
|
+
let stationRecords;
|
|
75
|
+
try {
|
|
76
|
+
stationRecords = await this.datasource.getData(wsi, date);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
throw new golemio_errors_1.GeneralError(`${this.constructor.name}: failed to fetch data for station ${stationId} (WSI: ${wsi}).`);
|
|
80
|
+
}
|
|
81
|
+
if (stationRecords.length === 0) {
|
|
82
|
+
this.logger.warn(`${this.constructor.name}: no records fetched for station ${stationId} (WSI: ${wsi}).`);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const records = stationRecords.map((r) => ({ ...r, station_id: stationId }));
|
|
86
|
+
const transformed = await this.transformation.transform(records);
|
|
87
|
+
await this.repository.bulkUpdate(transformed);
|
|
88
|
+
this.logger.debug(`${this.constructor.name}: upserted ${transformed.length} measurements for station ${stationId}.`);
|
|
89
|
+
}
|
|
90
|
+
validateMessageData(data) {
|
|
91
|
+
const dt = data.date ? luxon_1.DateTime.fromISO(data.date) : luxon_1.DateTime.now();
|
|
92
|
+
const ageInDays = luxon_1.DateTime.now().startOf("day").diff(dt.startOf("day"), "days").days;
|
|
93
|
+
if (ageInDays > 2) {
|
|
94
|
+
throw new Error(`Date "${data.date}" is outside the 3-day retention window`);
|
|
95
|
+
}
|
|
96
|
+
return { ...data, date: dt.toISODate() };
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
DownloadOpendataMeasurementsTask = __decorate([
|
|
100
|
+
(0, tsyringe_1.injectable)(),
|
|
101
|
+
__param(0, (0, tsyringe_1.inject)(ModuleContainerToken_1.ModuleContainerToken.StationsRepository)),
|
|
102
|
+
__param(1, (0, tsyringe_1.inject)(ModuleContainerToken_1.ModuleContainerToken.OpendataDatasource)),
|
|
103
|
+
__param(2, (0, tsyringe_1.inject)(ModuleContainerToken_1.ModuleContainerToken.OpendataMeasurementsTransformation)),
|
|
104
|
+
__param(3, (0, tsyringe_1.inject)(ModuleContainerToken_1.ModuleContainerToken.MeasurementsRepository)),
|
|
105
|
+
__param(4, (0, tsyringe_1.inject)(CoreToken_1.CoreToken.Logger)),
|
|
106
|
+
__metadata("design:paramtypes", [StationsRepository_1.StationsRepository,
|
|
107
|
+
OpendataDatasource_1.default,
|
|
108
|
+
OpendataMeasurementsTransformation_1.OpendataMeasurementsTransformation,
|
|
109
|
+
MeasurementsRepository_1.MeasurementsRepository, Object])
|
|
110
|
+
], DownloadOpendataMeasurementsTask);
|
|
111
|
+
exports.default = DownloadOpendataMeasurementsTask;
|
|
112
|
+
//# sourceMappingURL=DownloadOpendataMeasurementsTask.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DownloadOpendataMeasurementsTask.js","sourceRoot":"","sources":["../../../../src/integration-engine/workers/tasks/DownloadOpendataMeasurementsTask.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.DownloadOpendataMessageSchema = void 0;
|
|
13
|
+
const class_validator_1 = require("@golemio/core/dist/shared/class-validator");
|
|
14
|
+
class DownloadOpendataMessageSchema {
|
|
15
|
+
}
|
|
16
|
+
exports.DownloadOpendataMessageSchema = DownloadOpendataMessageSchema;
|
|
17
|
+
__decorate([
|
|
18
|
+
(0, class_validator_1.IsOptional)(),
|
|
19
|
+
(0, class_validator_1.IsString)(),
|
|
20
|
+
(0, class_validator_1.IsISO8601)(),
|
|
21
|
+
__metadata("design:type", String)
|
|
22
|
+
], DownloadOpendataMessageSchema.prototype, "date", void 0);
|
|
23
|
+
__decorate([
|
|
24
|
+
(0, class_validator_1.IsOptional)(),
|
|
25
|
+
(0, class_validator_1.IsString)(),
|
|
26
|
+
__metadata("design:type", String)
|
|
27
|
+
], DownloadOpendataMessageSchema.prototype, "wsi", void 0);
|
|
28
|
+
__decorate([
|
|
29
|
+
(0, class_validator_1.IsOptional)(),
|
|
30
|
+
(0, class_validator_1.IsString)(),
|
|
31
|
+
__metadata("design:type", String)
|
|
32
|
+
], DownloadOpendataMessageSchema.prototype, "station_id", void 0);
|
|
33
|
+
//# sourceMappingURL=DownloadOpendataMessageSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DownloadOpendataMessageSchema.js","sourceRoot":"","sources":["../../../../src/integration-engine/workers/tasks/DownloadOpendataMessageSchema.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,+EAA4F;AAG5F,MAAa,6BAA6B;CAazC;AAbD,sEAaC;AATG;IAHC,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;IACV,IAAA,2BAAS,GAAE;;2DACE;AAId;IAFC,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;;0DACE;AAIb;IAFC,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;;iEACS"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export default class OpendataSchemaProvider {
|
|
2
|
+
/**
|
|
3
|
+
* Validates the raw data.data object from the API response before column mapping.
|
|
4
|
+
* Ensures header and values are present and values rows contain only strings/numbers.
|
|
5
|
+
*/
|
|
6
|
+
static getResponseSchema(): {
|
|
7
|
+
type: string;
|
|
8
|
+
required: string[];
|
|
9
|
+
properties: {
|
|
10
|
+
header: {
|
|
11
|
+
type: string;
|
|
12
|
+
};
|
|
13
|
+
values: {
|
|
14
|
+
type: string;
|
|
15
|
+
items: {
|
|
16
|
+
type: string;
|
|
17
|
+
minItems: number;
|
|
18
|
+
items: {
|
|
19
|
+
type: string[];
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Validates the mapped IRawOpendataRecord[] after header-based column mapping.
|
|
27
|
+
*/
|
|
28
|
+
static get(): {
|
|
29
|
+
type: string;
|
|
30
|
+
items: {
|
|
31
|
+
type: string;
|
|
32
|
+
required: string[];
|
|
33
|
+
properties: {
|
|
34
|
+
STATION: {
|
|
35
|
+
type: string;
|
|
36
|
+
};
|
|
37
|
+
ELEMENT: {
|
|
38
|
+
type: string;
|
|
39
|
+
};
|
|
40
|
+
DT: {
|
|
41
|
+
type: string;
|
|
42
|
+
};
|
|
43
|
+
VAL: {
|
|
44
|
+
type: string[];
|
|
45
|
+
};
|
|
46
|
+
FLAG: {
|
|
47
|
+
type: string;
|
|
48
|
+
};
|
|
49
|
+
QUALITY: {
|
|
50
|
+
type: string;
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
class OpendataSchemaProvider {
|
|
4
|
+
/**
|
|
5
|
+
* Validates the raw data.data object from the API response before column mapping.
|
|
6
|
+
* Ensures header and values are present and values rows contain only strings/numbers.
|
|
7
|
+
*/
|
|
8
|
+
static getResponseSchema() {
|
|
9
|
+
return {
|
|
10
|
+
type: "object",
|
|
11
|
+
required: ["header", "values"],
|
|
12
|
+
properties: {
|
|
13
|
+
header: { type: "string" },
|
|
14
|
+
values: {
|
|
15
|
+
type: "array",
|
|
16
|
+
items: {
|
|
17
|
+
type: "array",
|
|
18
|
+
minItems: 1,
|
|
19
|
+
items: { type: ["string", "number"] },
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Validates the mapped IRawOpendataRecord[] after header-based column mapping.
|
|
27
|
+
*/
|
|
28
|
+
static get() {
|
|
29
|
+
return {
|
|
30
|
+
type: "array",
|
|
31
|
+
items: {
|
|
32
|
+
type: "object",
|
|
33
|
+
required: ["STATION", "ELEMENT", "DT", "VAL", "FLAG", "QUALITY"],
|
|
34
|
+
properties: {
|
|
35
|
+
STATION: { type: "string" },
|
|
36
|
+
ELEMENT: { type: "string" },
|
|
37
|
+
DT: { type: "string" },
|
|
38
|
+
VAL: { type: ["number", "string"] },
|
|
39
|
+
FLAG: { type: "string" },
|
|
40
|
+
QUALITY: { type: "number" },
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
exports.default = OpendataSchemaProvider;
|
|
47
|
+
//# sourceMappingURL=OpendataSchemaProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OpendataSchemaProvider.js","sourceRoot":"","sources":["../../../src/schema-definitions/datasources/OpendataSchemaProvider.ts"],"names":[],"mappings":";;AAAA,MAAqB,sBAAsB;IACvC;;;OAGG;IACI,MAAM,CAAC,iBAAiB;QAC3B,OAAO;YACH,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;YAC9B,UAAU,EAAE;gBACR,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC1B,MAAM,EAAE;oBACJ,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE;wBACH,IAAI,EAAE,OAAO;wBACb,QAAQ,EAAE,CAAC;wBACX,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE;qBACxC;iBACJ;aACJ;SACJ,CAAC;IACN,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,GAAG;QACb,OAAO;YACH,IAAI,EAAE,OAAO;YACb,KAAK,EAAE;gBACH,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC;gBAChE,UAAU,EAAE;oBACR,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC3B,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC3B,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACtB,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE;oBACnC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACxB,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC9B;aACJ;SACJ,CAAC;IACN,CAAC;CACJ;AA3CD,yCA2CC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One long-format record from the ČHMÚ opendata 10m API, after unpacking the values array.
|
|
3
|
+
* station_id is resolved from the WSI (STATION field) by the task before transformation.
|
|
4
|
+
*
|
|
5
|
+
* Real API response shape: { data: { type: "DataCollection", data: { header: "...", values: [[...]] } } }
|
|
6
|
+
* URL: https://opendata.chmi.cz/meteorology/climate/now/data/10m-{WSI}-{YYYYMMDD}.json
|
|
7
|
+
*/
|
|
8
|
+
export default interface IInputOpendataRecord {
|
|
9
|
+
station_id: string;
|
|
10
|
+
ELEMENT: string;
|
|
11
|
+
DT: string;
|
|
12
|
+
VAL: number | "";
|
|
13
|
+
FLAG: string;
|
|
14
|
+
QUALITY: number;
|
|
15
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IInputOpendataRecord.js","sourceRoot":"","sources":["../../../../src/schema-definitions/datasources/interfaces/IInputOpendataRecord.ts"],"names":[],"mappings":""}
|
|
@@ -15,4 +15,22 @@ export interface IMeasurementDto {
|
|
|
15
15
|
soil_hum_0_10: number | null;
|
|
16
16
|
soil_hum_10_50: number | null;
|
|
17
17
|
soil_hum_50_100: number | null;
|
|
18
|
+
air_temp_max: number | null;
|
|
19
|
+
air_temp_min: number | null;
|
|
20
|
+
air_temp_ground: number | null;
|
|
21
|
+
wind_speed_avg: number | null;
|
|
22
|
+
wind_dir_avg: number | null;
|
|
23
|
+
wind_gust: number | null;
|
|
24
|
+
wind_gust_dir: number | null;
|
|
25
|
+
wind_gust_time: number | null;
|
|
26
|
+
snow_depth: number | null;
|
|
27
|
+
snow_water: number | null;
|
|
28
|
+
radiation_glob: number | null;
|
|
29
|
+
radiation_uv: number | null;
|
|
30
|
+
soil_temp_5cm: number | null;
|
|
31
|
+
soil_temp_10cm: number | null;
|
|
32
|
+
soil_temp_20cm: number | null;
|
|
33
|
+
soil_temp_50cm: number | null;
|
|
34
|
+
soil_temp_100cm: number | null;
|
|
35
|
+
data_source: string;
|
|
18
36
|
}
|
|
@@ -18,6 +18,24 @@ export declare class MeasurementModel extends Model<IMeasurementDto> implements
|
|
|
18
18
|
soil_hum_0_10: number | null;
|
|
19
19
|
soil_hum_10_50: number | null;
|
|
20
20
|
soil_hum_50_100: number | null;
|
|
21
|
+
air_temp_max: number | null;
|
|
22
|
+
air_temp_min: number | null;
|
|
23
|
+
air_temp_ground: number | null;
|
|
24
|
+
wind_speed_avg: number | null;
|
|
25
|
+
wind_dir_avg: number | null;
|
|
26
|
+
wind_gust: number | null;
|
|
27
|
+
wind_gust_dir: number | null;
|
|
28
|
+
wind_gust_time: number | null;
|
|
29
|
+
snow_depth: number | null;
|
|
30
|
+
snow_water: number | null;
|
|
31
|
+
radiation_glob: number | null;
|
|
32
|
+
radiation_uv: number | null;
|
|
33
|
+
soil_temp_5cm: number | null;
|
|
34
|
+
soil_temp_10cm: number | null;
|
|
35
|
+
soil_temp_20cm: number | null;
|
|
36
|
+
soil_temp_50cm: number | null;
|
|
37
|
+
soil_temp_100cm: number | null;
|
|
38
|
+
data_source: string;
|
|
21
39
|
static attributeModel: ModelAttributes<MeasurementModel, IMeasurementDto>;
|
|
22
40
|
static jsonSchema: JSONSchemaType<IMeasurementDto[]>;
|
|
23
41
|
}
|
|
@@ -22,6 +22,24 @@ MeasurementModel.attributeModel = {
|
|
|
22
22
|
soil_hum_0_10: { type: sequelize_1.DataTypes.INTEGER, allowNull: true },
|
|
23
23
|
soil_hum_10_50: { type: sequelize_1.DataTypes.INTEGER, allowNull: true },
|
|
24
24
|
soil_hum_50_100: { type: sequelize_1.DataTypes.INTEGER, allowNull: true },
|
|
25
|
+
air_temp_max: { type: sequelize_1.DataTypes.FLOAT, allowNull: true },
|
|
26
|
+
air_temp_min: { type: sequelize_1.DataTypes.FLOAT, allowNull: true },
|
|
27
|
+
air_temp_ground: { type: sequelize_1.DataTypes.FLOAT, allowNull: true },
|
|
28
|
+
wind_speed_avg: { type: sequelize_1.DataTypes.FLOAT, allowNull: true },
|
|
29
|
+
wind_dir_avg: { type: sequelize_1.DataTypes.FLOAT, allowNull: true },
|
|
30
|
+
wind_gust: { type: sequelize_1.DataTypes.FLOAT, allowNull: true },
|
|
31
|
+
wind_gust_dir: { type: sequelize_1.DataTypes.FLOAT, allowNull: true },
|
|
32
|
+
wind_gust_time: { type: sequelize_1.DataTypes.INTEGER, allowNull: true },
|
|
33
|
+
snow_depth: { type: sequelize_1.DataTypes.FLOAT, allowNull: true },
|
|
34
|
+
snow_water: { type: sequelize_1.DataTypes.FLOAT, allowNull: true },
|
|
35
|
+
radiation_glob: { type: sequelize_1.DataTypes.FLOAT, allowNull: true },
|
|
36
|
+
radiation_uv: { type: sequelize_1.DataTypes.FLOAT, allowNull: true },
|
|
37
|
+
soil_temp_5cm: { type: sequelize_1.DataTypes.FLOAT, allowNull: true },
|
|
38
|
+
soil_temp_10cm: { type: sequelize_1.DataTypes.FLOAT, allowNull: true },
|
|
39
|
+
soil_temp_20cm: { type: sequelize_1.DataTypes.FLOAT, allowNull: true },
|
|
40
|
+
soil_temp_50cm: { type: sequelize_1.DataTypes.FLOAT, allowNull: true },
|
|
41
|
+
soil_temp_100cm: { type: sequelize_1.DataTypes.FLOAT, allowNull: true },
|
|
42
|
+
data_source: { type: sequelize_1.DataTypes.STRING(10), primaryKey: true },
|
|
25
43
|
};
|
|
26
44
|
MeasurementModel.jsonSchema = {
|
|
27
45
|
type: "array",
|
|
@@ -44,8 +62,26 @@ MeasurementModel.jsonSchema = {
|
|
|
44
62
|
soil_hum_0_10: { oneOf: [{ type: "integer" }, { type: "null", nullable: true }] },
|
|
45
63
|
soil_hum_10_50: { oneOf: [{ type: "integer" }, { type: "null", nullable: true }] },
|
|
46
64
|
soil_hum_50_100: { oneOf: [{ type: "integer" }, { type: "null", nullable: true }] },
|
|
65
|
+
air_temp_max: { oneOf: [{ type: "number" }, { type: "null", nullable: true }] },
|
|
66
|
+
air_temp_min: { oneOf: [{ type: "number" }, { type: "null", nullable: true }] },
|
|
67
|
+
air_temp_ground: { oneOf: [{ type: "number" }, { type: "null", nullable: true }] },
|
|
68
|
+
wind_speed_avg: { oneOf: [{ type: "number" }, { type: "null", nullable: true }] },
|
|
69
|
+
wind_dir_avg: { oneOf: [{ type: "number" }, { type: "null", nullable: true }] },
|
|
70
|
+
wind_gust: { oneOf: [{ type: "number" }, { type: "null", nullable: true }] },
|
|
71
|
+
wind_gust_dir: { oneOf: [{ type: "number" }, { type: "null", nullable: true }] },
|
|
72
|
+
wind_gust_time: { oneOf: [{ type: "integer" }, { type: "null", nullable: true }] },
|
|
73
|
+
snow_depth: { oneOf: [{ type: "number" }, { type: "null", nullable: true }] },
|
|
74
|
+
snow_water: { oneOf: [{ type: "number" }, { type: "null", nullable: true }] },
|
|
75
|
+
radiation_glob: { oneOf: [{ type: "number" }, { type: "null", nullable: true }] },
|
|
76
|
+
radiation_uv: { oneOf: [{ type: "number" }, { type: "null", nullable: true }] },
|
|
77
|
+
soil_temp_5cm: { oneOf: [{ type: "number" }, { type: "null", nullable: true }] },
|
|
78
|
+
soil_temp_10cm: { oneOf: [{ type: "number" }, { type: "null", nullable: true }] },
|
|
79
|
+
soil_temp_20cm: { oneOf: [{ type: "number" }, { type: "null", nullable: true }] },
|
|
80
|
+
soil_temp_50cm: { oneOf: [{ type: "number" }, { type: "null", nullable: true }] },
|
|
81
|
+
soil_temp_100cm: { oneOf: [{ type: "number" }, { type: "null", nullable: true }] },
|
|
82
|
+
data_source: { type: "string" },
|
|
47
83
|
},
|
|
48
|
-
required: ["measured_at", "station_id"],
|
|
84
|
+
required: ["measured_at", "station_id", "data_source"],
|
|
49
85
|
},
|
|
50
86
|
};
|
|
51
87
|
//# sourceMappingURL=MeasurementModel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MeasurementModel.js","sourceRoot":"","sources":["../../../../src/schema-definitions/definitions/models/MeasurementModel.ts"],"names":[],"mappings":";;;AAAA,mEAAwF;AAIxF,MAAa,gBAAiB,SAAQ,iBAAsB;;AAA5D,
|
|
1
|
+
{"version":3,"file":"MeasurementModel.js","sourceRoot":"","sources":["../../../../src/schema-definitions/definitions/models/MeasurementModel.ts"],"names":[],"mappings":"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"}
|
package/docs/asyncapi.yaml
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
asyncapi: 3.0.0
|
|
2
2
|
info:
|
|
3
3
|
title: CHMU
|
|
4
|
-
version: 1.
|
|
5
|
-
description: Downloads CHMU
|
|
4
|
+
version: 1.2.0
|
|
5
|
+
description: Downloads CHMU meteorological data from FTP (hourly) and ČHMÚ opendata (10-minute).
|
|
6
6
|
channels:
|
|
7
7
|
chmu.downloadMeasurementsTask:
|
|
8
8
|
address: dataplatform.chmu.downloadMeasurementsTask
|
|
9
|
-
description: Downloads CHMU hourly aggregated data from FTP
|
|
9
|
+
description: Downloads CHMU hourly aggregated data from FTP CSV files.
|
|
10
10
|
bindings:
|
|
11
11
|
amqp:
|
|
12
12
|
is: queue
|
|
@@ -15,11 +15,26 @@ channels:
|
|
|
15
15
|
messages:
|
|
16
16
|
chmu.DownloadMeasurementsMessage:
|
|
17
17
|
$ref: "#/components/messages/chmu.DownloadMeasurementsMessage"
|
|
18
|
+
chmu.downloadOpendataMeasurementsTask:
|
|
19
|
+
address: dataplatform.chmu.downloadOpendataMeasurementsTask
|
|
20
|
+
description: Downloads CHMU 10-minute data from opendata.chmi.cz for all stations with a WSI identifier.
|
|
21
|
+
bindings:
|
|
22
|
+
amqp:
|
|
23
|
+
is: queue
|
|
24
|
+
queue:
|
|
25
|
+
durable: true
|
|
26
|
+
messages:
|
|
27
|
+
chmu.DownloadOpendataMessage:
|
|
28
|
+
$ref: "#/components/messages/chmu.DownloadOpendataMessage"
|
|
18
29
|
operations:
|
|
19
30
|
chmu.downloadMeasurementsTask:
|
|
20
31
|
action: "send"
|
|
21
32
|
channel:
|
|
22
33
|
$ref: "#/channels/chmu.downloadMeasurementsTask"
|
|
34
|
+
chmu.downloadOpendataMeasurementsTask:
|
|
35
|
+
action: "send"
|
|
36
|
+
channel:
|
|
37
|
+
$ref: "#/channels/chmu.downloadOpendataMeasurementsTask"
|
|
23
38
|
components:
|
|
24
39
|
messages:
|
|
25
40
|
chmu.DownloadMeasurementsMessage:
|
|
@@ -33,3 +48,20 @@ components:
|
|
|
33
48
|
type: string
|
|
34
49
|
nullable: true
|
|
35
50
|
additionalProperties: false
|
|
51
|
+
chmu.DownloadOpendataMessage:
|
|
52
|
+
payload:
|
|
53
|
+
type: object
|
|
54
|
+
properties:
|
|
55
|
+
"date":
|
|
56
|
+
type: string
|
|
57
|
+
nullable: true
|
|
58
|
+
description: ISO 8601 date to fetch opendata for. Defaults to today when omitted.
|
|
59
|
+
"station_id":
|
|
60
|
+
type: string
|
|
61
|
+
nullable: true
|
|
62
|
+
description: Station identifier.
|
|
63
|
+
"wsi":
|
|
64
|
+
type: string
|
|
65
|
+
nullable: true
|
|
66
|
+
description: ČHMÚ WSI station identifier.
|
|
67
|
+
additionalProperties: false
|