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.
Files changed (193) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.js +1 -0
  3. package/dist/index.js.map +1 -1
  4. package/dist/lib/modules/asset/AssetModule.d.ts +1 -4
  5. package/dist/lib/modules/asset/AssetModule.js +0 -13
  6. package/dist/lib/modules/asset/AssetModule.js.map +1 -1
  7. package/dist/lib/modules/asset/AssetService.d.ts +7 -4
  8. package/dist/lib/modules/asset/AssetService.js +119 -50
  9. package/dist/lib/modules/asset/AssetService.js.map +1 -1
  10. package/dist/lib/modules/asset/AssetsController.d.ts +25 -7
  11. package/dist/lib/modules/asset/AssetsController.js +123 -36
  12. package/dist/lib/modules/asset/AssetsController.js.map +1 -1
  13. package/dist/lib/modules/asset/collections/assetsMappings.js +10 -15
  14. package/dist/lib/modules/asset/collections/assetsMappings.js.map +1 -1
  15. package/dist/lib/modules/asset/exports.d.ts +0 -4
  16. package/dist/lib/modules/asset/exports.js +0 -4
  17. package/dist/lib/modules/asset/exports.js.map +1 -1
  18. package/dist/lib/modules/asset/index.d.ts +1 -3
  19. package/dist/lib/modules/asset/index.js +1 -3
  20. package/dist/lib/modules/asset/index.js.map +1 -1
  21. package/dist/lib/modules/asset/model/AssetSerializer.js +0 -1
  22. package/dist/lib/modules/asset/model/AssetSerializer.js.map +1 -1
  23. package/dist/lib/modules/asset/roles/RoleAssetsAdmin.js +1 -1
  24. package/dist/lib/modules/asset/roles/RoleAssetsAdmin.js.map +1 -1
  25. package/dist/lib/modules/asset/types/AssetApi.d.ts +124 -9
  26. package/dist/lib/modules/asset/types/AssetContent.d.ts +9 -16
  27. package/dist/lib/modules/asset/types/AssetHistoryContent.d.ts +4 -11
  28. package/dist/lib/modules/decoder/DecodedPayload.d.ts +2 -0
  29. package/dist/lib/modules/decoder/DecodedPayload.js +13 -2
  30. package/dist/lib/modules/decoder/DecodedPayload.js.map +1 -1
  31. package/dist/lib/modules/decoder/Decoder.d.ts +1 -1
  32. package/dist/lib/modules/decoder/Decoder.js.map +1 -1
  33. package/dist/lib/modules/decoder/DecoderModule.js.map +1 -1
  34. package/dist/lib/modules/decoder/DecodersController.d.ts +4 -1
  35. package/dist/lib/modules/decoder/DecodersController.js +3 -0
  36. package/dist/lib/modules/decoder/DecodersController.js.map +1 -1
  37. package/dist/lib/modules/decoder/DecodersRegister.js +4 -1
  38. package/dist/lib/modules/decoder/DecodersRegister.js.map +1 -1
  39. package/dist/lib/modules/decoder/PayloadService.d.ts +1 -0
  40. package/dist/lib/modules/decoder/PayloadService.js +136 -26
  41. package/dist/lib/modules/decoder/PayloadService.js.map +1 -1
  42. package/dist/lib/modules/decoder/PayloadsController.js +1 -1
  43. package/dist/lib/modules/decoder/PayloadsController.js.map +1 -1
  44. package/dist/lib/modules/device/DeviceService.d.ts +6 -47
  45. package/dist/lib/modules/device/DeviceService.js +157 -291
  46. package/dist/lib/modules/device/DeviceService.js.map +1 -1
  47. package/dist/lib/modules/device/DevicesController.d.ts +5 -5
  48. package/dist/lib/modules/device/DevicesController.js +35 -23
  49. package/dist/lib/modules/device/DevicesController.js.map +1 -1
  50. package/dist/lib/modules/device/collections/deviceMappings.d.ts +6 -0
  51. package/dist/lib/modules/device/collections/deviceMappings.js +76 -6
  52. package/dist/lib/modules/device/collections/deviceMappings.js.map +1 -1
  53. package/dist/lib/modules/device/roles/RoleDevicesAdmin.d.ts +2 -2
  54. package/dist/lib/modules/device/roles/RoleDevicesAdmin.js +7 -4
  55. package/dist/lib/modules/device/roles/RoleDevicesAdmin.js.map +1 -1
  56. package/dist/lib/modules/device/roles/specificRoles/RoleDevicesAssetAssociation.js +4 -1
  57. package/dist/lib/modules/device/roles/specificRoles/RoleDevicesAssetAssociation.js.map +1 -1
  58. package/dist/lib/modules/device/types/DeviceApi.d.ts +69 -41
  59. package/dist/lib/modules/device/types/DeviceContent.d.ts +56 -5
  60. package/dist/lib/modules/device/types/DeviceEvents.d.ts +9 -24
  61. package/dist/lib/modules/group/GroupsController.d.ts +37 -0
  62. package/dist/lib/modules/group/GroupsController.js +472 -0
  63. package/dist/lib/modules/group/GroupsController.js.map +1 -0
  64. package/dist/lib/modules/group/GroupsModule.d.ts +10 -0
  65. package/dist/lib/modules/group/GroupsModule.js +25 -0
  66. package/dist/lib/modules/group/GroupsModule.js.map +1 -0
  67. package/dist/lib/modules/group/GroupsService.d.ts +118 -0
  68. package/dist/lib/modules/group/GroupsService.js +518 -0
  69. package/dist/lib/modules/group/GroupsService.js.map +1 -0
  70. package/dist/lib/modules/group/collections/groupsMappings.d.ts +2 -0
  71. package/dist/lib/modules/{asset/collections/assetsGroupsMapping.js → group/collections/groupsMappings.js} +4 -12
  72. package/dist/lib/modules/group/collections/groupsMappings.js.map +1 -0
  73. package/dist/lib/modules/group/exports.d.ts +5 -0
  74. package/dist/lib/modules/group/exports.js +22 -0
  75. package/dist/lib/modules/group/exports.js.map +1 -0
  76. package/dist/lib/modules/group/index.d.ts +4 -0
  77. package/dist/lib/modules/{measure/measures → group}/index.js +4 -5
  78. package/dist/lib/modules/group/index.js.map +1 -0
  79. package/dist/lib/modules/{asset/roles/RoleAssetsGroupsAdmin.d.ts → group/roles/RoleGroupsAdmin.d.ts} +3 -3
  80. package/dist/lib/modules/{asset/roles/RoleAssetsGroupsAdmin.js → group/roles/RoleGroupsAdmin.js} +7 -7
  81. package/dist/lib/modules/group/roles/RoleGroupsAdmin.js.map +1 -0
  82. package/dist/lib/modules/{asset/roles/RoleAssetsGroupsReader.d.ts → group/roles/RoleGroupsReader.d.ts} +3 -3
  83. package/dist/lib/modules/{asset/roles/RoleAssetsGroupsReader.js → group/roles/RoleGroupsReader.js} +7 -7
  84. package/dist/lib/modules/group/roles/RoleGroupsReader.js.map +1 -0
  85. package/dist/lib/modules/group/types/GroupContent.d.ts +10 -0
  86. package/dist/lib/modules/{asset/types/AssetGroupsApi.js → group/types/GroupContent.js} +1 -1
  87. package/dist/lib/modules/group/types/GroupContent.js.map +1 -0
  88. package/dist/lib/modules/group/types/GroupsApi.d.ts +141 -0
  89. package/dist/lib/modules/{asset/types/AssetGroupContent.js → group/types/GroupsApi.js} +1 -1
  90. package/dist/lib/modules/group/types/GroupsApi.js.map +1 -0
  91. package/dist/lib/modules/measure/MeasureExporter.js +14 -6
  92. package/dist/lib/modules/measure/MeasureExporter.js.map +1 -1
  93. package/dist/lib/modules/measure/MeasureService.d.ts +11 -43
  94. package/dist/lib/modules/measure/MeasureService.js +86 -375
  95. package/dist/lib/modules/measure/MeasureService.js.map +1 -1
  96. package/dist/lib/modules/measure/MeasureSourcesBuilder.d.ts +1 -2
  97. package/dist/lib/modules/measure/MeasureSourcesBuilder.js +5 -15
  98. package/dist/lib/modules/measure/MeasureSourcesBuilder.js.map +1 -1
  99. package/dist/lib/modules/measure/MeasureTargetBuilder.d.ts +1 -1
  100. package/dist/lib/modules/measure/MeasureTargetBuilder.js +2 -2
  101. package/dist/lib/modules/measure/MeasureTargetBuilder.js.map +1 -1
  102. package/dist/lib/modules/measure/collections/measuresMappings.d.ts +2 -91
  103. package/dist/lib/modules/measure/collections/measuresMappings.js +7 -11
  104. package/dist/lib/modules/measure/collections/measuresMappings.js.map +1 -1
  105. package/dist/lib/modules/measure/exports.d.ts +0 -1
  106. package/dist/lib/modules/measure/exports.js +0 -1
  107. package/dist/lib/modules/measure/exports.js.map +1 -1
  108. package/dist/lib/modules/measure/index.d.ts +0 -1
  109. package/dist/lib/modules/measure/index.js +0 -1
  110. package/dist/lib/modules/measure/index.js.map +1 -1
  111. package/dist/lib/modules/measure/types/MeasureContent.d.ts +9 -2
  112. package/dist/lib/modules/measure/types/MeasureEvents.d.ts +6 -149
  113. package/dist/lib/modules/measure/types/MeasureSources.d.ts +5 -0
  114. package/dist/lib/modules/measure/types/MeasureSources.js.map +1 -1
  115. package/dist/lib/modules/measure/types/MeasureTarget.d.ts +1 -1
  116. package/dist/lib/modules/measure/types/MeasureTarget.js +1 -1
  117. package/dist/lib/modules/measure/types/MeasureTarget.js.map +1 -1
  118. package/dist/lib/modules/model/ModelModule.js.map +1 -1
  119. package/dist/lib/modules/model/ModelSerializer.js +15 -0
  120. package/dist/lib/modules/model/ModelSerializer.js.map +1 -1
  121. package/dist/lib/modules/model/ModelService.d.ts +20 -14
  122. package/dist/lib/modules/model/ModelService.js +301 -117
  123. package/dist/lib/modules/model/ModelService.js.map +1 -1
  124. package/dist/lib/modules/model/ModelsController.d.ts +1 -1
  125. package/dist/lib/modules/model/ModelsController.js +32 -19
  126. package/dist/lib/modules/model/ModelsController.js.map +1 -1
  127. package/dist/lib/modules/model/ModelsRegister.d.ts +6 -5
  128. package/dist/lib/modules/model/ModelsRegister.js +10 -8
  129. package/dist/lib/modules/model/ModelsRegister.js.map +1 -1
  130. package/dist/lib/modules/model/collections/modelsMappings.js +20 -1
  131. package/dist/lib/modules/model/collections/modelsMappings.js.map +1 -1
  132. package/dist/lib/modules/model/types/ModelApi.d.ts +14 -9
  133. package/dist/lib/modules/model/types/ModelContent.d.ts +34 -3
  134. package/dist/lib/modules/model/types/ModelContent.js.map +1 -1
  135. package/dist/lib/modules/model/types/ModelDefinition.d.ts +6 -2
  136. package/dist/lib/modules/model/types/ModelEvents.d.ts +3 -1
  137. package/dist/lib/modules/plugin/DeviceManagerEngine.d.ts +15 -6
  138. package/dist/lib/modules/plugin/DeviceManagerEngine.js +151 -54
  139. package/dist/lib/modules/plugin/DeviceManagerEngine.js.map +1 -1
  140. package/dist/lib/modules/plugin/DeviceManagerPlugin.d.ts +10 -8
  141. package/dist/lib/modules/plugin/DeviceManagerPlugin.js +41 -44
  142. package/dist/lib/modules/plugin/DeviceManagerPlugin.js.map +1 -1
  143. package/dist/lib/modules/plugin/types/DeviceManagerConfiguration.d.ts +9 -14
  144. package/dist/lib/modules/plugin/types/InternalCollection.d.ts +1 -1
  145. package/dist/lib/modules/plugin/types/InternalCollection.js +1 -1
  146. package/dist/lib/modules/plugin/types/InternalCollection.js.map +1 -1
  147. package/dist/lib/modules/plugin/types/exports.d.ts +1 -0
  148. package/dist/lib/modules/plugin/types/exports.js +1 -0
  149. package/dist/lib/modules/plugin/types/exports.js.map +1 -1
  150. package/dist/lib/modules/shared/services/AbstractExporter.d.ts +3 -1
  151. package/dist/lib/modules/shared/services/AbstractExporter.js +7 -3
  152. package/dist/lib/modules/shared/services/AbstractExporter.js.map +1 -1
  153. package/dist/lib/modules/shared/services/BaseService.js.map +1 -1
  154. package/dist/lib/modules/shared/services/DigitalTwinExporter.d.ts +6 -1
  155. package/dist/lib/modules/shared/services/DigitalTwinExporter.js +49 -7
  156. package/dist/lib/modules/shared/services/DigitalTwinExporter.js.map +1 -1
  157. package/dist/lib/modules/shared/services/DigitalTwinService.d.ts +70 -2
  158. package/dist/lib/modules/shared/services/DigitalTwinService.js +309 -1
  159. package/dist/lib/modules/shared/services/DigitalTwinService.js.map +1 -1
  160. package/dist/lib/modules/shared/types/DigitalTwinContent.d.ts +4 -5
  161. package/dist/lib/modules/shared/types/DigitalTwinEvents.d.ts +30 -0
  162. package/package.json +15 -9
  163. package/dist/lib/modules/asset/AssetsGroupsController.d.ts +0 -24
  164. package/dist/lib/modules/asset/AssetsGroupsController.js +0 -239
  165. package/dist/lib/modules/asset/AssetsGroupsController.js.map +0 -1
  166. package/dist/lib/modules/asset/AssetsGroupsService.d.ts +0 -49
  167. package/dist/lib/modules/asset/AssetsGroupsService.js +0 -172
  168. package/dist/lib/modules/asset/AssetsGroupsService.js.map +0 -1
  169. package/dist/lib/modules/asset/collections/assetsGroupsMapping.d.ts +0 -2
  170. package/dist/lib/modules/asset/collections/assetsGroupsMapping.js.map +0 -1
  171. package/dist/lib/modules/asset/roles/RoleAssetsGroupsAdmin.js.map +0 -1
  172. package/dist/lib/modules/asset/roles/RoleAssetsGroupsReader.js.map +0 -1
  173. package/dist/lib/modules/asset/types/AssetGroupContent.d.ts +0 -11
  174. package/dist/lib/modules/asset/types/AssetGroupContent.js.map +0 -1
  175. package/dist/lib/modules/asset/types/AssetGroupsApi.d.ts +0 -59
  176. package/dist/lib/modules/asset/types/AssetGroupsApi.js.map +0 -1
  177. package/dist/lib/modules/measure/measures/BatteryMeasure.d.ts +0 -5
  178. package/dist/lib/modules/measure/measures/BatteryMeasure.js +0 -19
  179. package/dist/lib/modules/measure/measures/BatteryMeasure.js.map +0 -1
  180. package/dist/lib/modules/measure/measures/HumidityMeasure.d.ts +0 -5
  181. package/dist/lib/modules/measure/measures/HumidityMeasure.js +0 -19
  182. package/dist/lib/modules/measure/measures/HumidityMeasure.js.map +0 -1
  183. package/dist/lib/modules/measure/measures/MovementMeasure.d.ts +0 -5
  184. package/dist/lib/modules/measure/measures/MovementMeasure.js +0 -17
  185. package/dist/lib/modules/measure/measures/MovementMeasure.js.map +0 -1
  186. package/dist/lib/modules/measure/measures/PositionMeasure.d.ts +0 -10
  187. package/dist/lib/modules/measure/measures/PositionMeasure.js +0 -43
  188. package/dist/lib/modules/measure/measures/PositionMeasure.js.map +0 -1
  189. package/dist/lib/modules/measure/measures/TemperatureMeasure.d.ts +0 -5
  190. package/dist/lib/modules/measure/measures/TemperatureMeasure.js +0 -19
  191. package/dist/lib/modules/measure/measures/TemperatureMeasure.js.map +0 -1
  192. package/dist/lib/modules/measure/measures/index.d.ts +0 -5
  193. 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 ({ engineGroup, model }) => {
22
- const assetModel = await this.getAsset(engineGroup, model);
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.adminIndex && collection === "models") {
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.adminIndex && collection === "models") {
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
- async writeAsset(engineGroup, model, metadataMappings, defaultMetadata, metadataDetails, metadataGroups, measures, tooltipModels, locales) {
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
- engineGroup,
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.adminIndex, plugin_1.InternalCollection.MODELS, ModelSerializer_1.ModelSerializer.id("asset", modelContent), modelContent);
136
- await this.sdk.collection.refresh(this.config.adminIndex, plugin_1.InternalCollection.MODELS);
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.adminIndex, plugin_1.InternalCollection.MODELS, ModelSerializer_1.ModelSerializer.id("device", modelContent), modelContent);
193
- await this.sdk.collection.refresh(this.config.adminIndex, plugin_1.InternalCollection.MODELS);
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(engineGroup, model, metadataMappings, defaultMetadata, metadataDetails, metadataGroups) {
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
- engineGroup,
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.adminIndex, plugin_1.InternalCollection.MODELS, ModelSerializer_1.ModelSerializer.id("group", modelContent), modelContent);
217
- await this.sdk.collection.refresh(this.config.adminIndex, plugin_1.InternalCollection.MODELS);
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.adminIndex, plugin_1.InternalCollection.MODELS, ModelSerializer_1.ModelSerializer.id("measure", modelContent), modelContent);
245
- await this.sdk.collection.refresh(this.config.adminIndex, plugin_1.InternalCollection.MODELS);
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.adminIndex, plugin_1.InternalCollection.MODELS, _id);
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.adminIndex, plugin_1.InternalCollection.MODELS, _id);
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.adminIndex, plugin_1.InternalCollection.MODELS, _id);
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.adminIndex, plugin_1.InternalCollection.MODELS, _id);
300
+ await this.sdk.document.delete(this.config.platformIndex, plugin_1.InternalCollection.MODELS, _id);
260
301
  }
