kuzzle-device-manager-types 2.4.3-dev.1 → 2.5.0-beta.1
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/dist/lib/modules/asset/AssetsController.d.ts +12 -0
- package/dist/lib/modules/asset/types/AssetApi.d.ts +30 -1
- package/dist/lib/modules/measure/MeasureService.d.ts +53 -3
- package/dist/lib/modules/measure/MeasureSourcesBuilder.d.ts +10 -0
- package/dist/lib/modules/measure/MeasureTargetBuilder.d.ts +3 -0
- package/dist/lib/modules/measure/MeasureValidationError.d.ts +12 -0
- package/dist/lib/modules/measure/collections/measuresMappings.d.ts +4 -0
- package/dist/lib/modules/measure/types/MeasureContent.d.ts +32 -20
- package/dist/lib/modules/measure/types/MeasureDefinition.d.ts +19 -0
- package/dist/lib/modules/measure/types/MeasureEvents.d.ts +126 -0
- package/dist/lib/modules/measure/types/MeasureSources.d.ts +20 -0
- package/dist/lib/modules/measure/types/MeasureTarget.d.ts +18 -0
- package/dist/lib/modules/model/MappingsConflictsError.d.ts +4 -3
- package/dist/lib/modules/model/MeasuresDuplicates.d.ts +3 -0
- package/dist/lib/modules/model/MeasuresNamesDuplicatesError.d.ts +7 -0
- package/dist/lib/modules/model/ModelService.d.ts +5 -3
- package/dist/lib/modules/model/types/ModelApi.d.ts +2 -0
- package/dist/lib/modules/plugin/DeviceManagerEngine.d.ts +1 -0
- package/dist/lib/modules/plugin/DeviceManagerPlugin.d.ts +1 -1
- package/dist/lib/modules/shared/errors/SchemaValidationError.d.ts +8 -0
- package/dist/lib/modules/shared/utils/AJValidator.d.ts +26 -0
- package/dist/tests/application/assets/MagicHouse.d.ts +2 -0
- package/dist/tests/application/measures/Magicule.d.ts +5 -0
- package/package.json +1 -1
|
@@ -19,6 +19,18 @@ export declare class AssetsController {
|
|
|
19
19
|
getMeasures(request: KuzzleRequest): Promise<ApiAssetGetMeasuresResult>;
|
|
20
20
|
getLastMeasures(request: KuzzleRequest): Promise<ApiAssetGetLastMeasuresResult>;
|
|
21
21
|
mGetLastMeasures(request: KuzzleRequest): Promise<ApiAssetMGetLastMeasuresResult>;
|
|
22
|
+
/**
|
|
23
|
+
*
|
|
24
|
+
* @param indexId The asset index
|
|
25
|
+
* @param assetId The target asset ID
|
|
26
|
+
* @param measureName The measureName to get the type from
|
|
27
|
+
* @param engineGroup The target engine group
|
|
28
|
+
* @returns The measure type if used in the asset, null otherwise
|
|
29
|
+
* @throws If the asset does not exists
|
|
30
|
+
*/
|
|
31
|
+
private getTypeFromMeasureSlot;
|
|
32
|
+
mMeasureIngest(request: KuzzleRequest): Promise<void>;
|
|
33
|
+
measureIngest(request: KuzzleRequest): Promise<void>;
|
|
22
34
|
exportMeasures(request: KuzzleRequest): Promise<any>;
|
|
23
35
|
export(request: KuzzleRequest): Promise<any>;
|
|
24
36
|
migrateTenant(request: KuzzleRequest): Promise<ApiAssetMigrateTenantResult>;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { JSONObject, KDocument, KHit, SearchResult } from "kuzzle-sdk";
|
|
2
|
-
import { MeasureContent } from "../../../modules/measure";
|
|
2
|
+
import { MeasureContent, Measurement } from "../../../modules/measure";
|
|
3
3
|
import { ApiDigitalTwinGetLastMeasuredAtRequest, ApiDigitalTwinGetLastMeasuredAtResult, ApiDigitalTwinGetLastMeasuresRequest, ApiDigitalTwinGetLastMeasuresResult, ApiDigitalTwinMGetLastMeasuredAtRequest, ApiDigitalTwinMGetLastMeasuredAtResult, ApiDigitalTwinMGetLastMeasuresRequest, ApiDigitalTwinMGetLastMeasuresResult, Metadata } from "../../shared";
|
|
4
4
|
import { AssetContent } from "./AssetContent";
|
|
5
5
|
type AssetsControllerName = "device-manager/assets";
|
|
6
|
+
import { ApiMeasureSource } from "../../measure/types/MeasureSources";
|
|
6
7
|
interface AssetsControllerRequest {
|
|
7
8
|
controller: AssetsControllerName;
|
|
8
9
|
engineId: string;
|
|
@@ -85,6 +86,34 @@ export type ApiAssetGetMeasuresResult = {
|
|
|
85
86
|
measures: Array<KDocument<MeasureContent<JSONObject>>>;
|
|
86
87
|
total: number;
|
|
87
88
|
};
|
|
89
|
+
type TypelessApiMeasureSource = Omit<ApiMeasureSource, "type">;
|
|
90
|
+
export interface ApiAssetMeasureIngestRequest extends AssetsControllerRequest {
|
|
91
|
+
action: "measureIngest";
|
|
92
|
+
assetId: string;
|
|
93
|
+
engineId: string;
|
|
94
|
+
engineGroup?: string;
|
|
95
|
+
slotName: string;
|
|
96
|
+
body: {
|
|
97
|
+
dataSource: TypelessApiMeasureSource;
|
|
98
|
+
measuredAt: number;
|
|
99
|
+
values: JSONObject;
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
export type ApiAssetMeasureIngestResult = void;
|
|
103
|
+
type APIDecodedMeasurement = Omit<Measurement, "type"> & {
|
|
104
|
+
slotName: string;
|
|
105
|
+
};
|
|
106
|
+
export interface ApiAssetmMeasureIngestRequest extends AssetsControllerRequest {
|
|
107
|
+
action: "mMeasureIngest";
|
|
108
|
+
assetId: string;
|
|
109
|
+
engineId: string;
|
|
110
|
+
engineGroup?: string;
|
|
111
|
+
body: {
|
|
112
|
+
dataSource: TypelessApiMeasureSource;
|
|
113
|
+
measurements: APIDecodedMeasurement[];
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
export type ApiAssetmMeasureIngestResult = void;
|
|
88
117
|
export type ApiAssetGetLastMeasuresRequest = ApiDigitalTwinGetLastMeasuresRequest<AssetsControllerName>;
|
|
89
118
|
export type ApiAssetGetLastMeasuresResult = ApiDigitalTwinGetLastMeasuresResult;
|
|
90
119
|
export type ApiAssetMGetLastMeasuresRequest = ApiDigitalTwinMGetLastMeasuresRequest<AssetsControllerName>;
|
|
@@ -3,8 +3,21 @@ import { DeviceContent } from "../device";
|
|
|
3
3
|
import { DeviceManagerPlugin } from "../plugin";
|
|
4
4
|
import { BaseService, Metadata } from "../shared";
|
|
5
5
|
import { DecodedMeasurement } from "./types/MeasureContent";
|
|
6
|
+
import { ApiMeasureSource } from "./types/MeasureSources";
|
|
7
|
+
import { ApiMeasureTarget } from "./types/MeasureTarget";
|
|
6
8
|
export declare class MeasureService extends BaseService {
|
|
7
9
|
constructor(plugin: DeviceManagerPlugin);
|
|
10
|
+
/**
|
|
11
|
+
* Register new measures from an API, updates :
|
|
12
|
+
* - asset
|
|
13
|
+
* - engine measures
|
|
14
|
+
*
|
|
15
|
+
* This method represents the ingestion pipeline:
|
|
16
|
+
* - trigger events `before` (measure enrichment)
|
|
17
|
+
* - save documents (measures and asset)
|
|
18
|
+
* - trigger events `after`
|
|
19
|
+
*/
|
|
20
|
+
ingestApi(source: ApiMeasureSource, target: ApiMeasureTarget, measurements: DecodedMeasurement<JSONObject>[], payloadUuids: string[]): Promise<void>;
|
|
8
21
|
/**
|
|
9
22
|
* Register new measures from a device, updates :
|
|
10
23
|
* - admin device
|
|
@@ -19,6 +32,8 @@ export declare class MeasureService extends BaseService {
|
|
|
19
32
|
* - trigger events `before` (measure enrichment)
|
|
20
33
|
* - save documents (measures, device and asset)
|
|
21
34
|
* - trigger events `after`
|
|
35
|
+
*
|
|
36
|
+
* @deprecated
|
|
22
37
|
*/
|
|
23
38
|
ingest(device: KDocument<DeviceContent>, measurements: DecodedMeasurement<JSONObject>[], metadata: Metadata, payloadUuids: string[]): Promise<void>;
|
|
24
39
|
private updateDeviceMeasures;
|
|
@@ -28,13 +43,48 @@ export declare class MeasureService extends BaseService {
|
|
|
28
43
|
* @returns A map of each asset state by measuredAt timestamp.
|
|
29
44
|
*/
|
|
30
45
|
private updateAssetMeasures;
|
|
46
|
+
/**
|
|
47
|
+
* Build the measures document received from the API
|
|
48
|
+
*
|
|
49
|
+
* @param source The API data source
|
|
50
|
+
* @param asset The target asset to build the measure for
|
|
51
|
+
* @param measure The decoded raw measures
|
|
52
|
+
* @param payloadUuids The uuid's of the payloads used to create the measure
|
|
53
|
+
*
|
|
54
|
+
* @returns A MeasurementContent builded from parameters
|
|
55
|
+
*/
|
|
56
|
+
private buildApiMeasures;
|
|
31
57
|
/**
|
|
32
58
|
* Build the measures documents to save
|
|
33
59
|
*/
|
|
34
60
|
private buildMeasures;
|
|
35
|
-
private tryGetLinkedAsset;
|
|
36
61
|
/**
|
|
37
|
-
*
|
|
62
|
+
* Find an asset by its ID and its engine ID.
|
|
63
|
+
*
|
|
64
|
+
* @param engineId The target index ID
|
|
65
|
+
* @param assetId the target asset ID
|
|
66
|
+
* @returns The asset or null if not found
|
|
67
|
+
*/
|
|
68
|
+
private findAsset;
|
|
69
|
+
/**
|
|
70
|
+
* Check if the asset measure name is associated to the asset model
|
|
71
|
+
*
|
|
72
|
+
* @param measureName The measure name to check
|
|
73
|
+
* @param model The asset model the measureName should belong
|
|
74
|
+
*
|
|
75
|
+
* @returns True if the asset measure name belongs to the asset model, false otherwise
|
|
76
|
+
* @throws If the model does not exists
|
|
77
|
+
*/
|
|
78
|
+
private isMeasureNameInModel;
|
|
79
|
+
/**
|
|
80
|
+
* Find the asset measure name from the device and its measure type
|
|
81
|
+
*
|
|
82
|
+
* @param deviceId The source device ID
|
|
83
|
+
* @param measureType The device measure type
|
|
84
|
+
* @param asset The asset the device is linked to
|
|
85
|
+
*
|
|
86
|
+
* @returns The asset measure name or null if it does not belong to the link
|
|
87
|
+
* @throws If the device is not linked to the asset
|
|
38
88
|
*/
|
|
39
|
-
private
|
|
89
|
+
private findAssetMeasureNameFromDevice;
|
|
40
90
|
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Metadata } from "../shared";
|
|
2
|
+
import { MeasureOriginApi, MeasureOriginDevice } from "./types/MeasureContent";
|
|
3
|
+
import { ApiMeasureSource, DeviceMeasureSource } from "./types/MeasureSources";
|
|
4
|
+
export declare const enum DATA_SOURCE_METADATA_TYPE {
|
|
5
|
+
API = "api",
|
|
6
|
+
DEVICE = "device"
|
|
7
|
+
}
|
|
8
|
+
export declare function apiSourceToOriginApi(source: ApiMeasureSource, payloadUuids: string[]): MeasureOriginApi;
|
|
9
|
+
export declare function toDeviceSource(dataSourceId: string, reference: string, model: string, metadata?: Metadata, lastMeasuredAt?: number): DeviceMeasureSource;
|
|
10
|
+
export declare function deviceSourceToOriginDevice(source: DeviceMeasureSource, measureName: string, payloadUuids: string[]): MeasureOriginDevice;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { ApiMeasureTarget, DeviceMeasureTarget } from "./types/MeasureTarget";
|
|
2
|
+
export declare function toApiTarget(indexId: string, assetId: string, engineGroup?: string): ApiMeasureTarget;
|
|
3
|
+
export declare function toDeviceTarget(indexId: string, assetId?: string): DeviceMeasureTarget;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ErrorObject } from "ajv";
|
|
2
|
+
import { KuzzleError } from "kuzzle";
|
|
3
|
+
export interface MeasureValidationChunks {
|
|
4
|
+
measureName: string;
|
|
5
|
+
validationErrors: ErrorObject[];
|
|
6
|
+
}
|
|
7
|
+
export declare class MeasureValidationError extends KuzzleError {
|
|
8
|
+
private errors;
|
|
9
|
+
constructor(message: string, errors: MeasureValidationChunks[], id?: string, code?: number);
|
|
10
|
+
get name(): string;
|
|
11
|
+
toJSON(): import("kuzzle").JSONObject;
|
|
12
|
+
}
|
|
@@ -1,58 +1,69 @@
|
|
|
1
1
|
import { JSONObject, KDocumentContent } from "kuzzle-sdk";
|
|
2
2
|
import { Metadata } from "../../../modules/shared";
|
|
3
3
|
import { AssetMeasureContext } from "../../../modules/asset";
|
|
4
|
-
|
|
4
|
+
interface AbstractMeasureOrigin {
|
|
5
5
|
/**
|
|
6
6
|
* Origin of the measure
|
|
7
7
|
*/
|
|
8
|
-
type:
|
|
9
|
-
/**
|
|
10
|
-
* Name of the measure in the device
|
|
11
|
-
*/
|
|
12
|
-
measureName: string;
|
|
13
|
-
/**
|
|
14
|
-
* Origin device metadata
|
|
15
|
-
*/
|
|
16
|
-
deviceMetadata?: Metadata;
|
|
8
|
+
type: string;
|
|
17
9
|
/**
|
|
18
10
|
* Payload uuids that were used to create this measure.
|
|
19
11
|
*/
|
|
20
12
|
payloadUuids: Array<string>;
|
|
13
|
+
/**
|
|
14
|
+
* Custom metadata provided by the user
|
|
15
|
+
*/
|
|
16
|
+
metadata?: Metadata;
|
|
17
|
+
}
|
|
18
|
+
export interface MeasureOriginDevice extends AbstractMeasureOrigin {
|
|
19
|
+
type: "device";
|
|
21
20
|
/**
|
|
22
21
|
* Model of the device
|
|
23
22
|
*
|
|
24
23
|
* @example "AbeewayTemp"
|
|
25
24
|
*/
|
|
26
25
|
deviceModel: string;
|
|
26
|
+
/**
|
|
27
|
+
* Name of the measure
|
|
28
|
+
*/
|
|
29
|
+
measureName: string;
|
|
27
30
|
/**
|
|
28
31
|
* Reference of the device
|
|
29
32
|
*/
|
|
30
33
|
reference: string;
|
|
34
|
+
/**
|
|
35
|
+
* Origin device metadata
|
|
36
|
+
*/
|
|
37
|
+
deviceMetadata?: Metadata;
|
|
31
38
|
/**
|
|
32
39
|
* Device ID
|
|
33
40
|
*/
|
|
34
41
|
_id: string;
|
|
35
|
-
}
|
|
36
|
-
export
|
|
42
|
+
}
|
|
43
|
+
export interface MeasureOriginComputed extends AbstractMeasureOrigin {
|
|
37
44
|
/**
|
|
38
45
|
* Computed measures are not automatically added into the asset and device
|
|
39
46
|
* documents at the end of the ingestion pipeline.
|
|
40
47
|
*/
|
|
41
48
|
type: "computed";
|
|
42
|
-
/**
|
|
43
|
-
* String that identify the rule used to compute the measure
|
|
44
|
-
*/
|
|
45
|
-
_id: string;
|
|
46
49
|
/**
|
|
47
50
|
* Name of the measure
|
|
48
51
|
*/
|
|
49
52
|
measureName: string;
|
|
50
53
|
/**
|
|
51
|
-
*
|
|
54
|
+
* String that identify the rule used to compute the measure
|
|
52
55
|
*/
|
|
53
|
-
|
|
54
|
-
}
|
|
55
|
-
export
|
|
56
|
+
_id: string;
|
|
57
|
+
}
|
|
58
|
+
export interface MeasureOriginApi extends AbstractMeasureOrigin {
|
|
59
|
+
type: "api";
|
|
60
|
+
apiMetadata?: Metadata;
|
|
61
|
+
/**
|
|
62
|
+
* API ID
|
|
63
|
+
*/
|
|
64
|
+
_id: string;
|
|
65
|
+
}
|
|
66
|
+
export type MeasureOrigin = MeasureOriginDevice | MeasureOriginComputed | MeasureOriginApi;
|
|
56
67
|
/**
|
|
57
68
|
* Represents the content of a measure document.
|
|
58
69
|
*/
|
|
@@ -88,3 +99,4 @@ export type Measurement<TMeasureValues extends JSONObject = any> = {
|
|
|
88
99
|
export type DecodedMeasurement<TMeasureValues extends JSONObject = JSONObject> = {
|
|
89
100
|
measureName: string;
|
|
90
101
|
} & Measurement<TMeasureValues>;
|
|
102
|
+
export {};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { SchemaObject } from "ajv";
|
|
1
2
|
import { JSONObject } from "kuzzle-sdk";
|
|
2
3
|
interface MeasureLocales {
|
|
3
4
|
[localeString: string]: {
|
|
@@ -12,6 +13,20 @@ export interface MeasureValuesDetails {
|
|
|
12
13
|
* Represents a measure definition registered by the Device Manager
|
|
13
14
|
*
|
|
14
15
|
* @example
|
|
16
|
+
* {
|
|
17
|
+
* valuesMappings: { temperature: { type: 'float' } },
|
|
18
|
+
* validationSchema: {
|
|
19
|
+
type: "object",
|
|
20
|
+
properties: {
|
|
21
|
+
temperature: {
|
|
22
|
+
type: "number",
|
|
23
|
+
multipleOf: 0.01
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
required: ["temperature"],
|
|
27
|
+
additionalProperties: false
|
|
28
|
+
}
|
|
29
|
+
* },
|
|
15
30
|
*{
|
|
16
31
|
* valuesMappings: { temperature: { type: "float" } },
|
|
17
32
|
* valuesDetails: {
|
|
@@ -33,6 +48,10 @@ export interface MeasureDefinition {
|
|
|
33
48
|
* Mappings for the measurement values in order to index the fields
|
|
34
49
|
*/
|
|
35
50
|
valuesMappings: JSONObject;
|
|
51
|
+
/**
|
|
52
|
+
* Schema to validate the values against
|
|
53
|
+
*/
|
|
54
|
+
validationSchema?: SchemaObject;
|
|
36
55
|
valuesDetails?: {
|
|
37
56
|
[valueName: string]: MeasureLocales;
|
|
38
57
|
};
|
|
@@ -3,8 +3,12 @@ import { DeviceContent } from "../../../modules/device";
|
|
|
3
3
|
import { AssetContent } from "../../../modules/asset";
|
|
4
4
|
import { Metadata } from "../../../modules/shared";
|
|
5
5
|
import { DecodedMeasurement, MeasureContent } from "./MeasureContent";
|
|
6
|
+
import { MeasureSource } from "./MeasureSources";
|
|
7
|
+
import { MeasureTarget } from "./MeasureTarget";
|
|
6
8
|
/**
|
|
7
9
|
* @internal
|
|
10
|
+
*
|
|
11
|
+
* @deprecated Replaced by new Ask implementing data sources
|
|
8
12
|
*/
|
|
9
13
|
export type AskMeasureIngest = {
|
|
10
14
|
name: "device-manager:measures:ingest";
|
|
@@ -16,10 +20,25 @@ export type AskMeasureIngest = {
|
|
|
16
20
|
};
|
|
17
21
|
result: void;
|
|
18
22
|
};
|
|
23
|
+
/**
|
|
24
|
+
* @internal
|
|
25
|
+
*/
|
|
26
|
+
export type AskMeasureSourceIngest = {
|
|
27
|
+
name: "device-manager:measures:sourceIngest";
|
|
28
|
+
payload: {
|
|
29
|
+
source: MeasureSource;
|
|
30
|
+
target: MeasureTarget;
|
|
31
|
+
measurements: DecodedMeasurement<JSONObject>[];
|
|
32
|
+
payloadUuids: string[];
|
|
33
|
+
};
|
|
34
|
+
result: void;
|
|
35
|
+
};
|
|
19
36
|
/**
|
|
20
37
|
* Event before starting to process new measures.
|
|
21
38
|
*
|
|
22
39
|
* Useful to enrich measures before they are saved.
|
|
40
|
+
*
|
|
41
|
+
* @deprecated Replaced by new triggers implementing data sources
|
|
23
42
|
*/
|
|
24
43
|
export type EventMeasureProcessBefore = {
|
|
25
44
|
name: "device-manager:measures:process:before";
|
|
@@ -31,10 +50,28 @@ export type EventMeasureProcessBefore = {
|
|
|
31
50
|
}
|
|
32
51
|
];
|
|
33
52
|
};
|
|
53
|
+
/**
|
|
54
|
+
* Event before starting to process new measures from data source.
|
|
55
|
+
*
|
|
56
|
+
* Useful to enrich measures before they are saved.
|
|
57
|
+
*/
|
|
58
|
+
export type EventMeasureProcessSourceBefore = {
|
|
59
|
+
name: "device-manager:measures:process:sourceBefore";
|
|
60
|
+
args: [
|
|
61
|
+
{
|
|
62
|
+
source: MeasureSource;
|
|
63
|
+
target: MeasureTarget;
|
|
64
|
+
asset?: AssetContent;
|
|
65
|
+
measures: MeasureContent[];
|
|
66
|
+
}
|
|
67
|
+
];
|
|
68
|
+
};
|
|
34
69
|
/**
|
|
35
70
|
* Tenant event before starting to process new measures.
|
|
36
71
|
*
|
|
37
72
|
* Useful to enrich measures before they are saved.
|
|
73
|
+
*
|
|
74
|
+
* @deprecated Replaced by new triggers implementing data sources
|
|
38
75
|
*/
|
|
39
76
|
export type TenantEventMeasureProcessBefore = {
|
|
40
77
|
name: `engine:${string}:device-manager:measures:process:before`;
|
|
@@ -46,9 +83,27 @@ export type TenantEventMeasureProcessBefore = {
|
|
|
46
83
|
}
|
|
47
84
|
];
|
|
48
85
|
};
|
|
86
|
+
/**
|
|
87
|
+
* Tenant event before starting to process new measures from data source.
|
|
88
|
+
*
|
|
89
|
+
* Useful to enrich measures before they are saved.
|
|
90
|
+
*/
|
|
91
|
+
export type TenantEventMeasureProcessSourceBefore = {
|
|
92
|
+
name: `engine:${string}:device-manager:measures:process:sourceBefore`;
|
|
93
|
+
args: [
|
|
94
|
+
{
|
|
95
|
+
source: MeasureSource;
|
|
96
|
+
target: MeasureTarget;
|
|
97
|
+
asset?: AssetContent;
|
|
98
|
+
measures: MeasureContent[];
|
|
99
|
+
}
|
|
100
|
+
];
|
|
101
|
+
};
|
|
49
102
|
/**
|
|
50
103
|
* Event triggered after updating device and asset with new measures but
|
|
51
104
|
* before persistence in database.
|
|
105
|
+
*
|
|
106
|
+
* @deprecated Replaced by new triggers implementing data sources
|
|
52
107
|
*/
|
|
53
108
|
export type EventMeasurePersistBefore = {
|
|
54
109
|
name: "device-manager:measures:persist:before";
|
|
@@ -60,9 +115,26 @@ export type EventMeasurePersistBefore = {
|
|
|
60
115
|
}
|
|
61
116
|
];
|
|
62
117
|
};
|
|
118
|
+
/**
|
|
119
|
+
* Event triggered after updating the data source and asset with new measures but
|
|
120
|
+
* before persistence in database.
|
|
121
|
+
*/
|
|
122
|
+
export type EventMeasurePersistSourceBefore = {
|
|
123
|
+
name: "device-manager:measures:persist:sourceBefore";
|
|
124
|
+
args: [
|
|
125
|
+
{
|
|
126
|
+
source: MeasureSource;
|
|
127
|
+
target: MeasureTarget;
|
|
128
|
+
asset?: AssetContent;
|
|
129
|
+
measures: MeasureContent[];
|
|
130
|
+
}
|
|
131
|
+
];
|
|
132
|
+
};
|
|
63
133
|
/**
|
|
64
134
|
* Tenant event triggered after updating device and asset with new measures but
|
|
65
135
|
* before persistence in database.
|
|
136
|
+
*
|
|
137
|
+
* @deprecated Replaced by new triggers implementing data sources
|
|
66
138
|
*/
|
|
67
139
|
export type TenantEventMeasurePersistBefore = {
|
|
68
140
|
name: `engine:${string}:device-manager:measures:persist:before`;
|
|
@@ -74,6 +146,26 @@ export type TenantEventMeasurePersistBefore = {
|
|
|
74
146
|
}
|
|
75
147
|
];
|
|
76
148
|
};
|
|
149
|
+
/**
|
|
150
|
+
* Tenant event triggered after updating the data source and asset with new measures but
|
|
151
|
+
* before persistence in database.
|
|
152
|
+
*/
|
|
153
|
+
export type TenantEventMeasurePersistSourceBefore = {
|
|
154
|
+
name: `engine:${string}:device-manager:measures:persist:sourceBefore`;
|
|
155
|
+
args: [
|
|
156
|
+
{
|
|
157
|
+
source: MeasureSource;
|
|
158
|
+
target: MeasureTarget;
|
|
159
|
+
asset?: AssetContent;
|
|
160
|
+
measures: MeasureContent[];
|
|
161
|
+
}
|
|
162
|
+
];
|
|
163
|
+
};
|
|
164
|
+
/**
|
|
165
|
+
* Event after processing new measures.
|
|
166
|
+
*
|
|
167
|
+
* @deprecated Replaced by new triggers implementing data sources
|
|
168
|
+
*/
|
|
77
169
|
export type EventMeasureProcessAfter = {
|
|
78
170
|
name: "device-manager:measures:process:after";
|
|
79
171
|
args: [
|
|
@@ -84,6 +176,25 @@ export type EventMeasureProcessAfter = {
|
|
|
84
176
|
}
|
|
85
177
|
];
|
|
86
178
|
};
|
|
179
|
+
/**
|
|
180
|
+
* Event after processing new measures from data source.
|
|
181
|
+
*/
|
|
182
|
+
export type EventMeasureProcessSourceAfter = {
|
|
183
|
+
name: "device-manager:measures:process:sourceAfter";
|
|
184
|
+
args: [
|
|
185
|
+
{
|
|
186
|
+
source: MeasureSource;
|
|
187
|
+
target: MeasureTarget;
|
|
188
|
+
asset?: AssetContent;
|
|
189
|
+
measures: MeasureContent[];
|
|
190
|
+
}
|
|
191
|
+
];
|
|
192
|
+
};
|
|
193
|
+
/**
|
|
194
|
+
* Tenant event after processing new measures.
|
|
195
|
+
*
|
|
196
|
+
* @deprecated Replaced by new triggers implementing data sources
|
|
197
|
+
*/
|
|
87
198
|
export type TenantEventMeasureProcessAfter = {
|
|
88
199
|
name: `engine:${string}:device-manager:measures:process:after`;
|
|
89
200
|
args: [
|
|
@@ -94,3 +205,18 @@ export type TenantEventMeasureProcessAfter = {
|
|
|
94
205
|
}
|
|
95
206
|
];
|
|
96
207
|
};
|
|
208
|
+
/**
|
|
209
|
+
* Tenant event after processing new measures from data source.
|
|
210
|
+
*
|
|
211
|
+
*/
|
|
212
|
+
export type TenantEventMeasureProcessSourceAfter = {
|
|
213
|
+
name: `engine:${string}:device-manager:measures:process:sourceAfter`;
|
|
214
|
+
args: [
|
|
215
|
+
{
|
|
216
|
+
source: MeasureSource;
|
|
217
|
+
target: MeasureTarget;
|
|
218
|
+
asset?: AssetContent;
|
|
219
|
+
measures: MeasureContent[];
|
|
220
|
+
}
|
|
221
|
+
];
|
|
222
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Metadata } from "../../shared";
|
|
2
|
+
interface AbstractMeasureSource {
|
|
3
|
+
type: string;
|
|
4
|
+
id: string;
|
|
5
|
+
metadata?: Metadata;
|
|
6
|
+
}
|
|
7
|
+
export interface DeviceMeasureSource extends AbstractMeasureSource {
|
|
8
|
+
type: "device";
|
|
9
|
+
reference: string;
|
|
10
|
+
model: string;
|
|
11
|
+
lastMeasuredAt?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface ApiMeasureSource extends AbstractMeasureSource {
|
|
14
|
+
type: "api";
|
|
15
|
+
}
|
|
16
|
+
export declare function isSource(source: any): source is AbstractMeasureSource;
|
|
17
|
+
export declare function isSourceDevice(source: any): source is DeviceMeasureSource;
|
|
18
|
+
export declare function isSourceApi(source: any): source is ApiMeasureSource;
|
|
19
|
+
export type MeasureSource = DeviceMeasureSource | ApiMeasureSource;
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
interface AbstractMeasureTarget {
|
|
2
|
+
type: string;
|
|
3
|
+
assetId?: string;
|
|
4
|
+
indexId: string;
|
|
5
|
+
}
|
|
6
|
+
export interface DeviceMeasureTarget extends AbstractMeasureTarget {
|
|
7
|
+
type: "device";
|
|
8
|
+
}
|
|
9
|
+
export interface ApiMeasureTarget extends AbstractMeasureTarget {
|
|
10
|
+
type: "api";
|
|
11
|
+
assetId: string;
|
|
12
|
+
engineGroup?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function isTarget(target: any): target is AbstractMeasureTarget;
|
|
15
|
+
export declare function isTargetDevice(target: any): target is DeviceMeasureTarget;
|
|
16
|
+
export declare function isTargetApi(target: any): target is ApiMeasureTarget;
|
|
17
|
+
export type MeasureTarget = DeviceMeasureTarget | ApiMeasureTarget;
|
|
18
|
+
export {};
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { KuzzleError } from "kuzzle";
|
|
2
|
+
import { ConflictChunk } from "./ModelsConflicts";
|
|
2
3
|
export declare class MappingsConflictsError extends KuzzleError {
|
|
3
4
|
private conflicts;
|
|
4
|
-
constructor(message: string, conflicts:
|
|
5
|
+
constructor(message: string, conflicts: ConflictChunk[], id?: string, code?: number);
|
|
5
6
|
get name(): string;
|
|
6
|
-
toJSON(): JSONObject;
|
|
7
|
+
toJSON(): import("kuzzle").JSONObject;
|
|
7
8
|
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { KuzzleError } from "kuzzle";
|
|
2
|
+
export declare class MeasuresNamesDuplicatesError extends KuzzleError {
|
|
3
|
+
private duplicates;
|
|
4
|
+
constructor(message: string, duplicates: string[], id?: string, code?: number);
|
|
5
|
+
get name(): string;
|
|
6
|
+
toJSON(): import("kuzzle").JSONObject;
|
|
7
|
+
}
|
|
@@ -3,15 +3,17 @@ import { JSONObject, KDocument, KHit, SearchResult } from "kuzzle-sdk";
|
|
|
3
3
|
import { DeviceManagerPlugin } from "../plugin";
|
|
4
4
|
import { BaseService, SearchParams } from "../shared";
|
|
5
5
|
import { AssetModelContent, DeviceModelContent, MeasureModelContent, MetadataDetails, MetadataGroups, MetadataMappings, TooltipModels } from "./types/ModelContent";
|
|
6
|
+
import { SchemaObject } from "ajv";
|
|
6
7
|
import { MeasureValuesDetails } from "../measure";
|
|
8
|
+
import { NamedMeasures } from "../decoder";
|
|
7
9
|
export declare class ModelService extends BaseService {
|
|
8
10
|
constructor(plugin: DeviceManagerPlugin);
|
|
9
11
|
registerAskEvents(): void;
|
|
10
12
|
private checkModelsConflicts;
|
|
11
|
-
writeAsset(engineGroup: string, model: string, metadataMappings: MetadataMappings, defaultMetadata: JSONObject, metadataDetails: MetadataDetails, metadataGroups: MetadataGroups, measures:
|
|
13
|
+
writeAsset(engineGroup: string, model: string, metadataMappings: MetadataMappings, defaultMetadata: JSONObject, metadataDetails: MetadataDetails, metadataGroups: MetadataGroups, measures: NamedMeasures, tooltipModels: TooltipModels): Promise<KDocument<AssetModelContent>>;
|
|
12
14
|
private checkDefaultValues;
|
|
13
|
-
writeDevice(model: string, metadataMappings: MetadataMappings, defaultMetadata: JSONObject, metadataDetails: MetadataDetails, metadataGroups: MetadataGroups, measures:
|
|
14
|
-
writeMeasure(type: string, valuesMappings: JSONObject, valuesDetails?: MeasureValuesDetails): Promise<KDocument<MeasureModelContent>>;
|
|
15
|
+
writeDevice(model: string, metadataMappings: MetadataMappings, defaultMetadata: JSONObject, metadataDetails: MetadataDetails, metadataGroups: MetadataGroups, measures: NamedMeasures): Promise<KDocument<DeviceModelContent>>;
|
|
16
|
+
writeMeasure(type: string, valuesMappings: JSONObject, validationSchema?: SchemaObject, valuesDetails?: MeasureValuesDetails): Promise<KDocument<MeasureModelContent>>;
|
|
15
17
|
deleteAsset(_id: string): Promise<void>;
|
|
16
18
|
deleteDevice(_id: string): Promise<void>;
|
|
17
19
|
deleteMeasure(_id: string): Promise<void>;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { JSONObject, KDocument, KHit, SearchResult } from "kuzzle-sdk";
|
|
2
2
|
import { AssetModelContent, DeviceModelContent, MeasureModelContent, MetadataDetails, MetadataGroups, MetadataMappings, TooltipModels } from "./ModelContent";
|
|
3
|
+
import { SchemaObject } from "ajv";
|
|
3
4
|
import { MeasureValuesDetails } from "../../measure/types/MeasureDefinition";
|
|
4
5
|
interface ModelsControllerRequest {
|
|
5
6
|
controller: "device-manager/models";
|
|
@@ -51,6 +52,7 @@ export interface ApiModelWriteMeasureRequest extends ModelsControllerRequest {
|
|
|
51
52
|
body: {
|
|
52
53
|
type: string;
|
|
53
54
|
valuesMappings: JSONObject;
|
|
55
|
+
validationSchema?: SchemaObject;
|
|
54
56
|
valuesDetails?: MeasureValuesDetails;
|
|
55
57
|
};
|
|
56
58
|
}
|
|
@@ -69,6 +69,7 @@ export declare class DeviceManagerEngine extends AbstractEngine<DeviceManagerPlu
|
|
|
69
69
|
* @returns An array of the available engines
|
|
70
70
|
*/
|
|
71
71
|
getEngines(): Promise<EngineDocument[]>;
|
|
72
|
+
updateMeasuresSchema(): Promise<void>;
|
|
72
73
|
onCreate(index: string, group?: string): Promise<{
|
|
73
74
|
collections: any[];
|
|
74
75
|
}>;
|
|
@@ -181,7 +181,7 @@ export declare class DeviceManagerPlugin extends Plugin {
|
|
|
181
181
|
* Register a new measure
|
|
182
182
|
*
|
|
183
183
|
* @param name Name of the measure
|
|
184
|
-
* @param
|
|
184
|
+
* @param measureDefinition Values of the measure
|
|
185
185
|
*
|
|
186
186
|
* @example
|
|
187
187
|
* ```
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ErrorObject } from "ajv";
|
|
2
|
+
import { KuzzleError } from "kuzzle";
|
|
3
|
+
export declare class SchemaValidationError extends KuzzleError {
|
|
4
|
+
private schemaErrors;
|
|
5
|
+
constructor(message: string, schemaErrors: ErrorObject[], id?: string, code?: number);
|
|
6
|
+
get name(): string;
|
|
7
|
+
toJSON(): import("kuzzle").JSONObject;
|
|
8
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { SchemaObject } from "ajv";
|
|
2
|
+
/**
|
|
3
|
+
* Compile and add the schema to the AJV cache
|
|
4
|
+
*
|
|
5
|
+
* @param scemaID The schema unique identifier
|
|
6
|
+
* @param schema The schema to add
|
|
7
|
+
*
|
|
8
|
+
* @returns The newly created validator for the schema
|
|
9
|
+
* @throws If the provided schema is not valid
|
|
10
|
+
*/
|
|
11
|
+
export declare function addSchemaToCache(schemaID: string, schema: SchemaObject): import("ajv/dist/core").default;
|
|
12
|
+
/**
|
|
13
|
+
* Search the corresponding validator in the AJV cache.
|
|
14
|
+
*
|
|
15
|
+
* @param schemaID The desired schema identifier
|
|
16
|
+
*
|
|
17
|
+
* @returns The desired schema validator
|
|
18
|
+
* @throws If the schema cannot be found
|
|
19
|
+
*/
|
|
20
|
+
export declare function getValidator(schemaID: string): import("ajv/dist/types").AnyValidateFunction<unknown>;
|
|
21
|
+
/**
|
|
22
|
+
* Get and return the previous AJV errors
|
|
23
|
+
*
|
|
24
|
+
* @returns an array of ErrorObject
|
|
25
|
+
*/
|
|
26
|
+
export declare function getAJVErrors(): import("ajv").ErrorObject<string, Record<string, any>, unknown>[];
|