kuzzle-device-manager 2.11.0-dev.1 → 3.0.0-3-dev.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/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/modules/asset/AssetModule.d.ts +1 -4
- package/dist/lib/modules/asset/AssetModule.js +0 -13
- package/dist/lib/modules/asset/AssetModule.js.map +1 -1
- package/dist/lib/modules/asset/AssetService.d.ts +7 -4
- package/dist/lib/modules/asset/AssetService.js +119 -50
- package/dist/lib/modules/asset/AssetService.js.map +1 -1
- package/dist/lib/modules/asset/AssetsController.d.ts +25 -7
- package/dist/lib/modules/asset/AssetsController.js +123 -36
- package/dist/lib/modules/asset/AssetsController.js.map +1 -1
- package/dist/lib/modules/asset/collections/assetsMappings.js +10 -15
- package/dist/lib/modules/asset/collections/assetsMappings.js.map +1 -1
- package/dist/lib/modules/asset/exports.d.ts +0 -4
- package/dist/lib/modules/asset/exports.js +0 -4
- package/dist/lib/modules/asset/exports.js.map +1 -1
- package/dist/lib/modules/asset/index.d.ts +1 -3
- package/dist/lib/modules/asset/index.js +1 -3
- package/dist/lib/modules/asset/index.js.map +1 -1
- package/dist/lib/modules/asset/model/AssetSerializer.js +0 -1
- package/dist/lib/modules/asset/model/AssetSerializer.js.map +1 -1
- package/dist/lib/modules/asset/roles/RoleAssetsAdmin.js +1 -1
- package/dist/lib/modules/asset/roles/RoleAssetsAdmin.js.map +1 -1
- package/dist/lib/modules/asset/types/AssetApi.d.ts +124 -9
- package/dist/lib/modules/asset/types/AssetContent.d.ts +9 -16
- package/dist/lib/modules/asset/types/AssetHistoryContent.d.ts +4 -11
- package/dist/lib/modules/decoder/DecodedPayload.d.ts +2 -0
- package/dist/lib/modules/decoder/DecodedPayload.js +13 -2
- package/dist/lib/modules/decoder/DecodedPayload.js.map +1 -1
- package/dist/lib/modules/decoder/Decoder.d.ts +1 -1
- package/dist/lib/modules/decoder/Decoder.js.map +1 -1
- package/dist/lib/modules/decoder/DecoderModule.js.map +1 -1
- package/dist/lib/modules/decoder/DecodersController.d.ts +4 -1
- package/dist/lib/modules/decoder/DecodersController.js +3 -0
- package/dist/lib/modules/decoder/DecodersController.js.map +1 -1
- package/dist/lib/modules/decoder/DecodersRegister.js +4 -1
- package/dist/lib/modules/decoder/DecodersRegister.js.map +1 -1
- package/dist/lib/modules/decoder/PayloadService.d.ts +1 -0
- package/dist/lib/modules/decoder/PayloadService.js +136 -26
- package/dist/lib/modules/decoder/PayloadService.js.map +1 -1
- package/dist/lib/modules/decoder/PayloadsController.js +1 -1
- package/dist/lib/modules/decoder/PayloadsController.js.map +1 -1
- package/dist/lib/modules/device/DeviceService.d.ts +6 -47
- package/dist/lib/modules/device/DeviceService.js +157 -291
- package/dist/lib/modules/device/DeviceService.js.map +1 -1
- package/dist/lib/modules/device/DevicesController.d.ts +5 -5
- package/dist/lib/modules/device/DevicesController.js +35 -23
- package/dist/lib/modules/device/DevicesController.js.map +1 -1
- package/dist/lib/modules/device/collections/deviceMappings.d.ts +6 -0
- package/dist/lib/modules/device/collections/deviceMappings.js +76 -6
- package/dist/lib/modules/device/collections/deviceMappings.js.map +1 -1
- package/dist/lib/modules/device/roles/RoleDevicesAdmin.d.ts +2 -2
- package/dist/lib/modules/device/roles/RoleDevicesAdmin.js +7 -4
- package/dist/lib/modules/device/roles/RoleDevicesAdmin.js.map +1 -1
- package/dist/lib/modules/device/roles/specificRoles/RoleDevicesAssetAssociation.js +4 -1
- package/dist/lib/modules/device/roles/specificRoles/RoleDevicesAssetAssociation.js.map +1 -1
- package/dist/lib/modules/device/types/DeviceApi.d.ts +69 -41
- package/dist/lib/modules/device/types/DeviceContent.d.ts +56 -5
- package/dist/lib/modules/device/types/DeviceEvents.d.ts +9 -24
- package/dist/lib/modules/group/GroupsController.d.ts +37 -0
- package/dist/lib/modules/group/GroupsController.js +472 -0
- package/dist/lib/modules/group/GroupsController.js.map +1 -0
- package/dist/lib/modules/group/GroupsModule.d.ts +10 -0
- package/dist/lib/modules/group/GroupsModule.js +25 -0
- package/dist/lib/modules/group/GroupsModule.js.map +1 -0
- package/dist/lib/modules/group/GroupsService.d.ts +118 -0
- package/dist/lib/modules/group/GroupsService.js +518 -0
- package/dist/lib/modules/group/GroupsService.js.map +1 -0
- package/dist/lib/modules/group/collections/groupsMappings.d.ts +2 -0
- package/dist/lib/modules/{asset/collections/assetsGroupsMapping.js → group/collections/groupsMappings.js} +4 -12
- package/dist/lib/modules/group/collections/groupsMappings.js.map +1 -0
- package/dist/lib/modules/group/exports.d.ts +5 -0
- package/dist/lib/modules/group/exports.js +22 -0
- package/dist/lib/modules/group/exports.js.map +1 -0
- package/dist/lib/modules/group/index.d.ts +4 -0
- package/dist/lib/modules/{measure/measures → group}/index.js +4 -5
- package/dist/lib/modules/group/index.js.map +1 -0
- package/dist/lib/modules/{asset/roles/RoleAssetsGroupsAdmin.d.ts → group/roles/RoleGroupsAdmin.d.ts} +3 -3
- package/dist/lib/modules/{asset/roles/RoleAssetsGroupsAdmin.js → group/roles/RoleGroupsAdmin.js} +7 -7
- package/dist/lib/modules/group/roles/RoleGroupsAdmin.js.map +1 -0
- package/dist/lib/modules/{asset/roles/RoleAssetsGroupsReader.d.ts → group/roles/RoleGroupsReader.d.ts} +3 -3
- package/dist/lib/modules/{asset/roles/RoleAssetsGroupsReader.js → group/roles/RoleGroupsReader.js} +7 -7
- package/dist/lib/modules/group/roles/RoleGroupsReader.js.map +1 -0
- package/dist/lib/modules/group/types/GroupContent.d.ts +10 -0
- package/dist/lib/modules/{asset/types/AssetGroupsApi.js → group/types/GroupContent.js} +1 -1
- package/dist/lib/modules/group/types/GroupContent.js.map +1 -0
- package/dist/lib/modules/group/types/GroupsApi.d.ts +141 -0
- package/dist/lib/modules/{asset/types/AssetGroupContent.js → group/types/GroupsApi.js} +1 -1
- package/dist/lib/modules/group/types/GroupsApi.js.map +1 -0
- package/dist/lib/modules/measure/MeasureExporter.js +14 -6
- package/dist/lib/modules/measure/MeasureExporter.js.map +1 -1
- package/dist/lib/modules/measure/MeasureService.d.ts +11 -43
- package/dist/lib/modules/measure/MeasureService.js +86 -375
- package/dist/lib/modules/measure/MeasureService.js.map +1 -1
- package/dist/lib/modules/measure/MeasureSourcesBuilder.d.ts +1 -2
- package/dist/lib/modules/measure/MeasureSourcesBuilder.js +5 -15
- package/dist/lib/modules/measure/MeasureSourcesBuilder.js.map +1 -1
- package/dist/lib/modules/measure/MeasureTargetBuilder.d.ts +1 -1
- package/dist/lib/modules/measure/MeasureTargetBuilder.js +2 -2
- package/dist/lib/modules/measure/MeasureTargetBuilder.js.map +1 -1
- package/dist/lib/modules/measure/collections/measuresMappings.d.ts +2 -91
- package/dist/lib/modules/measure/collections/measuresMappings.js +7 -11
- package/dist/lib/modules/measure/collections/measuresMappings.js.map +1 -1
- package/dist/lib/modules/measure/exports.d.ts +0 -1
- package/dist/lib/modules/measure/exports.js +0 -1
- package/dist/lib/modules/measure/exports.js.map +1 -1
- package/dist/lib/modules/measure/index.d.ts +0 -1
- package/dist/lib/modules/measure/index.js +0 -1
- package/dist/lib/modules/measure/index.js.map +1 -1
- package/dist/lib/modules/measure/types/MeasureContent.d.ts +9 -2
- package/dist/lib/modules/measure/types/MeasureEvents.d.ts +6 -149
- package/dist/lib/modules/measure/types/MeasureSources.d.ts +5 -0
- package/dist/lib/modules/measure/types/MeasureSources.js.map +1 -1
- package/dist/lib/modules/measure/types/MeasureTarget.d.ts +1 -1
- package/dist/lib/modules/measure/types/MeasureTarget.js +1 -1
- package/dist/lib/modules/measure/types/MeasureTarget.js.map +1 -1
- package/dist/lib/modules/model/ModelModule.js.map +1 -1
- package/dist/lib/modules/model/ModelSerializer.js +15 -0
- package/dist/lib/modules/model/ModelSerializer.js.map +1 -1
- package/dist/lib/modules/model/ModelService.d.ts +20 -14
- package/dist/lib/modules/model/ModelService.js +301 -117
- package/dist/lib/modules/model/ModelService.js.map +1 -1
- package/dist/lib/modules/model/ModelsController.d.ts +1 -1
- package/dist/lib/modules/model/ModelsController.js +32 -19
- package/dist/lib/modules/model/ModelsController.js.map +1 -1
- package/dist/lib/modules/model/ModelsRegister.d.ts +6 -5
- package/dist/lib/modules/model/ModelsRegister.js +10 -8
- package/dist/lib/modules/model/ModelsRegister.js.map +1 -1
- package/dist/lib/modules/model/collections/modelsMappings.js +20 -1
- package/dist/lib/modules/model/collections/modelsMappings.js.map +1 -1
- package/dist/lib/modules/model/types/ModelApi.d.ts +14 -9
- package/dist/lib/modules/model/types/ModelContent.d.ts +34 -3
- package/dist/lib/modules/model/types/ModelContent.js.map +1 -1
- package/dist/lib/modules/model/types/ModelDefinition.d.ts +6 -2
- package/dist/lib/modules/model/types/ModelEvents.d.ts +3 -1
- package/dist/lib/modules/plugin/DeviceManagerEngine.d.ts +15 -6
- package/dist/lib/modules/plugin/DeviceManagerEngine.js +151 -54
- package/dist/lib/modules/plugin/DeviceManagerEngine.js.map +1 -1
- package/dist/lib/modules/plugin/DeviceManagerPlugin.d.ts +10 -8
- package/dist/lib/modules/plugin/DeviceManagerPlugin.js +41 -44
- package/dist/lib/modules/plugin/DeviceManagerPlugin.js.map +1 -1
- package/dist/lib/modules/plugin/types/DeviceManagerConfiguration.d.ts +9 -14
- package/dist/lib/modules/plugin/types/InternalCollection.d.ts +1 -1
- package/dist/lib/modules/plugin/types/InternalCollection.js +1 -1
- package/dist/lib/modules/plugin/types/InternalCollection.js.map +1 -1
- package/dist/lib/modules/plugin/types/exports.d.ts +1 -0
- package/dist/lib/modules/plugin/types/exports.js +1 -0
- package/dist/lib/modules/plugin/types/exports.js.map +1 -1
- package/dist/lib/modules/shared/services/AbstractExporter.d.ts +3 -1
- package/dist/lib/modules/shared/services/AbstractExporter.js +7 -3
- package/dist/lib/modules/shared/services/AbstractExporter.js.map +1 -1
- package/dist/lib/modules/shared/services/BaseService.js.map +1 -1
- package/dist/lib/modules/shared/services/DigitalTwinExporter.d.ts +6 -1
- package/dist/lib/modules/shared/services/DigitalTwinExporter.js +49 -7
- package/dist/lib/modules/shared/services/DigitalTwinExporter.js.map +1 -1
- package/dist/lib/modules/shared/services/DigitalTwinService.d.ts +70 -2
- package/dist/lib/modules/shared/services/DigitalTwinService.js +309 -1
- package/dist/lib/modules/shared/services/DigitalTwinService.js.map +1 -1
- package/dist/lib/modules/shared/types/DigitalTwinContent.d.ts +4 -5
- package/dist/lib/modules/shared/types/DigitalTwinEvents.d.ts +30 -0
- package/package.json +15 -9
- package/dist/lib/modules/asset/AssetsGroupsController.d.ts +0 -24
- package/dist/lib/modules/asset/AssetsGroupsController.js +0 -239
- package/dist/lib/modules/asset/AssetsGroupsController.js.map +0 -1
- package/dist/lib/modules/asset/AssetsGroupsService.d.ts +0 -49
- package/dist/lib/modules/asset/AssetsGroupsService.js +0 -172
- package/dist/lib/modules/asset/AssetsGroupsService.js.map +0 -1
- package/dist/lib/modules/asset/collections/assetsGroupsMapping.d.ts +0 -2
- package/dist/lib/modules/asset/collections/assetsGroupsMapping.js.map +0 -1
- package/dist/lib/modules/asset/roles/RoleAssetsGroupsAdmin.js.map +0 -1
- package/dist/lib/modules/asset/roles/RoleAssetsGroupsReader.js.map +0 -1
- package/dist/lib/modules/asset/types/AssetGroupContent.d.ts +0 -11
- package/dist/lib/modules/asset/types/AssetGroupContent.js.map +0 -1
- package/dist/lib/modules/asset/types/AssetGroupsApi.d.ts +0 -59
- package/dist/lib/modules/asset/types/AssetGroupsApi.js.map +0 -1
- package/dist/lib/modules/measure/measures/BatteryMeasure.d.ts +0 -5
- package/dist/lib/modules/measure/measures/BatteryMeasure.js +0 -19
- package/dist/lib/modules/measure/measures/BatteryMeasure.js.map +0 -1
- package/dist/lib/modules/measure/measures/HumidityMeasure.d.ts +0 -5
- package/dist/lib/modules/measure/measures/HumidityMeasure.js +0 -19
- package/dist/lib/modules/measure/measures/HumidityMeasure.js.map +0 -1
- package/dist/lib/modules/measure/measures/MovementMeasure.d.ts +0 -5
- package/dist/lib/modules/measure/measures/MovementMeasure.js +0 -17
- package/dist/lib/modules/measure/measures/MovementMeasure.js.map +0 -1
- package/dist/lib/modules/measure/measures/PositionMeasure.d.ts +0 -10
- package/dist/lib/modules/measure/measures/PositionMeasure.js +0 -43
- package/dist/lib/modules/measure/measures/PositionMeasure.js.map +0 -1
- package/dist/lib/modules/measure/measures/TemperatureMeasure.d.ts +0 -5
- package/dist/lib/modules/measure/measures/TemperatureMeasure.js +0 -19
- package/dist/lib/modules/measure/measures/TemperatureMeasure.js.map +0 -1
- package/dist/lib/modules/measure/measures/index.d.ts +0 -5
- package/dist/lib/modules/measure/measures/index.js.map +0 -1
|
@@ -18,8 +18,8 @@ class ModelService extends shared_1.BaseService {
|
|
|
18
18
|
this.registerAskEvents();
|
|
19
19
|
}
|
|
20
20
|
registerAskEvents() {
|
|
21
|
-
(0, kuzzle_plugin_commons_1.onAsk)("ask:device-manager:model:asset:get", async ({
|
|
22
|
-
const assetModel = await this.getAsset(
|
|
21
|
+
(0, kuzzle_plugin_commons_1.onAsk)("ask:device-manager:model:asset:get", async ({ engineGroups, engineId, model }) => {
|
|
22
|
+
const assetModel = await this.getAsset(engineGroups, engineId, model);
|
|
23
23
|
return assetModel._source;
|
|
24
24
|
});
|
|
25
25
|
(0, kuzzle_plugin_commons_1.onAsk)("ask:device-manager:model:device:get", async ({ model }) => {
|
|
@@ -30,13 +30,13 @@ class ModelService extends shared_1.BaseService {
|
|
|
30
30
|
const groupModel = await this.getGroup(model);
|
|
31
31
|
return groupModel._source;
|
|
32
32
|
});
|
|
33
|
-
(0, kuzzle_plugin_commons_1.onAsk)("ask:device-manager:model:measure:get", async ({ type }) => {
|
|
34
|
-
const measureModel = await this.getMeasure(type);
|
|
33
|
+
(0, kuzzle_plugin_commons_1.onAsk)("ask:device-manager:model:measure:get", async ({ type, engineId }) => {
|
|
34
|
+
const measureModel = await this.getMeasure(type, engineId);
|
|
35
35
|
return measureModel._source;
|
|
36
36
|
});
|
|
37
37
|
const genericModelsHandler = async (documents, request) => {
|
|
38
38
|
const { index, collection } = request.input.args;
|
|
39
|
-
if (index === this.config.
|
|
39
|
+
if (index === this.config.platformIndex && collection === "models") {
|
|
40
40
|
const models = documents.map((elt) => {
|
|
41
41
|
return elt._source;
|
|
42
42
|
});
|
|
@@ -48,7 +48,7 @@ class ModelService extends shared_1.BaseService {
|
|
|
48
48
|
this.app.pipe.register("generic:document:beforeUpdate", genericModelsHandler);
|
|
49
49
|
this.app.hook.register("generic:document:afterUpdate", async (documents, request) => {
|
|
50
50
|
const { index, collection } = request.input.args;
|
|
51
|
-
if (index === this.config.
|
|
51
|
+
if (index === this.config.platformIndex && collection === "models") {
|
|
52
52
|
await (0, kuzzle_plugin_commons_1.ask)("ask:device-manager:engine:updateAll");
|
|
53
53
|
}
|
|
54
54
|
});
|
|
@@ -105,7 +105,57 @@ class ModelService extends shared_1.BaseService {
|
|
|
105
105
|
}
|
|
106
106
|
}
|
|
107
107
|
}
|
|
108
|
-
|
|
108
|
+
checkDefaultValues(metadataMappings, defaultMetadata) {
|
|
109
|
+
const flattenedMetadataMappings = (0, shared_1.flattenObject)(metadataMappings);
|
|
110
|
+
const metadata = Object.keys(JSON.parse(JSON.stringify(flattenedMetadataMappings)
|
|
111
|
+
.replace(/properties\./g, "")
|
|
112
|
+
.replace(/\.type/g, "")));
|
|
113
|
+
const values = Object.keys((0, shared_1.flattenObject)(defaultMetadata));
|
|
114
|
+
for (let i = 0; i < values.length; i++) {
|
|
115
|
+
const key = values[i];
|
|
116
|
+
// ? Check if the exact key exists in the metadata
|
|
117
|
+
if (!metadata.includes(key)) {
|
|
118
|
+
// ? Extract base key for complex types like geo_point or geo_shape
|
|
119
|
+
const baseKey = key.includes(".") ? key.split(".")[0] : key;
|
|
120
|
+
// ? Check if the base key is in the metadata
|
|
121
|
+
if (!metadata.includes(baseKey)) {
|
|
122
|
+
throw new kuzzle_1.BadRequestError(`The default value "${key}" is not in the metadata mappings.`);
|
|
123
|
+
}
|
|
124
|
+
// ? Accept nested properties for geo_point or geo_shape
|
|
125
|
+
const baseKeyMetadata = flattenedMetadataMappings[`${baseKey}.type`];
|
|
126
|
+
if (baseKeyMetadata === "geo_point" ||
|
|
127
|
+
baseKeyMetadata === "geo_shape") {
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
throw new kuzzle_1.BadRequestError(`The default value "${values[i]}" is not in the metadata mappings.`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
checkGroupAffinity(affinity) {
|
|
135
|
+
const { type, strict, models } = affinity;
|
|
136
|
+
if (!type || strict === undefined || !models) {
|
|
137
|
+
throw new kuzzle_1.BadRequestError(`The group affinity must specify a type array, models and strictness`);
|
|
138
|
+
}
|
|
139
|
+
if (!Array.isArray(type) ||
|
|
140
|
+
type.length > 2 ||
|
|
141
|
+
type.length < 1 ||
|
|
142
|
+
!type.every((t) => ["assets", "devices"].includes(t))) {
|
|
143
|
+
throw new kuzzle_1.BadRequestError(`The group type must be an array containing "assets" and/or "devices"`);
|
|
144
|
+
}
|
|
145
|
+
if (typeof strict !== "boolean") {
|
|
146
|
+
throw new kuzzle_1.BadRequestError(`The group affinity strict field must be a boolean`);
|
|
147
|
+
}
|
|
148
|
+
for (const t of type) {
|
|
149
|
+
if (!models[t] || !Array.isArray(models[t])) {
|
|
150
|
+
throw new kuzzle_1.BadRequestError(`The group affinity must contain an array for every present type`);
|
|
151
|
+
}
|
|
152
|
+
if (!models[t].every((model) => typeof model === "string")) {
|
|
153
|
+
throw new kuzzle_1.BadRequestError(`The group affinity models must be an array of models id`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return { models, strict, type };
|
|
157
|
+
}
|
|
158
|
+
async writeAsset(engineGroups, model, metadataMappings, defaultMetadata, metadataDetails, metadataGroups, measures, tooltipModels, locales, engineIds) {
|
|
109
159
|
if (kuzzle_1.Inflector.pascalCase(model) !== model) {
|
|
110
160
|
throw new kuzzle_1.BadRequestError(`Asset model "${model}" must be PascalCase.`);
|
|
111
161
|
}
|
|
@@ -113,6 +163,9 @@ class ModelService extends shared_1.BaseService {
|
|
|
113
163
|
if (duplicates.length > 0) {
|
|
114
164
|
throw new MeasuresNamesDuplicatesError_1.MeasuresNamesDuplicatesError("Asset model measures contain one or multiple duplicate measure name", duplicates);
|
|
115
165
|
}
|
|
166
|
+
const normalizedEngineGroups = engineGroups.includes("commons")
|
|
167
|
+
? ["commons"]
|
|
168
|
+
: engineGroups;
|
|
116
169
|
const modelContent = {
|
|
117
170
|
asset: {
|
|
118
171
|
defaultMetadata,
|
|
@@ -124,7 +177,8 @@ class ModelService extends shared_1.BaseService {
|
|
|
124
177
|
model,
|
|
125
178
|
tooltipModels,
|
|
126
179
|
},
|
|
127
|
-
|
|
180
|
+
engineGroups: normalizedEngineGroups,
|
|
181
|
+
...(engineIds?.length ? { engineIds } : {}),
|
|
128
182
|
type: "asset",
|
|
129
183
|
};
|
|
130
184
|
this.checkDefaultValues(metadataMappings, defaultMetadata);
|
|
@@ -132,40 +186,14 @@ class ModelService extends shared_1.BaseService {
|
|
|
132
186
|
if (conflicts.length > 0) {
|
|
133
187
|
throw new MappingsConflictsError_1.MappingsConflictsError(`New assets mappings are causing conflicts`, conflicts);
|
|
134
188
|
}
|
|
135
|
-
const assetModel = await this.sdk.document.createOrReplace(this.config.
|
|
136
|
-
await this.sdk.collection.refresh(this.config.
|
|
189
|
+
const assetModel = await this.sdk.document.createOrReplace(this.config.platformIndex, plugin_1.InternalCollection.MODELS, ModelSerializer_1.ModelSerializer.id("asset", modelContent), modelContent);
|
|
190
|
+
await this.sdk.collection.refresh(this.config.platformIndex, plugin_1.InternalCollection.MODELS);
|
|
137
191
|
await (0, kuzzle_plugin_commons_1.ask)("ask:device-manager:engine:updateAll");
|
|
138
192
|
await (0, kuzzle_plugin_commons_1.ask)("ask:device-manager:asset:refresh-model", {
|
|
139
193
|
assetModel: assetModel._source,
|
|
140
194
|
});
|
|
141
195
|
return assetModel;
|
|
142
196
|
}
|
|
143
|
-
checkDefaultValues(metadataMappings, defaultMetadata) {
|
|
144
|
-
const flattenedMetadataMappings = (0, shared_1.flattenObject)(metadataMappings);
|
|
145
|
-
const metadata = Object.keys(JSON.parse(JSON.stringify(flattenedMetadataMappings)
|
|
146
|
-
.replace(/properties\./g, "")
|
|
147
|
-
.replace(/\.type/g, "")));
|
|
148
|
-
const values = Object.keys((0, shared_1.flattenObject)(defaultMetadata));
|
|
149
|
-
for (let i = 0; i < values.length; i++) {
|
|
150
|
-
const key = values[i];
|
|
151
|
-
// ? Check if the exact key exists in the metadata
|
|
152
|
-
if (!metadata.includes(key)) {
|
|
153
|
-
// ? Extract base key for complex types like geo_point or geo_shape
|
|
154
|
-
const baseKey = key.includes(".") ? key.split(".")[0] : key;
|
|
155
|
-
// ? Check if the base key is in the metadata
|
|
156
|
-
if (!metadata.includes(baseKey)) {
|
|
157
|
-
throw new kuzzle_1.BadRequestError(`The default value "${key}" is not in the metadata mappings.`);
|
|
158
|
-
}
|
|
159
|
-
// ? Accept nested properties for geo_point or geo_shape
|
|
160
|
-
const baseKeyMetadata = flattenedMetadataMappings[`${baseKey}.type`];
|
|
161
|
-
if (baseKeyMetadata === "geo_point" ||
|
|
162
|
-
baseKeyMetadata === "geo_shape") {
|
|
163
|
-
continue;
|
|
164
|
-
}
|
|
165
|
-
throw new kuzzle_1.BadRequestError(`The default value "${values[i]}" is not in the metadata mappings.`);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
197
|
async writeDevice(model, metadataMappings, defaultMetadata, metadataDetails, metadataGroups, measures) {
|
|
170
198
|
if (kuzzle_1.Inflector.pascalCase(model) !== model) {
|
|
171
199
|
throw new kuzzle_1.BadRequestError(`Device model "${model}" must be PascalCase.`);
|
|
@@ -189,18 +217,26 @@ class ModelService extends shared_1.BaseService {
|
|
|
189
217
|
if (conflicts.length > 0) {
|
|
190
218
|
throw new MappingsConflictsError_1.MappingsConflictsError(`New devices mappings are causing conflicts`, conflicts);
|
|
191
219
|
}
|
|
192
|
-
const deviceModel = await this.sdk.document.createOrReplace(this.config.
|
|
193
|
-
await this.sdk.collection.refresh(this.config.
|
|
220
|
+
const deviceModel = await this.sdk.document.createOrReplace(this.config.platformIndex, plugin_1.InternalCollection.MODELS, ModelSerializer_1.ModelSerializer.id("device", modelContent), modelContent);
|
|
221
|
+
await this.sdk.collection.refresh(this.config.platformIndex, plugin_1.InternalCollection.MODELS);
|
|
194
222
|
await (0, kuzzle_plugin_commons_1.ask)("ask:device-manager:engine:updateAll");
|
|
223
|
+
await (0, kuzzle_plugin_commons_1.ask)("ask:device-manager:device:refresh-model", {
|
|
224
|
+
deviceModel: modelContent,
|
|
225
|
+
});
|
|
195
226
|
return deviceModel;
|
|
196
227
|
}
|
|
197
|
-
async writeGroup(
|
|
228
|
+
async writeGroup(engineGroups, model, affinity, metadataMappings, defaultMetadata, metadataDetails, metadataGroups) {
|
|
198
229
|
if (kuzzle_1.Inflector.pascalCase(model) !== model) {
|
|
199
230
|
throw new kuzzle_1.BadRequestError(`Group model "${model}" must be PascalCase.`);
|
|
200
231
|
}
|
|
232
|
+
if (engineGroups.length !== 1) {
|
|
233
|
+
throw new kuzzle_1.BadRequestError(`Group model "${model}" must belong to exactly one engine group.`);
|
|
234
|
+
}
|
|
235
|
+
const groupAffinity = this.checkGroupAffinity(affinity);
|
|
201
236
|
const modelContent = {
|
|
202
|
-
|
|
237
|
+
engineGroups,
|
|
203
238
|
group: {
|
|
239
|
+
affinity: groupAffinity,
|
|
204
240
|
defaultMetadata,
|
|
205
241
|
metadataDetails,
|
|
206
242
|
metadataGroups,
|
|
@@ -213,12 +249,12 @@ class ModelService extends shared_1.BaseService {
|
|
|
213
249
|
if (conflicts.length > 0) {
|
|
214
250
|
throw new MappingsConflictsError_1.MappingsConflictsError(`New group mappings are causing conflicts`, conflicts);
|
|
215
251
|
}
|
|
216
|
-
const groupModel = await this.sdk.document.createOrReplace(this.config.
|
|
217
|
-
await this.sdk.collection.refresh(this.config.
|
|
252
|
+
const groupModel = await this.sdk.document.createOrReplace(this.config.platformIndex, plugin_1.InternalCollection.MODELS, ModelSerializer_1.ModelSerializer.id("group", modelContent), modelContent);
|
|
253
|
+
await this.sdk.collection.refresh(this.config.platformIndex, plugin_1.InternalCollection.MODELS);
|
|
218
254
|
await (0, kuzzle_plugin_commons_1.ask)("ask:device-manager:engine:updateAll");
|
|
219
255
|
return groupModel;
|
|
220
256
|
}
|
|
221
|
-
async writeMeasure(type, valuesMappings, validationSchema, valuesDetails, locales) {
|
|
257
|
+
async writeMeasure(type, valuesMappings, validationSchema, valuesDetails, locales, engineIds) {
|
|
222
258
|
const modelContent = {
|
|
223
259
|
measure: {
|
|
224
260
|
locales,
|
|
@@ -228,6 +264,11 @@ class ModelService extends shared_1.BaseService {
|
|
|
228
264
|
},
|
|
229
265
|
type: "measure",
|
|
230
266
|
};
|
|
267
|
+
if (engineIds?.length) {
|
|
268
|
+
modelContent.engineIds = engineIds;
|
|
269
|
+
}
|
|
270
|
+
// Anti-shadowing: a measure type must be either global or tenant-scoped, not both
|
|
271
|
+
await this.checkMeasureShadowing(type, engineIds);
|
|
231
272
|
if (validationSchema) {
|
|
232
273
|
try {
|
|
233
274
|
(0, AJValidator_1.addSchemaToCache)(type, validationSchema);
|
|
@@ -241,25 +282,25 @@ class ModelService extends shared_1.BaseService {
|
|
|
241
282
|
if (conflicts.length > 0) {
|
|
242
283
|
throw new MappingsConflictsError_1.MappingsConflictsError(`New assets mappings are causing conflicts`, conflicts);
|
|
243
284
|
}
|
|
244
|
-
const measureModel = await this.sdk.document.createOrReplace(this.config.
|
|
245
|
-
await this.sdk.collection.refresh(this.config.
|
|
285
|
+
const measureModel = await this.sdk.document.createOrReplace(this.config.platformIndex, plugin_1.InternalCollection.MODELS, ModelSerializer_1.ModelSerializer.id("measure", modelContent), modelContent);
|
|
286
|
+
await this.sdk.collection.refresh(this.config.platformIndex, plugin_1.InternalCollection.MODELS);
|
|
246
287
|
await (0, kuzzle_plugin_commons_1.ask)("ask:device-manager:engine:updateAll");
|
|
247
288
|
return measureModel;
|
|
248
289
|
}
|
|
249
290
|
async deleteAsset(_id) {
|
|
250
|
-
await this.sdk.document.delete(this.config.
|
|
291
|
+
await this.sdk.document.delete(this.config.platformIndex, plugin_1.InternalCollection.MODELS, _id);
|
|
251
292
|
}
|
|
252
293
|
async deleteDevice(_id) {
|
|
253
|
-
await this.sdk.document.delete(this.config.
|
|
294
|
+
await this.sdk.document.delete(this.config.platformIndex, plugin_1.InternalCollection.MODELS, _id);
|
|
254
295
|
}
|
|
255
296
|
async deleteGroup(_id) {
|
|
256
|
-
await this.sdk.document.delete(this.config.
|
|
297
|
+
await this.sdk.document.delete(this.config.platformIndex, plugin_1.InternalCollection.MODELS, _id);
|
|
257
298
|
}
|
|
258
299
|
async deleteMeasure(_id) {
|
|
259
|
-
await this.sdk.document.delete(this.config.
|
|
300
|
+
await this.sdk.document.delete(this.config.platformIndex, plugin_1.InternalCollection.MODELS, _id);
|
|
260
301
|
}
|
|
261
|
-
async listAsset(
|
|
262
|
-
const result = await this.searchAssets(
|
|
302
|
+
async listAsset(engineGroups, engineId) {
|
|
303
|
+
const result = await this.searchAssets(engineGroups, engineId, {
|
|
263
304
|
searchBody: {
|
|
264
305
|
sort: { "asset.model": "asc" },
|
|
265
306
|
},
|
|
@@ -276,8 +317,8 @@ class ModelService extends shared_1.BaseService {
|
|
|
276
317
|
});
|
|
277
318
|
return result.hits;
|
|
278
319
|
}
|
|
279
|
-
async listGroups(
|
|
280
|
-
const result = await this.searchGroups(
|
|
320
|
+
async listGroups(engineGroups) {
|
|
321
|
+
const result = await this.searchGroups(engineGroups, {
|
|
281
322
|
searchBody: {
|
|
282
323
|
sort: { "group.model": "asc" },
|
|
283
324
|
},
|
|
@@ -285,8 +326,8 @@ class ModelService extends shared_1.BaseService {
|
|
|
285
326
|
});
|
|
286
327
|
return result.hits;
|
|
287
328
|
}
|
|
288
|
-
async listMeasures() {
|
|
289
|
-
const result = await this.searchMeasures({
|
|
329
|
+
async listMeasures(engineId) {
|
|
330
|
+
const result = await this.searchMeasures(engineId, {
|
|
290
331
|
searchBody: {
|
|
291
332
|
sort: { "measure.type": "asc" },
|
|
292
333
|
},
|
|
@@ -294,24 +335,62 @@ class ModelService extends shared_1.BaseService {
|
|
|
294
335
|
});
|
|
295
336
|
return result.hits;
|
|
296
337
|
}
|
|
297
|
-
async searchAssets(
|
|
338
|
+
async searchAssets(engineGroups, engineId, searchParams) {
|
|
339
|
+
const scopeFilter = engineId
|
|
340
|
+
? {
|
|
341
|
+
bool: {
|
|
342
|
+
should: [
|
|
343
|
+
{
|
|
344
|
+
bool: {
|
|
345
|
+
must: [
|
|
346
|
+
{ term: { engineIds: engineId } },
|
|
347
|
+
{ terms: { engineGroups } },
|
|
348
|
+
],
|
|
349
|
+
},
|
|
350
|
+
},
|
|
351
|
+
{
|
|
352
|
+
bool: {
|
|
353
|
+
must: [{ terms: { engineGroups } }],
|
|
354
|
+
must_not: [{ exists: { field: "engineIds" } }],
|
|
355
|
+
},
|
|
356
|
+
},
|
|
357
|
+
{
|
|
358
|
+
bool: {
|
|
359
|
+
must: [{ term: { engineGroups: "commons" } }],
|
|
360
|
+
must_not: [{ exists: { field: "engineIds" } }],
|
|
361
|
+
},
|
|
362
|
+
},
|
|
363
|
+
],
|
|
364
|
+
},
|
|
365
|
+
}
|
|
366
|
+
: {
|
|
367
|
+
bool: {
|
|
368
|
+
should: [
|
|
369
|
+
{
|
|
370
|
+
bool: {
|
|
371
|
+
must: [{ terms: { engineGroups } }],
|
|
372
|
+
must_not: [{ exists: { field: "engineIds" } }],
|
|
373
|
+
},
|
|
374
|
+
},
|
|
375
|
+
{
|
|
376
|
+
bool: {
|
|
377
|
+
must: [{ term: { engineGroups: "commons" } }],
|
|
378
|
+
must_not: [{ exists: { field: "engineIds" } }],
|
|
379
|
+
},
|
|
380
|
+
},
|
|
381
|
+
],
|
|
382
|
+
},
|
|
383
|
+
};
|
|
298
384
|
const query = {
|
|
299
385
|
bool: {
|
|
300
386
|
must: [
|
|
301
387
|
searchParams.searchBody.query,
|
|
302
|
-
{
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
should: [
|
|
306
|
-
{ match: { engineGroup } },
|
|
307
|
-
{ match: { engineGroup: "commons" } },
|
|
308
|
-
],
|
|
309
|
-
},
|
|
310
|
-
},
|
|
311
|
-
],
|
|
388
|
+
{ term: { type: "asset" } },
|
|
389
|
+
scopeFilter,
|
|
390
|
+
].filter(Boolean),
|
|
312
391
|
},
|
|
313
392
|
};
|
|
314
|
-
return this.sdk.document.search(this.config.
|
|
393
|
+
return this.sdk.document.search(this.config.platformIndex, plugin_1.InternalCollection.MODELS, {
|
|
315
394
|
...searchParams.searchBody,
|
|
316
395
|
query,
|
|
317
396
|
}, {
|
|
@@ -324,10 +403,13 @@ class ModelService extends shared_1.BaseService {
|
|
|
324
403
|
async searchDevices(searchParams) {
|
|
325
404
|
const query = {
|
|
326
405
|
bool: {
|
|
327
|
-
must: [
|
|
406
|
+
must: [
|
|
407
|
+
searchParams.searchBody.query,
|
|
408
|
+
{ term: { type: "device" } },
|
|
409
|
+
].filter(Boolean),
|
|
328
410
|
},
|
|
329
411
|
};
|
|
330
|
-
return this.sdk.document.search(this.config.
|
|
412
|
+
return this.sdk.document.search(this.config.platformIndex, plugin_1.InternalCollection.MODELS, {
|
|
331
413
|
...searchParams.searchBody,
|
|
332
414
|
query,
|
|
333
415
|
}, {
|
|
@@ -337,24 +419,24 @@ class ModelService extends shared_1.BaseService {
|
|
|
337
419
|
size: searchParams.size,
|
|
338
420
|
});
|
|
339
421
|
}
|
|
340
|
-
async searchGroups(
|
|
422
|
+
async searchGroups(engineGroups, searchParams) {
|
|
341
423
|
const query = {
|
|
342
424
|
bool: {
|
|
343
425
|
must: [
|
|
344
426
|
searchParams.searchBody.query,
|
|
345
|
-
{
|
|
427
|
+
{ term: { type: "group" } },
|
|
346
428
|
{
|
|
347
429
|
bool: {
|
|
348
430
|
should: [
|
|
349
|
-
{
|
|
350
|
-
{
|
|
431
|
+
{ terms: { engineGroups } },
|
|
432
|
+
{ term: { engineGroups: "commons" } },
|
|
351
433
|
],
|
|
352
434
|
},
|
|
353
435
|
},
|
|
354
|
-
],
|
|
436
|
+
].filter(Boolean),
|
|
355
437
|
},
|
|
356
438
|
};
|
|
357
|
-
return this.sdk.document.search(this.config.
|
|
439
|
+
return this.sdk.document.search(this.config.platformIndex, plugin_1.InternalCollection.MODELS, {
|
|
358
440
|
...searchParams.searchBody,
|
|
359
441
|
query,
|
|
360
442
|
}, {
|
|
@@ -364,13 +446,31 @@ class ModelService extends shared_1.BaseService {
|
|
|
364
446
|
size: searchParams.size,
|
|
365
447
|
});
|
|
366
448
|
}
|
|
367
|
-
async searchMeasures(searchParams) {
|
|
449
|
+
async searchMeasures(engineId, searchParams) {
|
|
450
|
+
const scopeFilter = engineId
|
|
451
|
+
? {
|
|
452
|
+
bool: {
|
|
453
|
+
should: [
|
|
454
|
+
{ term: { engineIds: engineId } },
|
|
455
|
+
{ bool: { must_not: [{ exists: { field: "engineIds" } }] } },
|
|
456
|
+
],
|
|
457
|
+
},
|
|
458
|
+
}
|
|
459
|
+
: {
|
|
460
|
+
bool: {
|
|
461
|
+
must_not: [{ exists: { field: "engineIds" } }],
|
|
462
|
+
},
|
|
463
|
+
};
|
|
368
464
|
const query = {
|
|
369
465
|
bool: {
|
|
370
|
-
must: [
|
|
466
|
+
must: [
|
|
467
|
+
searchParams.searchBody.query,
|
|
468
|
+
{ term: { type: "measure" } },
|
|
469
|
+
scopeFilter,
|
|
470
|
+
].filter(Boolean),
|
|
371
471
|
},
|
|
372
472
|
};
|
|
373
|
-
return this.sdk.document.search(this.config.
|
|
473
|
+
return this.sdk.document.search(this.config.platformIndex, plugin_1.InternalCollection.MODELS, {
|
|
374
474
|
...searchParams.searchBody,
|
|
375
475
|
query,
|
|
376
476
|
}, {
|
|
@@ -387,7 +487,7 @@ class ModelService extends shared_1.BaseService {
|
|
|
387
487
|
{ equals: { "asset.model": model } },
|
|
388
488
|
],
|
|
389
489
|
};
|
|
390
|
-
const result = await this.sdk.document.search(this.config.
|
|
490
|
+
const result = await this.sdk.document.search(this.config.platformIndex, plugin_1.InternalCollection.MODELS, { query }, { lang: "koncorde", size: 1 });
|
|
391
491
|
return result.total > 0;
|
|
392
492
|
}
|
|
393
493
|
async deviceExists(model) {
|
|
@@ -397,27 +497,53 @@ class ModelService extends shared_1.BaseService {
|
|
|
397
497
|
{ equals: { "device.model": model } },
|
|
398
498
|
],
|
|
399
499
|
};
|
|
400
|
-
const result = await this.sdk.document.search(this.config.
|
|
500
|
+
const result = await this.sdk.document.search(this.config.platformIndex, plugin_1.InternalCollection.MODELS, { query }, { lang: "koncorde", size: 1 });
|
|
401
501
|
return result.total > 0;
|
|
402
502
|
}
|
|
403
|
-
async getAsset(
|
|
404
|
-
const
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
503
|
+
async getAsset(engineGroups, engineId, model) {
|
|
504
|
+
const baseFilter = [
|
|
505
|
+
{ term: { type: "asset" } },
|
|
506
|
+
{ term: { "asset.model": model } },
|
|
507
|
+
];
|
|
508
|
+
// Priority 1: tenant-scoped model for this specific engine
|
|
509
|
+
if (engineId) {
|
|
510
|
+
const tenantQuery = {
|
|
511
|
+
bool: {
|
|
512
|
+
must: [
|
|
513
|
+
...baseFilter,
|
|
514
|
+
{ terms: { engineGroups } },
|
|
515
|
+
{ term: { engineIds: engineId } },
|
|
410
516
|
],
|
|
411
517
|
},
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
518
|
+
};
|
|
519
|
+
const tenantResult = await this.sdk.document.search(this.config.platformIndex, plugin_1.InternalCollection.MODELS, { query: tenantQuery }, { lang: "elasticsearch", size: 1 });
|
|
520
|
+
if (tenantResult.total > 0) {
|
|
521
|
+
return tenantResult.hits[0];
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
// Priority 2: group-scoped model (no engineIds field)
|
|
525
|
+
const groupQuery = {
|
|
526
|
+
bool: {
|
|
527
|
+
must: [...baseFilter, { terms: { engineGroups } }],
|
|
528
|
+
must_not: [{ exists: { field: "engineIds" } }],
|
|
529
|
+
},
|
|
415
530
|
};
|
|
416
|
-
const
|
|
417
|
-
if (
|
|
418
|
-
|
|
531
|
+
const groupResult = await this.sdk.document.search(this.config.platformIndex, plugin_1.InternalCollection.MODELS, { query: groupQuery }, { lang: "elasticsearch", size: 1 });
|
|
532
|
+
if (groupResult.total > 0) {
|
|
533
|
+
return groupResult.hits[0];
|
|
419
534
|
}
|
|
420
|
-
|
|
535
|
+
// Priority 3: commons model
|
|
536
|
+
const commonsQuery = {
|
|
537
|
+
bool: {
|
|
538
|
+
must: [...baseFilter, { term: { engineGroups: "commons" } }],
|
|
539
|
+
must_not: [{ exists: { field: "engineIds" } }],
|
|
540
|
+
},
|
|
541
|
+
};
|
|
542
|
+
const commonsResult = await this.sdk.document.search(this.config.platformIndex, plugin_1.InternalCollection.MODELS, { query: commonsQuery }, { lang: "elasticsearch", size: 1 });
|
|
543
|
+
if (commonsResult.total > 0) {
|
|
544
|
+
return commonsResult.hits[0];
|
|
545
|
+
}
|
|
546
|
+
throw new kuzzle_1.NotFoundError(`Unknown Asset model "${model}" for engineGroups ${engineGroups.join(", ")}.`);
|
|
421
547
|
}
|
|
422
548
|
async getDevice(model) {
|
|
423
549
|
const query = {
|
|
@@ -426,7 +552,7 @@ class ModelService extends shared_1.BaseService {
|
|
|
426
552
|
{ equals: { "device.model": model } },
|
|
427
553
|
],
|
|
428
554
|
};
|
|
429
|
-
const result = await this.sdk.document.search(this.config.
|
|
555
|
+
const result = await this.sdk.document.search(this.config.platformIndex, plugin_1.InternalCollection.MODELS, { query }, { lang: "koncorde", size: 1 });
|
|
430
556
|
if (result.total === 0) {
|
|
431
557
|
throw new kuzzle_1.NotFoundError(`Unknown Device model "${model}".`);
|
|
432
558
|
}
|
|
@@ -439,7 +565,7 @@ class ModelService extends shared_1.BaseService {
|
|
|
439
565
|
{ equals: { "group.model": model } },
|
|
440
566
|
],
|
|
441
567
|
};
|
|
442
|
-
const result = await this.sdk.document.search(this.config.
|
|
568
|
+
const result = await this.sdk.document.search(this.config.platformIndex, plugin_1.InternalCollection.MODELS, { query }, { lang: "koncorde", size: 1 });
|
|
443
569
|
if (result.total === 0) {
|
|
444
570
|
throw new kuzzle_1.NotFoundError(`Unknown Group model "${model}".`);
|
|
445
571
|
}
|
|
@@ -448,31 +574,86 @@ class ModelService extends shared_1.BaseService {
|
|
|
448
574
|
}
|
|
449
575
|
return result.hits[0];
|
|
450
576
|
}
|
|
451
|
-
async getMeasure(type) {
|
|
452
|
-
const
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
577
|
+
async getMeasure(type, engineId) {
|
|
578
|
+
const baseFilter = [
|
|
579
|
+
{ term: { type: "measure" } },
|
|
580
|
+
{ term: { "measure.type": type } },
|
|
581
|
+
];
|
|
582
|
+
const scopeFilter = engineId
|
|
583
|
+
? {
|
|
584
|
+
bool: {
|
|
585
|
+
should: [
|
|
586
|
+
{ term: { engineIds: engineId } },
|
|
587
|
+
{ bool: { must_not: [{ exists: { field: "engineIds" } }] } },
|
|
588
|
+
],
|
|
589
|
+
},
|
|
590
|
+
}
|
|
591
|
+
: {
|
|
592
|
+
bool: {
|
|
593
|
+
must_not: [{ exists: { field: "engineIds" } }],
|
|
594
|
+
},
|
|
595
|
+
};
|
|
596
|
+
const result = await this.sdk.document.search(this.config.platformIndex, plugin_1.InternalCollection.MODELS, {
|
|
597
|
+
query: {
|
|
598
|
+
bool: {
|
|
599
|
+
must: [...baseFilter, scopeFilter],
|
|
600
|
+
},
|
|
601
|
+
},
|
|
602
|
+
}, { lang: "elasticsearch", size: 1 });
|
|
603
|
+
if (result.total > 0) {
|
|
604
|
+
return result.hits[0];
|
|
605
|
+
}
|
|
606
|
+
throw new kuzzle_1.NotFoundError(`Unknown Measure type "${type}".`);
|
|
607
|
+
}
|
|
608
|
+
/**
|
|
609
|
+
* Checks that creating/updating a measure model does not shadow an existing
|
|
610
|
+
* one at a different scope (global vs tenant-scoped).
|
|
611
|
+
*/
|
|
612
|
+
async checkMeasureShadowing(type, engineIds) {
|
|
613
|
+
const isNewTenantScoped = engineIds && engineIds.length > 0;
|
|
614
|
+
// Check for existing measures of the same type at the opposite scope
|
|
615
|
+
const conflictQuery = isNewTenantScoped
|
|
616
|
+
? {
|
|
617
|
+
// New is tenant-scoped → reject if a global measure exists
|
|
618
|
+
bool: {
|
|
619
|
+
must: [
|
|
620
|
+
{ term: { type: "measure" } },
|
|
621
|
+
{ term: { "measure.type": type } },
|
|
622
|
+
],
|
|
623
|
+
must_not: [{ exists: { field: "engineIds" } }],
|
|
624
|
+
},
|
|
625
|
+
}
|
|
626
|
+
: {
|
|
627
|
+
// New is global → reject if any tenant-scoped measure exists
|
|
628
|
+
bool: {
|
|
629
|
+
must: [
|
|
630
|
+
{ term: { type: "measure" } },
|
|
631
|
+
{ term: { "measure.type": type } },
|
|
632
|
+
{ exists: { field: "engineIds" } },
|
|
633
|
+
],
|
|
634
|
+
},
|
|
635
|
+
};
|
|
636
|
+
const result = await this.sdk.document.search(this.config.platformIndex, plugin_1.InternalCollection.MODELS, { query: conflictQuery }, { lang: "elasticsearch", size: 1 });
|
|
637
|
+
if (result.total > 0) {
|
|
638
|
+
const scope = isNewTenantScoped ? "global" : "tenant-scoped";
|
|
639
|
+
throw new kuzzle_1.BadRequestError(`Measure type "${type}" already exists as a ${scope} measure. A measure type cannot be both global and tenant-scoped.`);
|
|
461
640
|
}
|
|
462
|
-
return result.hits[0];
|
|
463
641
|
}
|
|
464
642
|
/**
|
|
465
643
|
* Update an asset model
|
|
466
644
|
*/
|
|
467
|
-
async updateAsset(
|
|
645
|
+
async updateAsset(engineGroups, model, metadataMappings, defaultMetadata, metadataDetails, metadataGroups, measures, tooltipModels, locales, request) {
|
|
468
646
|
if (kuzzle_1.Inflector.pascalCase(model) !== model) {
|
|
469
647
|
throw new kuzzle_1.BadRequestError(`Asset model "${model}" must be PascalCase.`);
|
|
470
648
|
}
|
|
471
649
|
this.checkDefaultValues(metadataMappings, defaultMetadata);
|
|
472
|
-
const existingAsset = await this.getAsset(
|
|
650
|
+
const existingAsset = await this.getAsset(engineGroups, undefined, model);
|
|
473
651
|
// The field must be deleted if an element of the table is to be deleted
|
|
474
|
-
await this.sdk.document.deleteFields(this.config.
|
|
652
|
+
await this.sdk.document.deleteFields(this.config.platformIndex, plugin_1.InternalCollection.MODELS, existingAsset._id, ["asset.tooltipModels"], { source: true });
|
|
475
653
|
const measuresUpdated = measures.length === 0 ? existingAsset._source.asset.measures : measures;
|
|
654
|
+
const normalizedEngineGroups = engineGroups.includes("commons")
|
|
655
|
+
? ["commons"]
|
|
656
|
+
: engineGroups;
|
|
476
657
|
const assetModelContent = {
|
|
477
658
|
asset: {
|
|
478
659
|
defaultMetadata,
|
|
@@ -484,7 +665,7 @@ class ModelService extends shared_1.BaseService {
|
|
|
484
665
|
model,
|
|
485
666
|
tooltipModels,
|
|
486
667
|
},
|
|
487
|
-
|
|
668
|
+
engineGroups: normalizedEngineGroups,
|
|
488
669
|
type: "asset",
|
|
489
670
|
};
|
|
490
671
|
const assetModel = {
|
|
@@ -497,13 +678,16 @@ class ModelService extends shared_1.BaseService {
|
|
|
497
678
|
}
|
|
498
679
|
const endDocument = await this.updateDocument(request, assetModel, {
|
|
499
680
|
collection: plugin_1.InternalCollection.MODELS,
|
|
500
|
-
engineId: this.config.
|
|
681
|
+
engineId: this.config.platformIndex,
|
|
501
682
|
}, { source: true });
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
683
|
+
// ? Only update engineIds and refresh asset models when necessary
|
|
684
|
+
if (Object.keys(metadataMappings).length > 0 || measures.length > 0) {
|
|
685
|
+
await this.sdk.collection.refresh(this.config.platformIndex, plugin_1.InternalCollection.MODELS);
|
|
686
|
+
await (0, kuzzle_plugin_commons_1.ask)("ask:device-manager:engine:updateAll");
|
|
687
|
+
await (0, kuzzle_plugin_commons_1.ask)("ask:device-manager:asset:refresh-model", {
|
|
688
|
+
assetModel: endDocument._source,
|
|
689
|
+
});
|
|
690
|
+
}
|
|
507
691
|
return endDocument;
|
|
508
692
|
}
|
|
509
693
|
}
|