kuzzle-device-manager-types 3.0.0-next.3 → 3.0.0-next.4

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 (41) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/lib/modules/asset/AssetModule.d.ts +0 -1
  3. package/dist/lib/modules/asset/AssetService.d.ts +8 -1
  4. package/dist/lib/modules/asset/AssetsController.d.ts +7 -1
  5. package/dist/lib/modules/asset/exports.d.ts +0 -4
  6. package/dist/lib/modules/asset/index.d.ts +1 -3
  7. package/dist/lib/modules/asset/types/AssetApi.d.ts +5 -6
  8. package/dist/lib/modules/asset/types/AssetContent.d.ts +2 -7
  9. package/dist/lib/modules/{asset/AssetsGroupsController.d.ts → group/GroupsController.d.ts} +14 -6
  10. package/dist/lib/modules/group/GroupsModule.d.ts +6 -0
  11. package/dist/lib/modules/group/GroupsService.d.ts +47 -0
  12. package/dist/lib/modules/group/collections/groupsMappings.d.ts +2 -0
  13. package/dist/lib/modules/group/exports.d.ts +5 -0
  14. package/dist/lib/modules/group/index.d.ts +4 -0
  15. package/dist/lib/modules/{asset/roles/RoleAssetsGroupsAdmin.d.ts → group/roles/RoleGroupsAdmin.d.ts} +3 -3
  16. package/dist/lib/modules/{asset/roles/RoleAssetsGroupsReader.d.ts → group/roles/RoleGroupsReader.d.ts} +3 -3
  17. package/dist/lib/modules/group/types/GroupContent.d.ts +10 -0
  18. package/dist/lib/modules/{asset/types/AssetGroupsApi.d.ts → group/types/GroupsApi.d.ts} +13 -13
  19. package/dist/lib/modules/measure/collections/measuresMappings.d.ts +1 -9
  20. package/dist/lib/modules/measure/types/MeasureDefinition.d.ts +4 -0
  21. package/dist/lib/modules/model/ModelService.d.ts +15 -4
  22. package/dist/lib/modules/model/ModelsConflicts.d.ts +9 -1
  23. package/dist/lib/modules/model/ModelsController.d.ts +6 -1
  24. package/dist/lib/modules/model/ModelsRegister.d.ts +18 -2
  25. package/dist/lib/modules/model/types/ModelApi.d.ts +49 -1
  26. package/dist/lib/modules/model/types/ModelContent.d.ts +131 -1
  27. package/dist/lib/modules/model/types/ModelDefinition.d.ts +106 -2
  28. package/dist/lib/modules/model/types/ModelEvents.d.ts +8 -1
  29. package/dist/lib/modules/plugin/DeviceManagerEngine.d.ts +22 -5
  30. package/dist/lib/modules/plugin/DeviceManagerPlugin.d.ts +55 -1
  31. package/dist/lib/modules/plugin/types/DeviceManagerConfiguration.d.ts +2 -1
  32. package/dist/lib/modules/plugin/types/InternalCollection.d.ts +1 -1
  33. package/dist/lib/modules/plugin/types/exports.d.ts +1 -0
  34. package/dist/lib/modules/shared/types/DigitalTwinContent.d.ts +4 -0
  35. package/dist/lib/modules/shared/types/Models.d.ts +2 -1
  36. package/dist/tests/application/groups/Parking.d.ts +14 -0
  37. package/dist/tests/application/groups/index.d.ts +1 -0
  38. package/package.json +1 -1
  39. package/dist/lib/modules/asset/collections/assetsGroupsMapping.d.ts +0 -2
  40. package/dist/lib/modules/asset/types/AssetGroupContent.d.ts +0 -9
  41. package/dist/tests/application/decoders/index.d.ts +0 -2
package/dist/index.d.ts CHANGED
@@ -5,3 +5,4 @@ export * from "./lib/modules/measure/exports";
5
5
  export * from "./lib/modules/decoder/exports";
6
6
  export * from "./lib/modules/shared/exports";
7
7
  export * from "./lib/modules/model/exports";
8
+ export * from "./lib/modules/group/exports";
@@ -3,6 +3,5 @@ export declare class AssetModule extends Module {
3
3
  private assetService;
4
4
  private assetHistoryService;
5
5
  private assetController;
6
- private assetGroupsController;
7
6
  init(): Promise<void>;
8
7
  }
@@ -3,7 +3,7 @@ import { JSONObject, KDocument, KHit, SearchResult, mReplaceResponse } from "kuz
3
3
  import { DeviceManagerPlugin } from "../plugin";
4
4
  import { DigitalTwinService, Metadata, SearchParams } from "../shared";
5
5
  import { AssetHistoryService } from "./AssetHistoryService";
6
- import { ApiAssetMigrateTenantResult } from "./types/AssetApi";
6
+ import { ApiAssetMigrateTenantResult, ApiAssetUpdateModelLocales } from "./types/AssetApi";
7
7
  import { AssetContent } from "./types/AssetContent";