261
- async listAsset(engineGroup) {
262
- const result = await this.searchAssets(engineGroup, {
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(engineGroup) {
280
- const result = await this.searchGroups(engineGroup, {
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(engineGroup, searchParams) {
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
- { match: { type: "asset" } },
303
- {
304
- bool: {
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.adminIndex, plugin_1.InternalCollection.MODELS, {
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: [searchParams.searchBody.query, { match: { type: "device" } }],
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.adminIndex, plugin_1.InternalCollection.MODELS, {
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(engineGroup, searchParams) {
422
+ async searchGroups(engineGroups, searchParams) {
341
423
  const query = {
342
424
  bool: {
343
425
  must: [
344
426
  searchParams.searchBody.query,
345
- { match: { type: "group" } },
427
+ { term: { type: "group" } },
346
428
  {
347
429
  bool: {
348
430
  should: [
349
- { match: { engineGroup } },
350
- { match: { engineGroup: "commons" } },
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.adminIndex, plugin_1.InternalCollection.MODELS, {
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: [searchParams.searchBody.query, { match: { type: "measure" } }],
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.adminIndex, plugin_1.InternalCollection.MODELS, {
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.adminIndex, plugin_1.InternalCollection.MODELS, { query }, { lang: "koncorde", size: 1 });
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.adminIndex, plugin_1.InternalCollection.MODELS, { query }, { lang: "koncorde", size: 1 });
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(engineGroup, model) {
404
- const query = {
405
- and: [
406
- {
407
- or: [
408
- { equals: { engineGroup } },
409
- { equals: { engineGroup: "commons" } },
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
- { equals: { type: "asset" } },
413
- { equals: { "asset.model": model } },
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 result = await this.sdk.document.search(this.config.adminIndex, plugin_1.InternalCollection.MODELS, { query }, { lang: "koncorde", size: 1 });
417
- if (result.total === 0) {
418
- throw new kuzzle_1.NotFoundError(`Unknown Asset model "${model}" for engineGroup ${engineGroup}.`);
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
- return result.hits[0];
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.adminIndex, plugin_1.InternalCollection.MODELS, { query }, { lang: "koncorde", size: 1 });
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.adminIndex, plugin_1.InternalCollection.MODELS, { query }, { lang: "koncorde", size: 1 });
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 query = {
453
- and: [
454
- { equals: { type: "measure" } },
455
- { equals: { "measure.type": type } },
456
- ],
457
- };
458
- const result = await this.sdk.document.search(this.config.adminIndex, plugin_1.InternalCollection.MODELS, { query }, { lang: "koncorde", size: 1 });
459
- if (result.total === 0) {
460
- throw new kuzzle_1.NotFoundError(`Unknown Measure type "${type}".`);
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(engineGroup, model, metadataMappings, defaultMetadata, metadataDetails, metadataGroups, measures, tooltipModels, locales, request) {
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(engineGroup, model);
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.adminIndex, plugin_1.InternalCollection.MODELS, existingAsset._id, ["asset.tooltipModels"], { source: true });
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
- engineGroup,
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.adminIndex,
681
+ engineId: this.config.platformIndex,
501
682
  }, { source: true });
502
- await this.sdk.collection.refresh(this.config.adminIndex, plugin_1.InternalCollection.MODELS);
503
- await (0, kuzzle_plugin_commons_1.ask)("ask:device-manager:engine:updateAll");
504
- await (0, kuzzle_plugin_commons_1.ask)("ask:device-manager:asset:refresh-model", {
505
- assetModel: endDocument._source,
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
  }