11import { BadRequestError , KuzzleRequest } from "kuzzle" ;
22import { ask , onAsk } from "kuzzle-plugin-commons" ;
3- import { JSONObject , KDocument , KHit , SearchResult } from "kuzzle-sdk" ;
3+ import {
4+ BaseRequest ,
5+ DocumentSearchResult ,
6+ JSONObject ,
7+ KDocument ,
8+ KHit ,
9+ SearchResult ,
10+ } from "kuzzle-sdk" ;
411
512import { DecodedMeasurement } from "../measure" ;
613import {
@@ -9,7 +16,11 @@ import {
916 AssetModelContent ,
1017 DeviceModelContent ,
1118} from "../model" ;
12- import { DeviceManagerPlugin , InternalCollection } from "../plugin" ;
19+ import {
20+ AskEngineList ,
21+ DeviceManagerPlugin ,
22+ InternalCollection ,
23+ } from "../plugin" ;
1324import { DigitalTwinService , Metadata , SearchParams , lock } from "../shared" ;
1425import {
1526 AskAssetHistoryAdd ,
@@ -26,6 +37,7 @@ import {
2637 AskDeviceAttachEngine ,
2738 AskDeviceDetachEngine ,
2839 AskDeviceLinkAsset ,
40+ AskDeviceRefreshModel ,
2941 AskDeviceUnlinkAsset ,
3042 EventDeviceUpdateAfter ,
3143 EventDeviceUpdateBefore ,
@@ -80,6 +92,11 @@ export class DeviceService extends DigitalTwinService {
8092 await this . attachEngine ( engineId , deviceId , request ) ;
8193 } ,
8294 ) ;
95+
96+ onAsk < AskDeviceRefreshModel > (
97+ "ask:device-manager:device:refresh-model" ,
98+ this . refreshModel . bind ( this ) ,
99+ ) ;
83100 }
84101
85102 /**
@@ -101,6 +118,7 @@ export class DeviceService extends DigitalTwinService {
101118 assetId : null ,
102119 engineId : null ,
103120 lastMeasuredAt : 0 ,
121+ measureSlots : [ ] ,
104122 measures : { } ,
105123 metadata,
106124 model,
@@ -112,6 +130,8 @@ export class DeviceService extends DigitalTwinService {
112130 const deviceModel = await this . getDeviceModel ( model ) ;
113131 const engineId = request . getString ( "engineId" ) ;
114132
133+ device . _source . measureSlots = deviceModel . device . measures ;
134+
115135 for ( const metadataName of Object . keys (
116136 deviceModel . device . metadataMappings ,
117137 ) ) {
@@ -933,4 +953,64 @@ export class DeviceService extends DigitalTwinService {
933953 model,
934954 } ) ;
935955 }
956+
957+ private async refreshModel ( {
958+ deviceModel,
959+ } : {
960+ deviceModel : DeviceModelContent ;
961+ } ) : Promise < void > {
962+ const engines = await ask < AskEngineList > ( "ask:device-manager:engine:list" , {
963+ group : null ,
964+ } ) ;
965+
966+ const targets = engines . map ( ( engine ) => ( {
967+ collections : [ InternalCollection . DEVICES ] ,
968+ index : engine . index ,
969+ } ) ) ;
970+
971+ const devices = await this . sdk . query <
972+ BaseRequest ,
973+ DocumentSearchResult < DeviceContent >
974+ > ( {
975+ action : "search" ,
976+ body : { query : { equals : { model : deviceModel . device . model } } } ,
977+ controller : "document" ,
978+ lang : "koncorde" ,
979+ targets,
980+ } ) ;
981+
982+ const updatedDevicesPerIndex : Record < string , KDocument < DeviceContent > [ ] > =
983+ devices . result . hits . reduce (
984+ (
985+ acc : Record < string , KDocument < DeviceContent > [ ] > ,
986+ device : JSONObject ,
987+ ) => {
988+ device . _source . measureSlots = deviceModel . device . measures ;
989+
990+ acc [ device . index ] . push ( device as KDocument < DeviceContent > ) ;
991+
992+ return acc ;
993+ } ,
994+ Object . fromEntries (
995+ engines . map ( ( engine ) => [
996+ engine . index ,
997+ [ ] as KDocument < DeviceContent > [ ] ,
998+ ] ) ,
999+ ) ,
1000+ ) ;
1001+
1002+ await Promise . all (
1003+ Object . entries ( updatedDevicesPerIndex ) . map ( ( [ index , updatedDevices ] ) =>
1004+ this . sdk . document . mReplace < DeviceContent > (
1005+ index ,
1006+ InternalCollection . DEVICES ,
1007+ updatedDevices . map ( ( device ) => ( {
1008+ _id : device . _id ,
1009+ body : device . _source ,
1010+ } ) ) ,
1011+ { refresh : "wait_for" } ,
1012+ ) ,
1013+ ) ,
1014+ ) ;
1015+ }
9361016}
0 commit comments