8
8
  export declare class AssetService extends DigitalTwinService {
9
9
  private assetHistoryService;
@@ -39,6 +39,13 @@ export declare class AssetService extends DigitalTwinService {
39
39
  mReplaceAndHistorize(engineId: string, assets: KDocument<AssetContent>[], removedMetadata: string[], { refresh }: {
40
40
  refresh: any;
41
41
  }): Promise<mReplaceResponse>;
42
+ /**
43
+ * Retrieve locales with the specified model and search all assets related to the model to update the locales.
44
+ * The operation is historized.
45
+ * @param request
46
+ * @param model
47
+ */
48
+ updateModelLocales(request: KuzzleRequest, model: string): Promise<ApiAssetUpdateModelLocales[]>;
42
49
  private getEngine;
43
50
  private refreshModel;
44
51
  }
@@ -1,7 +1,7 @@
1
1
  import { ControllerDefinition, KuzzleRequest } from "kuzzle";
2
2
  import { DeviceManagerPlugin } from "../plugin";
3
3
  import { AssetService } from "./AssetService";
4
- import { ApiAssetCreateResult, ApiAssetUpsertResult, ApiAssetDeleteResult, ApiAssetGetMeasuresResult, ApiAssetGetResult, ApiAssetSearchResult, ApiAssetUpdateResult, ApiAssetMigrateTenantResult, ApiAssetMetadataReplaceResult, ApiAssetGetLastMeasuresResult, ApiAssetMGetLastMeasuredAtResult, ApiAssetMGetLastMeasuresResult, ApiAssetGetLastMeasuredAtResult } from "./types/AssetApi";
4
+ import { ApiAssetCreateResult, ApiAssetUpsertResult, ApiAssetDeleteResult, ApiAssetGetMeasuresResult, ApiAssetGetResult, ApiAssetSearchResult, ApiAssetUpdateResult, ApiAssetMigrateTenantResult, ApiAssetMetadataReplaceResult, ApiAssetGetLastMeasuresResult, ApiAssetMGetLastMeasuredAtResult, ApiAssetMGetLastMeasuresResult, ApiAssetGetLastMeasuredAtResult, ApiAssetUpdateModelLocales } from "./types/AssetApi";
5
5
  export declare class AssetsController {
6
6
  private plugin;
7
7
  private assetService;
@@ -36,4 +36,10 @@ export declare class AssetsController {
36
36
  migrateTenant(request: KuzzleRequest): Promise<ApiAssetMigrateTenantResult>;
37
37
  getLastMeasuredAt(request: KuzzleRequest): Promise<ApiAssetGetLastMeasuredAtResult>;
38
38
  mGetLastMeasuredAt(request: KuzzleRequest): Promise<ApiAssetMGetLastMeasuredAtResult>;
39
+ /**
40
+ * Update modelLocales of all assets related to the specified asset model.
41
+ * This operation is done to make the search assets feature up to date
42
+ * @param request
43
+ */
44
+ updateModelLocales(request: KuzzleRequest): Promise<ApiAssetUpdateModelLocales[]>;
39
45
  }
@@ -2,11 +2,7 @@ export * from "./types/AssetContent";
2
2
  export * from "./types/AssetHistoryContent";
3
3
  export * from "./types/AssetEvents";
4
4
  export * from "./types/AssetApi";
5
- export * from "./types/AssetGroupContent";
6
- export * from "./types/AssetGroupsApi";
7
5
  export * from "./roles/RoleAssetsAdmin";
8
6
  export * from "./roles/RoleAssetsReader";
9
- export * from "./roles/RoleAssetsGroupsAdmin";
10
- export * from "./roles/RoleAssetsGroupsReader";
11
7
  export * from "./collections/assetsMappings";
12
8
  export * from "./collections/assetsHistoryMappings";
@@ -1,6 +1,6 @@
1
1
  export * from "./collections/assetsMappings";
2
2
  export * from "./collections/assetsHistoryMappings";
3
- export * from "./collections/assetsGroupsMapping";
3
+ export * from "../group/collections/groupsMappings";
4
4
  export * from "./types/AssetContent";
5
5
  export * from "./types/AssetHistoryContent";
6
6
  export * from "./types/AssetEvents";
@@ -9,5 +9,3 @@ export * from "./model/AssetSerializer";
9
9
  export * from "./AssetModule";
10
10
  export * from "./roles/RoleAssetsAdmin";
11
11
  export * from "./roles/RoleAssetsReader";
12
- export * from "./roles/RoleAssetsGroupsAdmin";
13
- export * from "./roles/RoleAssetsGroupsReader";
@@ -1,4 +1,4 @@
1
- import { JSONObject, KDocument, KHit, SearchResult } from "kuzzle-sdk";
1
+ import { JSONObject, KDocument, KHit, SearchResult, UpdateByQueryResponse } from "kuzzle-sdk";
2
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";
@@ -7,11 +7,6 @@ import { ApiMeasureSource } from "../../measure/types/MeasureSources";
7
7
  interface AssetsControllerRequest {
8
8
  controller: AssetsControllerName;
9
9
  engineId: string;
10
- /**
11
- * ? Request parameter used by SoftTenant module
12
- * ! Not used directly in this plugin
13
- */
14
- softTenantId?: string | string[] | null;
15
10
  }
16
11
  export interface ApiAssetGetRequest extends AssetsControllerRequest {
17
12
  action: "get";
@@ -170,4 +165,8 @@ export type ApiAssetGetLastMeasuredAtRequest = ApiDigitalTwinGetLastMeasuredAtRe
170
165
  export type ApiAssetGetLastMeasuredAtResult = ApiDigitalTwinGetLastMeasuredAtResult;
171
166
  export type ApiAssetMGetLastMeasuredAtRequest = ApiDigitalTwinMGetLastMeasuredAtRequest<AssetsControllerName>;
172
167
  export type ApiAssetMGetLastMeasuredAtResult = ApiDigitalTwinMGetLastMeasuredAtResult;
168
+ export type ApiAssetUpdateModelLocales = {
169
+ engineIndex: string;
170
+ result: UpdateByQueryResponse<AssetContent>;
171
+ };
173
172
  export {};
@@ -33,14 +33,9 @@ export interface AssetContent<TMeasures extends JSONObject = any, TMetadata exte
33
33
  * Id's of asset groups
34
34
  */
35
35
  groups: Array<{
36
- id: string;
36
+ path: string;
37
37
  date: number;
38
38
  }>;
39
- /**
40
- * Id's of soft tenants
41
- * ! Not used directly in this plugin
42
- */
43
- softTenant?: Array<string>;
44
39
  }
45
40
  /**
46
41
  * Asset description used to contextualize each measure data point
@@ -54,4 +49,4 @@ export type AssetMeasureContext<TMetadata extends Metadata = Metadata> = {
54
49
  * Name of the measure for the Asset
55
50
  */
56
51
  measureName: string;
57
- } & Pick<AssetContent<JSONObject, TMetadata>, "model" | "reference" | "metadata" | "groups" | "softTenant">;
52
+ } & Pick<AssetContent<JSONObject, TMetadata>, "model" | "reference" | "metadata" | "groups">;
@@ -1,15 +1,23 @@
1
1
  import { ControllerDefinition, KuzzleRequest } from "kuzzle";
2
2
  import { DeviceManagerPlugin } from "../plugin";
3
- import { ApiGroupAddAssetsResult, ApiGroupCreateResult, ApiGroupDeleteResult, ApiGroupGetResult, ApiGroupRemoveAssetsResult, ApiGroupSearchResult, ApiGroupUpdateResult, AssetsGroupsBodyRequest } from "./types/AssetGroupsApi";
4
- export declare class AssetsGroupsController {
3
+ import { ApiGroupAddAssetsResult, ApiGroupCreateResult, ApiGroupDeleteResult, ApiGroupGetResult, ApiGroupRemoveAssetsResult, ApiGroupSearchResult, ApiGroupUpdateResult, GroupsBodyRequest } from "./types/GroupsApi";
4
+ import { GroupsService } from "./GroupsService";
5
+ export declare class GroupsController {
5
6
  private plugin;
7
+ private groupsService;
6
8
  definition: ControllerDefinition;
7
- constructor(plugin: DeviceManagerPlugin);
9
+ constructor(plugin: DeviceManagerPlugin, groupsService: GroupsService);
8
10
  private get sdk();
9
11
  private get as();
10
- checkParent(engineId: string, parent: AssetsGroupsBodyRequest["parent"]): Promise<void>;
11
- checkChildren(engineId: string, children: AssetsGroupsBodyRequest["children"]): Promise<void>;
12
- checkGroupName(engineId: string, name: AssetsGroupsBodyRequest["name"], assetId?: string): Promise<void>;
12
+ /**
13
+ * Check that the path property is valid, and closest parent exists.
14
+ * @param {string} engineId Engine ID
15
+ * @param {string} path The path of a group
16
+ * @throws {BadRequestError} If the path is not a string or if the path is not valid.
17
+ * @returns {void}
18
+ */
19
+ checkPath(engineId: string, path: GroupsBodyRequest["path"], groupId?: string): Promise<void>;
20
+ checkGroupName(engineId: string, name: GroupsBodyRequest["name"], assetId?: string): Promise<void>;
13
21
  create(request: KuzzleRequest): Promise<ApiGroupCreateResult>;
14
22
  get(request: KuzzleRequest): Promise<ApiGroupGetResult>;
15
23
  update(request: KuzzleRequest): Promise<ApiGroupUpdateResult>;
@@ -0,0 +1,6 @@
1
+ import { Module } from "../shared/Module";
2
+ export declare class GroupsModule extends Module {
3
+ private groupsController;
4
+ private groupsService;
5
+ init(): Promise<void>;
6
+ }
@@ -0,0 +1,47 @@
1
+ import { JSONObject, KDocument } from "kuzzle-sdk";
2
+ import { DeviceManagerPlugin } from "../plugin";
3
+ import { BaseService, SearchParams } from "../shared";
4
+ import { KuzzleRequest } from "kuzzle";
5
+ import { GroupContent } from "./exports";
6
+ export declare class GroupsService extends BaseService {
7
+ constructor(plugin: DeviceManagerPlugin);
8
+ create(_id: string, engineId: string, metadata: JSONObject, model: string, name: string, path: string, request: KuzzleRequest): Promise<KDocument<GroupContent>>;
9
+ get(engineId: string, _id: string, request: KuzzleRequest): Promise<KDocument<GroupContent>>;
10
+ update(request: KuzzleRequest, _id: string, engineId: string, updateContent: JSONObject): Promise<KDocument<GroupContent>>;
11
+ delete(_id: string, engineId: string, request: KuzzleRequest): Promise<{
12
+ _id: string;
13
+ }>;
14
+ search(engineId: string, searchParams: SearchParams, request: KuzzleRequest): Promise<import("kuzzle-sdk").SearchResult<import("kuzzle-sdk").KHit<GroupContent>>>;
15
+ addAsset(engineId: string, path: string, assetIds: string[], request: KuzzleRequest): Promise<{
16
+ group: KDocument<GroupContent>;
17
+ successes: {
18
+ _id: string;
19
+ _source: JSONObject;
20
+ _version: number;
21
+ }[];
22
+ errors: {
23
+ document: {
24
+ _id: string;
25
+ _source: JSONObject;
26
+ };
27
+ status: number;
28
+ reason: string;
29
+ }[];
30
+ }>;
31
+ removeAsset(engineId: string, path: string, assetIds: string[], request: KuzzleRequest): Promise<{
32
+ group: KDocument<GroupContent>;
33
+ successes: {
34
+ _id: string;
35
+ _source: JSONObject;
36
+ _version: number;
37
+ }[];
38
+ errors: {
39
+ document: {
40
+ _id: string;
41
+ _source: JSONObject;
42
+ };
43
+ status: number;
44
+ reason: string;
45
+ }[];
46
+ }>;
47
+ }
@@ -0,0 +1,2 @@
1
+ import { CollectionMappings } from "kuzzle";
2
+ export declare const groupsMappings: CollectionMappings;
@@ -0,0 +1,5 @@
1
+ export * from "./types/GroupContent";
2
+ export * from "./types/GroupsApi";
3
+ export * from "./roles/RoleGroupsAdmin";
4
+ export * from "./roles/RoleGroupsReader";
5
+ export * from "./collections/groupsMappings";
@@ -0,0 +1,4 @@
1
+ export * from "./collections/groupsMappings";
2
+ export * from "./GroupsModule";
3
+ export * from "./roles/RoleGroupsAdmin";
4
+ export * from "./roles/RoleGroupsReader";
@@ -1,12 +1,12 @@
1
1
  import { KuzzleRole } from "../../shared/types/KuzzleRole";
2
2
  /**
3
- * This role allows to manage assets and their models.
3
+ * This role allows to manage groups and their models.
4
4
  *
5
5
  * It's a tenant role.
6
6
  *
7
7
  * @example
8
8
  *
9
- "device-manager/assets": {
9
+ "device-manager/groups": {
10
10
  actions: {
11
11
  "*": true,
12
12
  },
@@ -21,4 +21,4 @@ import { KuzzleRole } from "../../shared/types/KuzzleRole";
21
21
  },
22
22
  },
23
23
  */
24
- export declare const RoleAssetsGroupsAdmin: KuzzleRole;
24
+ export declare const RoleGroupsAdmin: KuzzleRole;
@@ -1,12 +1,12 @@
1
1
  import { KuzzleRole } from "../../shared/types/KuzzleRole";
2
2
  /**
3
- * This role allows to manage assets and their models.
3
+ * This role allows to manage groups and their models.
4
4
  *
5
5
  * It's a tenant role.
6
6
  *
7
7
  * @example
8
8
  *
9
- "device-manager/assets": {
9
+ "device-manager/groups": {
10
10
  actions: {
11
11
  "*": true,
12
12
  },
@@ -21,4 +21,4 @@ import { KuzzleRole } from "../../shared/types/KuzzleRole";
21
21
  },
22
22
  },
23
23
  */
24
- export declare const RoleAssetsGroupsReader: KuzzleRole;
24
+ export declare const RoleGroupsReader: KuzzleRole;
@@ -0,0 +1,10 @@
1
+ import { KDocumentContent } from "kuzzle-sdk";
2
+ import { Metadata } from "lib/modules/shared";
3
+ export interface GroupsBody<TMetadata extends Metadata = Metadata> extends KDocumentContent {
4
+ name: string;
5
+ model?: string | null;
6
+ path: string;
7
+ lastUpdate: number;
8
+ metadata?: TMetadata;
9
+ }
10
+ export type GroupContent<TMetadata extends Metadata = any> = GroupsBody<TMetadata>;
@@ -1,31 +1,31 @@
1
1
  import { JSONObject, KDocument, KHit, SearchResult, mUpdateResponse } from "kuzzle-sdk";
2
- import { AssetsGroupsBody, AssetsGroupContent } from "./AssetGroupContent";
3
- type AssetsGroupsRequest = Omit<AssetsGroupsBody, "lastUpdate">;
4
- export type AssetsGroupsBodyRequest = Partial<AssetsGroupsRequest> & Omit<AssetsGroupsRequest, "parent" | "type">;
2
+ import { GroupsBody, GroupContent } from "./GroupContent";
3
+ type GroupsRequest = Omit<GroupsBody, "lastUpdate">;
4
+ export type GroupsBodyRequest = Partial<GroupsRequest>;
5
5
  export type UpdateAssetLinkResponse = mUpdateResponse & {
6
- assetsGroups: KDocument<AssetsGroupContent>;
6
+ group: KDocument<GroupContent>;
7
7
  };
8
8
  interface GroupControllerRequest {
9
- controller: "device-manager/assetsGroup";
9
+ controller: "device-manager/groups";
10
10
  engineId: string;
11
11
  }
12
12
  export interface ApiGroupCreateRequest extends GroupControllerRequest {
13
13
  action: "create";
14
14
  _id?: string;
15
- body: Omit<AssetsGroupsBodyRequest, "children">;
15
+ body: GroupsBodyRequest;
16
16
  }
17
- export type ApiGroupCreateResult = KDocument<AssetsGroupContent>;
17
+ export type ApiGroupCreateResult = KDocument<GroupContent>;
18
18
  export interface ApiGroupGetRequest extends GroupControllerRequest {
19
19
  action: "get";
20
20
  _id: string;
21
21
  }
22
- export type ApiGroupGetResult = KDocument<AssetsGroupContent>;
22
+ export type ApiGroupGetResult = KDocument<GroupContent>;
23
23
  export interface ApiGroupUpdateRequest extends GroupControllerRequest {
24
24
  action: "update";
25
25
  _id: string;
26
- body: AssetsGroupsBodyRequest;
26
+ body: GroupsBodyRequest;
27
27
  }
28
- export type ApiGroupUpdateResult = KDocument<AssetsGroupContent>;
28
+ export type ApiGroupUpdateResult = KDocument<GroupContent>;
29
29
  export interface ApiGroupDeleteRequest extends GroupControllerRequest {
30
30
  action: "delete";
31
31
  _id: string;
@@ -39,19 +39,19 @@ export interface ApiGroupSearchRequest extends GroupControllerRequest {
39
39
  lang?: "koncorde" | "elasticsearch";
40
40
  body: JSONObject;
41
41
  }
42
- export type ApiGroupSearchResult = SearchResult<KHit<AssetsGroupContent>>;
42
+ export type ApiGroupSearchResult = SearchResult<KHit<GroupContent>>;
43
43
  export interface ApiGroupAddAssetsRequest extends GroupControllerRequest {
44
44
  action: "addAsset";
45
- _id: string;
46
45
  body: {
46
+ path: string;
47
47
  assetIds: string[];
48
48
  };
49
49
  }
50
50
  export type ApiGroupAddAssetsResult = UpdateAssetLinkResponse;
51
51
  export interface ApiGroupRemoveAssetsRequest extends GroupControllerRequest {
52
52
  action: "removeAsset";
53
- _id: string;
54
53
  body: {
54
+ path: string;
55
55
  assetIds: string[];
56
56
  };
57
57
  }
@@ -37,7 +37,7 @@ export declare const measuresMappings: {
37
37
  };
38
38
  groups: {
39
39
  properties: {
40
- id: {
40
+ path: {
41
41
  type: string;
42
42
  fields: {
43
43
  text: {
@@ -50,14 +50,6 @@ export declare const measuresMappings: {
50
50
  };
51
51
  };
52
52
  };
53
- softTenant: {
54
- type: string;
55
- fields: {
56
- text: {
57
- type: string;
58
- };
59
- };
60
- };
61
53
  };
62
54
  };
63
55
  /**
@@ -1,5 +1,6 @@
1
1
  import { SchemaObject } from "ajv";
2
2
  import { JSONObject } from "kuzzle-sdk";
3
+ import { LocaleDetails } from "lib/modules/model";
3
4
  interface MeasureLocales {
4
5
  [localeString: string]: {
5
6
  friendlyName: string;
@@ -44,6 +45,9 @@ export interface MeasureValuesDetails {
44
45
  *}
45
46
  */
46
47
  export interface MeasureDefinition {
48
+ locales?: {
49
+ [valueName: string]: LocaleDetails;
50
+ };
47
51
  /**
48
52
  * Mappings for the measurement values in order to index the fields
49
53
  */
@@ -2,7 +2,7 @@ import { KuzzleRequest } from "kuzzle";
2
2
  import { JSONObject, KDocument, KHit, SearchResult } from "kuzzle-sdk";
3
3
  import { DeviceManagerPlugin } from "../plugin";
4
4
  import { BaseService, SearchParams } from "../shared";
5
- import { AssetModelContent, DeviceModelContent, MeasureModelContent, MetadataDetails, MetadataGroups, MetadataMappings, TooltipModels } from "./types/ModelContent";
5
+ import { AssetModelContent, DeviceModelContent, GroupModelContent, LocaleDetails, MeasureModelContent, MetadataDetails, MetadataGroups, MetadataMappings, TooltipModels } from "./types/ModelContent";
6
6
  import { SchemaObject } from "ajv";
7
7
  import { MeasureValuesDetails } from "../measure";
8
8
  import { NamedMeasures } from "../decoder";
@@ -10,26 +10,37 @@ export declare class ModelService extends BaseService {
10
10
  constructor(plugin: DeviceManagerPlugin);
11
11
  registerAskEvents(): void;
12
12
  private checkModelsConflicts;
13
- writeAsset(engineGroup: string, model: string, metadataMappings: MetadataMappings, defaultMetadata: JSONObject, metadataDetails: MetadataDetails, metadataGroups: MetadataGroups, measures: NamedMeasures, tooltipModels: TooltipModels): Promise<KDocument<AssetModelContent>>;
13
+ writeAsset(engineGroup: string, model: string, metadataMappings: MetadataMappings, defaultMetadata: JSONObject, metadataDetails: MetadataDetails, metadataGroups: MetadataGroups, measures: NamedMeasures, tooltipModels: TooltipModels, locales: {
14
+ [valueName: string]: LocaleDetails;
15
+ }): Promise<KDocument<AssetModelContent>>;
14
16
  private checkDefaultValues;
15
17
  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>>;
18
+ writeGroup(engineGroup: string, model: string, metadataMappings: MetadataMappings, defaultMetadata: JSONObject, metadataDetails: MetadataDetails, metadataGroups: MetadataGroups): Promise<KDocument<GroupModelContent>>;
19
+ writeMeasure(type: string, valuesMappings: JSONObject, validationSchema?: SchemaObject, valuesDetails?: MeasureValuesDetails, locales?: {
20
+ [valueName: string]: LocaleDetails;
21
+ }): Promise<KDocument<MeasureModelContent>>;
17
22
  deleteAsset(_id: string): Promise<void>;
18
23
  deleteDevice(_id: string): Promise<void>;
24
+ deleteGroup(_id: string): Promise<void>;
19
25
  deleteMeasure(_id: string): Promise<void>;
20
26
  listAsset(engineGroup: string): Promise<KDocument<AssetModelContent>[]>;
21
27
  listDevices(): Promise<KDocument<DeviceModelContent>[]>;
28
+ listGroups(engineGroup: string): Promise<KDocument<GroupModelContent>[]>;
22
29
  listMeasures(): Promise<KDocument<MeasureModelContent>[]>;
23
30
  searchAssets(engineGroup: string, searchParams: Partial<SearchParams>): Promise<SearchResult<KHit<AssetModelContent>>>;
24
31
  searchDevices(searchParams: Partial<SearchParams>): Promise<SearchResult<KHit<DeviceModelContent>>>;
32
+ searchGroups(engineGroup: string, searchParams: Partial<SearchParams>): Promise<SearchResult<KHit<GroupModelContent>>>;
25
33
  searchMeasures(searchParams: Partial<SearchParams>): Promise<SearchResult<KHit<MeasureModelContent>>>;
26
34
  assetExists(model: string): Promise<boolean>;
27
35
  deviceExists(model: string): Promise<boolean>;
28
36
  getAsset(engineGroup: string, model: string): Promise<KDocument<AssetModelContent>>;
29
37
  getDevice(model: string): Promise<KDocument<DeviceModelContent>>;
38
+ getGroup(model: string): Promise<KDocument<GroupModelContent>>;
30
39
  getMeasure(type: string): Promise<KDocument<MeasureModelContent>>;
31
40
  /**
32
41
  * Update an asset model
33
42
  */
34
- updateAsset(engineGroup: string, model: string, metadataMappings: MetadataMappings, defaultMetadata: JSONObject, metadataDetails: MetadataDetails, metadataGroups: MetadataGroups, measures: AssetModelContent["asset"]["measures"], tooltipModels: TooltipModels, request: KuzzleRequest): Promise<KDocument<AssetModelContent>>;
43
+ updateAsset(engineGroup: string, model: string, metadataMappings: MetadataMappings, defaultMetadata: JSONObject, metadataDetails: MetadataDetails, metadataGroups: MetadataGroups, measures: AssetModelContent["asset"]["measures"], tooltipModels: TooltipModels, locales: {
44
+ [valueName: string]: LocaleDetails;
45
+ }, request: KuzzleRequest): Promise<KDocument<AssetModelContent>>;
35
46
  }
@@ -1,5 +1,5 @@
1
1
  import { TwinModelContent, TwinType } from "../plugin";
2
- import { MeasureModelContent } from "./exports";
2
+ import { GroupModelContent, MeasureModelContent } from "./exports";
3
3
  export type ConflictChunk = {
4
4
  sourceModel: string;
5
5
  newModel: string;
@@ -20,6 +20,14 @@ export type MappingsConflict = {
20
20
  * @returns An array of ConflictChunk between current twins and the new twin
21
21
  */
22
22
  export declare function getTwinConflicts<TDigitalTwin extends TwinModelContent>(twinType: TwinType, models: TDigitalTwin[], additional: TDigitalTwin): ConflictChunk[];
23
+ /**
24
+ * Return every conflicts between the mappings of group models and a new group model
25
+ *
26
+ * @param groups The already present group models
27
+ * @param additional The new group model
28
+ * @returns An array of ConflictChunk between current groups and the new group
29
+ */
30
+ export declare function getGroupConflicts(measures: GroupModelContent[], additional: GroupModelContent): ConflictChunk[];
23
31
  /**
24
32
  * Return every conflicts between the mappings of measure models and a new measure model
25
33
  *
@@ -1,24 +1,29 @@
1
1
  import { ControllerDefinition, KuzzleRequest } from "kuzzle";
2
2
  import { ModelService } from "./ModelService";
3
- import { ApiModelWriteAssetResult, ApiModelWriteDeviceResult, ApiModelWriteMeasureResult, ApiModelUpdateAssetResult, ApiModelDeleteAssetResult, ApiModelDeleteDeviceResult, ApiModelDeleteMeasureResult, ApiModelListAssetsResult, ApiModelListDevicesResult, ApiModelListMeasuresResult, ApiModelGetAssetResult, ApiModelGetDeviceResult, ApiModelGetMeasureResult, ApiModelSearchAssetsResult, ApiModelSearchDevicesResult, ApiModelSearchMeasuresResult } from "./types/ModelApi";
3
+ import { ApiModelWriteAssetResult, ApiModelWriteDeviceResult, ApiModelWriteMeasureResult, ApiModelUpdateAssetResult, ApiModelDeleteAssetResult, ApiModelDeleteDeviceResult, ApiModelDeleteMeasureResult, ApiModelListAssetsResult, ApiModelListDevicesResult, ApiModelListMeasuresResult, ApiModelGetAssetResult, ApiModelGetDeviceResult, ApiModelGetMeasureResult, ApiModelSearchAssetsResult, ApiModelSearchDevicesResult, ApiModelSearchMeasuresResult, ApiModelDeleteGroupResult, ApiModelGetGroupResult, ApiModelListGroupsResult, ApiModelSearchGroupsResult, ApiModelWriteGroupResult } from "./types/ModelApi";
4
4
  export declare class ModelsController {
5
5
  private modelService;
6
6
  definition: ControllerDefinition;
7
7
  constructor(modelService: ModelService);
8
8
  getAsset(request: KuzzleRequest): Promise<ApiModelGetAssetResult>;
9
9
  getDevice(request: KuzzleRequest): Promise<ApiModelGetDeviceResult>;
10
+ getGroup(request: KuzzleRequest): Promise<ApiModelGetGroupResult>;
10
11
  getMeasure(request: KuzzleRequest): Promise<ApiModelGetMeasureResult>;
11
12
  writeAsset(request: KuzzleRequest): Promise<ApiModelWriteAssetResult>;
12
13
  writeDevice(request: KuzzleRequest): Promise<ApiModelWriteDeviceResult>;
14
+ writeGroup(request: KuzzleRequest): Promise<ApiModelWriteGroupResult>;
13
15
  writeMeasure(request: KuzzleRequest): Promise<ApiModelWriteMeasureResult>;
14
16
  deleteAsset(request: KuzzleRequest): Promise<ApiModelDeleteAssetResult>;
15
17
  deleteDevice(request: KuzzleRequest): Promise<ApiModelDeleteDeviceResult>;
18
+ deleteGroup(request: KuzzleRequest): Promise<ApiModelDeleteGroupResult>;
16
19
  deleteMeasure(request: KuzzleRequest): Promise<ApiModelDeleteMeasureResult>;
17
20
  listAssets(request: KuzzleRequest): Promise<ApiModelListAssetsResult>;
18
21
  listDevices(): Promise<ApiModelListDevicesResult>;
22
+ listGroups(request: KuzzleRequest): Promise<ApiModelListGroupsResult>;
19
23
  listMeasures(): Promise<ApiModelListMeasuresResult>;
20
24
  searchAssets(request: KuzzleRequest): Promise<ApiModelSearchAssetsResult>;
21
25
  searchDevices(request: KuzzleRequest): Promise<ApiModelSearchDevicesResult>;
26
+ searchGroups(request: KuzzleRequest): Promise<ApiModelSearchGroupsResult>;
22
27
  searchMeasures(request: KuzzleRequest): Promise<ApiModelSearchMeasuresResult>;
23
28
  updateAsset(request: KuzzleRequest): Promise<ApiModelUpdateAssetResult>;
24
29
  }
@@ -1,13 +1,14 @@
1
1
  import { DeviceManagerPlugin } from "../plugin";
2
2
  import { NamedMeasures } from "../decoder";
3
3
  import { MeasureDefinition } from "../measure";
4
- import { MetadataDetails, MetadataGroups, MetadataMappings, TooltipModels } from "./types/ModelContent";
4
+ import { LocaleDetails, MetadataDetails, MetadataGroups, MetadataMappings, TooltipModels } from "./types/ModelContent";
5
5
  import { JSONObject } from "kuzzle-sdk";
6
6
  export declare class ModelsRegister {
7
7
  private config;
8
8
  private context;
9
9
  private assetModels;
10
10
  private deviceModels;
11
+ private groupModels;
11
12
  private measureModels;
12
13
  private get sdk();
13
14
  init(plugin: DeviceManagerPlugin): void;
@@ -25,7 +26,9 @@ export declare class ModelsRegister {
25
26
  * @param tooltipModels - Optional model list for tooltip, containing labels and tooltip content.
26
27
  * @throws PluginImplementationError if the model name is not in PascalCase.
27
28
  */
28
- registerAsset(engineGroup: string, model: string, measures: NamedMeasures, metadataMappings?: MetadataMappings, defaultMetadata?: JSONObject, metadataDetails?: MetadataDetails, metadataGroups?: MetadataGroups, tooltipModels?: TooltipModels): void;
29
+ registerAsset(engineGroup: string, model: string, measures: NamedMeasures, metadataMappings?: MetadataMappings, defaultMetadata?: JSONObject, metadataDetails?: MetadataDetails, metadataGroups?: MetadataGroups, tooltipModels?: TooltipModels, locales?: {
30
+ [valueName: string]: LocaleDetails;
31
+ }): void;
29
32
  /**
30
33
  * Registers a device model.
31
34
  *
@@ -38,6 +41,19 @@ export declare class ModelsRegister {
38
41
  * @throws PluginImplementationError if the model name is not in PascalCase.
39
42
  */
40
43
  registerDevice(model: string, measures: NamedMeasures, metadataMappings?: MetadataMappings, defaultMetadata?: JSONObject, metadataDetails?: MetadataDetails, metadataGroups?: MetadataGroups): void;
44
+ /**
45
+ * Registers a group model.
46
+ *
47
+ *
48
+ * @param engineGroup - The engine group name.
49
+ * @param model - The name of the group model, which must be in PascalCase.
50
+ * @param metadataMappings - The metadata mappings for the model, defaults to an empty object.
51
+ * @param defaultMetadata - The default metadata values for the model, defaults to an empty object.
52
+ * @param metadataDetails - Optional detailed metadata descriptions, localizations and definition.
53
+ * @param metadataGroups - Optional groups for organizing metadata, with localizations.
54
+ * @throws PluginImplementationError if the model name is not in PascalCase.
55
+ */
56
+ registerGroup(engineGroup: string, model: string, metadataMappings?: MetadataMappings, defaultMetadata?: JSONObject, metadataDetails?: MetadataDetails, metadataGroups?: MetadataGroups): void;
41
57
  registerMeasure(type: string, measureDefinition: MeasureDefinition): void;
42
58
  private load;
43
59
  }
@@ -1,5 +1,5 @@
1
1
  import { JSONObject, KDocument, KHit, SearchResult } from "kuzzle-sdk";
2
- import { AssetModelContent, DeviceModelContent, MeasureModelContent, MetadataDetails, MetadataGroups, MetadataMappings, TooltipModels } from "./ModelContent";
2
+ import { AssetModelContent, DeviceModelContent, GroupModelContent, LocaleDetails, MeasureModelContent, MetadataDetails, MetadataGroups, MetadataMappings, TooltipModels } from "./ModelContent";
3
3
  import { SchemaObject } from "ajv";
4
4
  import { MeasureValuesDetails } from "../../measure/types/MeasureDefinition";
5
5
  interface ModelsControllerRequest {
@@ -16,6 +16,11 @@ export interface ApiModelGetDeviceRequest extends ModelsControllerRequest {
16
16
  model: string;
17
17
  }
18
18
  export type ApiModelGetDeviceResult = KDocument<DeviceModelContent>;
19
+ export interface ApiModelGetGroupRequest extends ModelsControllerRequest {
20
+ action: "getGroup";
21
+ model: string;
22
+ }
23
+ export type ApiModelGetGroupResult = KDocument<GroupModelContent>;
19
24
  export interface ApiModelGetMeasureRequest extends ModelsControllerRequest {
20
25
  action: "getMeasure";
21
26
  type: string;
@@ -32,6 +37,9 @@ export interface ApiModelWriteAssetRequest extends ModelsControllerRequest {
32
37
  defaultValues?: JSONObject;
33
38
  measures?: AssetModelContent["asset"]["measures"];
34
39
  tooltipModels?: TooltipModels;
40
+ locales?: {
41
+ [valueName: string]: LocaleDetails;
42
+ };
35
43
  };
36
44
  }
37
45
  export type ApiModelWriteAssetResult = KDocument<AssetModelContent>;
@@ -47,10 +55,25 @@ export interface ApiModelWriteDeviceRequest extends ModelsControllerRequest {
47
55
  };
48
56
  }
49
57
  export type ApiModelWriteDeviceResult = KDocument<DeviceModelContent>;
58
+ export interface ApiModelWriteGroupRequest extends ModelsControllerRequest {
59
+ action: "writeGroup";
60
+ body: {
61
+ engineGroup: string;
62
+ model: string;
63
+ metadataDetails?: MetadataDetails;
64
+ metadataGroups?: MetadataGroups;
65
+ metadataMappings?: MetadataMappings;
66
+ defaultValues?: JSONObject;
67
+ };
68
+ }
69
+ export type ApiModelWriteGroupResult = KDocument<GroupModelContent>;
50
70
  export interface ApiModelWriteMeasureRequest extends ModelsControllerRequest {
51
71
  action: "writeMeasure";
52
72
  body: {
53
73
  type: string;
74
+ locales?: {
75
+ [valueName: string]: LocaleDetails;
76
+ };
54
77
  valuesMappings: JSONObject;
55
78
  validationSchema?: SchemaObject;
56
79
  valuesDetails?: MeasureValuesDetails;
@@ -68,6 +91,9 @@ export interface ApiModelUpdateAssetRequest extends ModelsControllerRequest {
68
91
  defaultValues?: JSONObject;
69
92
  measures?: AssetModelContent["asset"]["measures"];
70
93
  tooltipModels?: TooltipModels;
94
+ locales?: {
95
+ [valueName: string]: LocaleDetails;
96
+ };
71
97
  };
72
98
  }
73
99
  export type ApiModelUpdateAssetResult = KDocument<AssetModelContent>;
@@ -81,6 +107,11 @@ export interface ApiModelDeleteDeviceRequest extends ModelsControllerRequest {
81
107
  _id: string;
82
108
  }
83
109
  export type ApiModelDeleteDeviceResult = void;
110
+ export interface ApiModelDeleteGroupRequest extends ModelsControllerRequest {
111
+ action: "deleteGroup";
112
+ _id: string;
113
+ }
114
+ export type ApiModelDeleteGroupResult = void;
84
115
  export interface ApiModelDeleteMeasureRequest extends ModelsControllerRequest {
85
116
  action: "deleteMeasure";
86
117
  _id: string;
@@ -101,6 +132,14 @@ export type ApiModelListDevicesResult = {
101
132
  models: KDocument<DeviceModelContent>[];
102
133
  total: number;
103
134
  };
135
+ export interface ApiModelListGroupsRequest extends ModelsControllerRequest {
136
+ action: "listGroups";
137
+ engineGroup: string;
138
+ }
139
+ export type ApiModelListGroupsResult = {
140
+ models: KDocument<GroupModelContent>[];
141
+ total: number;
142
+ };
104
143
  export interface ApiModelListMeasuresRequest extends ModelsControllerRequest {
105
144
  action: "listMeasures";
106
145
  }
@@ -125,6 +164,15 @@ export interface ApiModelSearchDevicesRequest extends ModelsControllerRequest {
125
164
  body?: JSONObject;
126
165
  }
127
166
  export type ApiModelSearchDevicesResult = SearchResult<KHit<DeviceModelContent>>;
167
+ export interface ApiModelSearchGroupsRequest extends ModelsControllerRequest {
168
+ action: "searchGroups";
169
+ engineGroup: string;
170
+ from?: number;
171
+ size?: number;
172
+ scrollTTL?: string;
173
+ body?: JSONObject;
174
+ }
175
+ export type ApiModelSearchGroupsResult = SearchResult<KHit<GroupModelContent>>;
128
176
  export interface ApiModelSearchMeasuresRequest extends ModelsControllerRequest {
129
177
  action: "searchMeasures";
130
178
  from?: number;
@@ -5,6 +5,9 @@ export interface MeasureModelContent extends KDocumentContent {
5
5
  type: "measure";
6
6
  measure: MeasureDefinition & {
7
7
  type: string;
8
+ locales?: {
9
+ [valueName: string]: LocaleDetails;
10
+ };
8
11
  };
9
12
  }
10
13
  export interface MetadataProperty {
@@ -265,6 +268,9 @@ export interface AssetModelContent extends KDocumentContent {
265
268
  * ]
266
269
  */
267
270
  tooltipModels?: TooltipModels;
271
+ locales?: {
272
+ [locale: string]: LocaleDetails;
273
+ };
268
274
  };
269
275
  }
270
276
  export interface DeviceModelContent extends KDocumentContent {
@@ -356,4 +362,128 @@ export interface DeviceModelContent extends KDocumentContent {
356
362
  measures: NamedMeasures;
357
363
  };
358
364
  }
359
- export type ModelContent = MeasureModelContent | AssetModelContent | DeviceModelContent;
365
+ export interface GroupModelContent extends KDocumentContent {
366
+ type: "group";
367
+ engineGroup: string;
368
+ group: {
369
+ /**
370
+ * Name of the model
371
+ */
372
+ model: string;
373
+ /**
374
+ * Metadata mappings.
375
+ *
376
+ * @example
377
+ * {
378
+ * "company": {
379
+ * "properties": {
380
+ * "name": { "type": "keyword" },
381
+ * }
382
+ * }
383
+ * }
384
+ */
385
+ metadataMappings: MetadataMappings;
386
+ /**
387
+ * Default values for metadata.
388
+ *
389
+ * @example
390
+ * {
391
+ * "company.name": "Firebird"
392
+ * }
393
+ */
394
+ defaultMetadata: JSONObject;
395
+ /**
396
+ * Metadata details
397
+ * @example
398
+ * {
399
+ * "extTemp": {
400
+ * "group": "buildingEnv",
401
+ * "locales": {
402
+ * "en": {
403
+ * "friendlyName": "External temperature",
404
+ * "description": "Building external temperature"
405
+ * },
406
+ * "fr": {
407
+ * "friendlyName": "Température extérieure",
408
+ * "description": "Température à l'exterieur du bâtiment"
409
+ * },
410
+ * },
411
+ * "editorHint": {
412
+ * "readOnly": true,
413
+ * "type": EditorHintEnum.OPTION_SELECTOR,
414
+ * "values": ["red", "blue"],
415
+ * "customValueAllowed": true,
416
+ * },
417
+ * },
418
+ * }
419
+ */
420
+ metadataDetails?: MetadataDetails;
421
+ /**
422
+ * Metadata groups list
423
+ * @example
424
+ * {
425
+ * "buildingEnv": {
426
+ * "locales": {
427
+ * "en": {
428
+ * "groupFriendlyName": "Building environment",
429
+ * "description": "The building environment"
430
+ * },
431
+ * "fr": {
432
+ * "groupFriendlyName": "Environnement du bâtiment",
433
+ * "description": "L'environnement du bâtiment"
434
+ * }
435
+ * }
436
+ * }
437
+ * }
438
+ */
439
+ metadataGroups?: MetadataGroups;
440
+ /**
441
+ * List of tooltip models for this asset model
442
+ *
443
+ * @example
444
+ * [
445
+ * "defaultTooltipKey": {
446
+ * "tooltipLabel": "Default tooltip model",
447
+ * "content": [
448
+ * {
449
+ * "metadataPath": "geolocation",
450
+ * "label": {
451
+ * "locales": {
452
+ * "en": {
453
+ * "description": "",
454
+ * "friendlyName": "Container position"
455
+ * },
456
+ * "fr": {
457
+ * "description": "",
458
+ * "friendlyName": "Position du conteneur"
459
+ * }
460
+ * }
461
+ * },
462
+ * "category": "metadata"
463
+ * },
464
+ * {
465
+ * "measureValuePath": "externalTemperature",
466
+ * "measureSlot": "externalTemperature",
467
+ * "label": {
468
+ * "locales": {
469
+ * "en": {
470
+ * "description": "",
471
+ * "friendlyName": "External temperature"
472
+ * },
473
+ * "fr": {
474
+ * "description": "",
475
+ * "friendlyName": "Température extérieure"
476
+ * }
477
+ * }
478
+ * },
479
+ * "category": "measure",
480
+ * "suffix": "°C"
481
+ * }
482
+ * ]
483
+ * }
484
+ * ]
485
+ */
486
+ tooltipModels?: TooltipModels;
487
+ };
488
+ }
489
+ export type ModelContent = MeasureModelContent | AssetModelContent | DeviceModelContent | GroupModelContent;
@@ -1,6 +1,6 @@
1
1
  import { JSONObject } from "kuzzle-sdk";
2
2
  import { Decoder, NamedMeasures } from "../../../modules/decoder";
3
- import { MetadataDetails, MetadataGroups, MetadataMappings, TooltipModels } from "./ModelContent";
3
+ import { LocaleDetails, MetadataDetails, MetadataGroups, MetadataMappings, TooltipModels } from "./ModelContent";
4
4
  /**
5
5
  * Define an asset model
6
6
  *
@@ -94,7 +94,17 @@ import { MetadataDetails, MetadataGroups, MetadataMappings, TooltipModels } from
94
94
  * }
95
95
  * ]
96
96
  * }
97
- * }
97
+ * },
98
+ * locales: {
99
+ * en: {
100
+ * friendlyName: 'Container (translation by model)',
101
+ * description: 'Containerized container',
102
+ * },
103
+ * fr: {
104
+ * friendlyName: 'Conteneur (traduit par model)',
105
+ * description: 'Conteneur conteneurisé',
106
+ * },
107
+ * },
98
108
  * }
99
109
  *
100
110
  */
@@ -123,6 +133,9 @@ export type AssetModelDefinition = {
123
133
  * Tooltip models
124
134
  */
125
135
  tooltipModels?: TooltipModels;
136
+ locales?: {
137
+ [valueName: string]: LocaleDetails;
138
+ };
126
139
  };
127
140
  /**
128
141
  * Define a device model
@@ -196,3 +209,94 @@ export type DeviceModelDefinition = {
196
209
  */
197
210
  metadataGroups?: MetadataGroups;
198
211
  };
212
+ /**
213
+ * Define a group model
214
+ *
215
+ * @example
216
+ * {
217
+ * metadataMappings: {
218
+ * position: { type: "geo_point" },
219
+ * },
220
+ * defaultMetadata: {
221
+ * position: {
222
+ * lat: 41.12,
223
+ * lon: -71.34
224
+ * }
225
+ * },
226
+ * metadataDetails: {
227
+ * "position": {
228
+ * "group": "geolocation",
229
+ * "locales": {
230
+ * "en": {
231
+ * "friendlyName": "Parking position",
232
+ * "description": "The coordinates of the parking"
233
+ * },
234
+ * "fr": {
235
+ * "friendlyName": "Position du parking",
236
+ * "description": "Les coordonnées GPS du parking"
237
+ * }
238
+ * },
239
+ * },
240
+ * },
241
+ * metadataGroups: {
242
+ * geolocation: {
243
+ * locales: {
244
+ * en: {
245
+ * groupFriendlyName: "Parking geolocation",
246
+ * description: "The parking geolocation"
247
+ * },
248
+ * fr: {
249
+ * groupFriendlyName: "Localisation du parking",
250
+ * description: "La localisation du parking"
251
+ * }
252
+ * }
253
+ * }
254
+ * },
255
+ * tooltipModels: {
256
+ * "defaultTooltipKey": {
257
+ * "tooltipLabel": "Default Tooltip Model",
258
+ * "content": [
259
+ * {
260
+ * "category": "metadata",
261
+ * "label": {
262
+ * "locales": {
263
+ * "en": {
264
+ * "friendlyName": "Parking position",
265
+ * "description": ""
266
+ * },
267
+ * "fr": {
268
+ * "friendlyName": "Position du parking",
269
+ * "description": ""
270
+ * }
271
+ * }
272
+ * },
273
+ * "metadataPath": "position"
274
+ * },
275
+ * ]
276
+ * }
277
+ * }
278
+ * }
279
+ *
280
+ */
281
+ export type GroupModelDefinition = {
282
+ /**
283
+ * Metadata mappings definition
284
+ */
285
+ metadataMappings?: MetadataMappings;
286
+ /**
287
+ * Default metadata values
288
+ */
289
+ defaultMetadata?: JSONObject;
290
+ /**
291
+ * Metadata details including tanslations and group.
292
+ */
293
+ metadataDetails?: MetadataDetails;
294
+ /**
295
+ * Metadata groups
296
+ */
297
+ metadataGroups?: MetadataGroups;
298
+ /**
299
+ * Tooltip models
300
+ */
301
+ tooltipModels?: TooltipModels;
302
+ };
@@ -1,4 +1,4 @@
1
- import { AssetModelContent, DeviceModelContent, MeasureModelContent } from "./ModelContent";
1
+ import { AssetModelContent, DeviceModelContent, GroupModelContent, MeasureModelContent } from "./ModelContent";
2
2
  export type AskModelAssetGet = {
3
3
  name: "ask:device-manager:model:asset:get";
4
4
  payload: {
@@ -21,3 +21,10 @@ export type AskModelMeasureGet = {
21
21
  };
22
22
  result: MeasureModelContent;
23
23
  };
24
+ export type AskModelGroupGet = {
25
+ name: "ask:device-manager:model:group:get";
26
+ payload: {
27
+ model: string;
28
+ };
29
+ result: GroupModelContent;
30
+ };
@@ -1,6 +1,6 @@
1
1
  import { Backend, KDocumentContent, Plugin } from "kuzzle";
2
2
  import { AbstractEngine, ConfigManager, EngineContent } from "kuzzle-plugin-commons";
3
- import { AssetModelContent, DeviceModelContent, MeasureModelContent } from "../model";
3
+ import { AssetModelContent, DeviceModelContent, GroupModelContent, MeasureModelContent } from "../model";
4
4
  import { DeviceManagerPlugin } from "./DeviceManagerPlugin";
5
5
  import { DeviceManagerConfiguration } from "./types/DeviceManagerConfiguration";
6
6
  import { InternalCollection } from "./types/InternalCollection";
@@ -18,7 +18,7 @@ export interface EngineDocument extends KDocumentContent {
18
18
  export type AskEngineList = {
19
19
  name: "ask:device-manager:engine:list";
20
20
  payload: {
21
- group: string | null;
21
+ group?: string;
22
22
  };
23
23
  result: EngineContent[];
24
24
  };
@@ -35,6 +35,7 @@ export type AskEngineUpdateConflict = {
35
35
  models: TwinModelContent[];
36
36
  };
37
37
  measuresModels?: MeasureModelContent[];
38
+ groupModels?: GroupModelContent[];
38
39
  };
39
40
  result: ConflictChunk[];
40
41
  };
@@ -54,6 +55,14 @@ export declare class DeviceManagerEngine extends AbstractEngine<DeviceManagerPlu
54
55
  * @returns An array of conflict chunk
55
56
  */
56
57
  private doesTwinUpdateConflicts;
58
+ /**
59
+ * Return conflicts between the new and already present group models
60
+ *
61
+ * @param groupModels The already present group models
62
+ * @param additionalGroups The new or updated group models
63
+ * @returns An array of ConflictChunk
64
+ */
65
+ private doesGroupsUpdateConflicts;
57
66
  /**
58
67
  * Return conflicts between the new and already present measure models
59
68
  *
@@ -98,14 +107,14 @@ export declare class DeviceManagerEngine extends AbstractEngine<DeviceManagerPlu
98
107
  */
99
108
  createAssetsHistoryCollection(engineId: string, engineGroup: string): Promise<InternalCollection>;
100
109
  /**
101
- * Create the assets groups collection with the assets groups mappings in the engine
110
+ * Create the groups collection with the groups mappings in the engine
102
111
  *
103
112
  * @param engineId The target engine Id
104
113
  * @param engineGroup The engine group
105
114
  *
106
- * @throws If it failed during the assets groups collection creation
115
+ * @throws If it failed during the groups collection creation
107
116
  */
108
- createAssetsGroupsCollection(engineId: string): Promise<InternalCollection>;
117
+ createGroupsCollection(engineId: string): Promise<InternalCollection>;
109
118
  /**
110
119
  * Generate devices mappings and create the devices collection in the engine
111
120
  *
@@ -166,6 +175,7 @@ export declare class DeviceManagerEngine extends AbstractEngine<DeviceManagerPlu
166
175
  * @returns The complete ES mappings produced by merging models mappings
167
176
  */
168
177
  private getMeasuresMappings;
178
+ getAssetGroupsMappingFromDB(): Promise<any>;
169
179
  /**
170
180
  * Retrieve a certain type of models associated to an engine
171
181
  *
@@ -175,4 +185,11 @@ export declare class DeviceManagerEngine extends AbstractEngine<DeviceManagerPlu
175
185
  * @returns An array of the generic type provided
176
186
  */
177
187
  private getModels;
188
+ /**
189
+ * Detach all devices of an index in the admin index
190
+ *
191
+ * @param engineId The target engine Id
192
+ * @returns {any}
193
+ */
194
+ private detachDevicesFromAdminIndex;
178
195
  }
@@ -1,7 +1,7 @@
1
1
  import { Plugin, PluginContext } from "kuzzle";
2
2
  import { JSONObject } from "kuzzle-sdk";
3
3
  import { MeasureDefinition } from "../measure";
4
- import { AssetModelDefinition, DeviceModelDefinition } from "../model";
4
+ import { AssetModelDefinition, DeviceModelDefinition, GroupModelDefinition } from "../model";
5
5
  import { DeviceManagerConfiguration } from "./types/DeviceManagerConfiguration";
6
6
  export declare class DeviceManagerPlugin extends Plugin {
7
7
  config: DeviceManagerConfiguration;
@@ -11,6 +11,7 @@ export declare class DeviceManagerPlugin extends Plugin {
11
11
  private engineController;
12
12
  private assetModule;
13
13
  private deviceModule;
14
+ private groupModule;
14
15
  private decoderModule;
15
16
  private measureModule;
16
17
  private modelModule;
@@ -177,6 +178,59 @@ export declare class DeviceManagerPlugin extends Plugin {
177
178
  * ```
178
179
  */
179
180
  registerDevice: (model: string, definition: DeviceModelDefinition) => void;
181
+ /**
182
+ * Register a group.
183
+ *
184
+ * @param model Name of the group model
185
+ * @param definition Object containing the group model definition, including:
186
+ * - metadataMappings: Metadata mappings definition
187
+ * - defaultMetadata: Default metadata values
188
+ * - metadataDetails: Localizations, detailed metadata descriptions and definition
189
+ * - metadataGroups: Groups for organizing metadata, with localizations
190
+ *
191
+ * @example
192
+ * ```
193
+ * deviceManager.models.registerGroup(
194
+ * "Parking",
195
+ * {
196
+ * metadataMappings: {
197
+ * geolocation: { type: "geo_point" },
198
+ * },
199
+ * defaultMetadata: {
200
+ *
201
+ * },
202
+ * metadataDetails: {
203
+ * geolocation: {
204
+ * group: "access",
205
+ * locales: {
206
+ * en: {
207
+ * friendlyName: "Parking location",
208
+ * description: "GPS position of the parking"
209
+ * },
210
+ * fr: {
211
+ * friendlyName: "Emplacement du parking",
212
+ * description: "Position GPS du parking"
213
+ * }
214
+ * }
215
+ * }
216
+ * },
217
+ * metadataGroups: {
218
+ * access: {
219
+ * locales: {
220
+ * en: {
221
+ * groupFriendlyName: "Parking access info"
222
+ * },
223
+ * fr: {
224
+ * groupFriendlyName: "Information d'accès au parking"
225
+ * }
226
+ * }
227
+ * }
228
+ * }
229
+ * }
230
+ * );
231
+ * ```
232
+ */
233
+ registerGroup: (engineGroup: string, model: string, definition: GroupModelDefinition) => void;
180
234
  /**
181
235
  * Register a new measure
182
236
  *
@@ -50,8 +50,9 @@ export type DeviceManagerConfiguration = {
50
50
  mappings: CollectionMappings;
51
51
  settings?: JSONObject;
52
52
  };
53
- assetGroups: {
53
+ groups: {
54
54
  name: string;
55
+ mappings: CollectionMappings;
55
56
  settings?: JSONObject;
56
57
  };
57
58
  assetHistory: {
@@ -1,7 +1,7 @@
1
1
  export declare enum InternalCollection {
2
2
  ASSETS = "assets",
3
3
  ASSETS_HISTORY = "assets-history",
4
- ASSETS_GROUPS = "assets-groups",
4
+ GROUPS = "groups",
5
5
  DEVICES = "devices",
6
6
  MEASURES = "measures",
7
7
  MODELS = "models",
@@ -1 +1,2 @@
1
1
  export * from "./DeviceManagerConfiguration";
2
+ export * from "./Pipes";
@@ -2,8 +2,12 @@ import { JSONObject, KDocumentContent } from "kuzzle-sdk";
2
2
  import { NamedMeasures } from "../../decoder";
3
3
  import { Metadata } from "./Metadata";
4
4
  import { DigitalTwinMeasures } from "./DigitalTwinMeasures";
5
+ import { LocaleDetails } from "lib/modules/model";
5
6
  export interface DigitalTwinContent<TMeasures extends JSONObject = JSONObject, TMetadata extends Metadata = Metadata> extends KDocumentContent {
6
7
  model: string;
8
+ modelLocales?: {
9
+ [locale: string]: LocaleDetails;
10
+ };
7
11
  reference: string;
8
12
  metadata: TMetadata;
9
13
  measures: DigitalTwinMeasures<TMeasures>;
@@ -1,5 +1,5 @@
1
1
  import { MeasureDefinition } from "../../measure";
2
- import { AssetModelDefinition, DeviceModelDefinition } from "../../model";
2
+ import { AssetModelDefinition, DeviceModelDefinition, GroupModelDefinition } from "../../model";
3
3
  interface ModelDefinition<Definition> {
4
4
  /**
5
5
  * Name of model
@@ -14,4 +14,5 @@ interface ModelDefinition<Definition> {
14
14
  export type AssetModel = ModelDefinition<AssetModelDefinition>;
15
15
  export type DeviceModel = ModelDefinition<DeviceModelDefinition>;
16
16
  export type MeasureModel = ModelDefinition<MeasureDefinition>;
17
+ export type GroupModel = ModelDefinition<GroupModelDefinition>;
17
18
  export {};
@@ -0,0 +1,14 @@
1
+ import { GroupContent } from "lib/modules/group/exports";
2
+ import { GroupModel, Metadata } from "lib/modules/shared";
3
+ declare const modelName = "Parking";
4
+ export interface ParkingMetadata extends Metadata {
5
+ geolocation: {
6
+ lat: number;
7
+ lon: number;
8
+ };
9
+ }
10
+ export interface ParkingGroupContent extends GroupContent<ParkingMetadata> {
11
+ model: typeof modelName;
12
+ }
13
+ export declare const Parking: GroupModel;
14
+ export {};
@@ -0,0 +1 @@
1
+ export * from "./Parking";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kuzzle-device-manager-types",
3
- "version": "3.0.0-next.3",
3
+ "version": "3.0.0-next.4",
4
4
  "description": "Shared types for Kuzzle Device Manager",
5
5
  "author": "The Kuzzle Team (support@kuzzle.io)",
6
6
  "main": "index.js",
@@ -1,2 +0,0 @@
1
- import { CollectionMappings } from "kuzzle";
2
- export declare const assetGroupsMappings: CollectionMappings;
@@ -1,9 +0,0 @@
1
- import { KDocumentContent } from "kuzzle-sdk";
2
- export interface AssetsGroupsBody {
3
- name: string;
4
- type: string | null;
5
- children: string[];
6
- parent: string | null;
7
- lastUpdate: number;
8
- }
9
- export type AssetsGroupContent = AssetsGroupsBody & KDocumentContent;
@@ -1,2 +0,0 @@
1
- export * from "./DummyTempDecoder";
2
- export * from "./DummyTempPositionDecoder";