kuzzle-device-manager 3.0.0-3-dev.19 → 3.0.0-3-dev.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/migration/migrate-tenant-classes.d.ts +2 -0
- package/dist/bin/migration/migrate-tenant-classes.js +133 -0
- package/dist/bin/migration/migrate-tenant-classes.js.map +1 -0
- package/dist/lib/modules/asset/AssetHistoryService.d.ts +1 -1
- package/dist/lib/modules/asset/AssetHistoryService.js +3 -3
- package/dist/lib/modules/asset/AssetHistoryService.js.map +1 -1
- package/dist/lib/modules/asset/AssetService.d.ts +12 -12
- package/dist/lib/modules/asset/AssetService.js +72 -72
- package/dist/lib/modules/asset/AssetService.js.map +1 -1
- package/dist/lib/modules/asset/AssetsController.d.ts +1 -1
- package/dist/lib/modules/asset/AssetsController.js +72 -74
- package/dist/lib/modules/asset/AssetsController.js.map +1 -1
- package/dist/lib/modules/asset/types/AssetApi.d.ts +6 -6
- package/dist/lib/modules/asset/types/AssetEvents.d.ts +1 -1
- package/dist/lib/modules/decoder/PayloadService.js +16 -16
- package/dist/lib/modules/decoder/PayloadService.js.map +1 -1
- package/dist/lib/modules/device/DeviceService.d.ts +11 -11
- package/dist/lib/modules/device/DeviceService.js +63 -63
- package/dist/lib/modules/device/DeviceService.js.map +1 -1
- package/dist/lib/modules/device/DevicesController.js +60 -64
- package/dist/lib/modules/device/DevicesController.js.map +1 -1
- package/dist/lib/modules/device/collections/deviceMappings.js +2 -2
- package/dist/lib/modules/device/collections/deviceMappings.js.map +1 -1
- package/dist/lib/modules/device/types/DeviceApi.d.ts +2 -2
- package/dist/lib/modules/device/types/DeviceContent.d.ts +2 -2
- package/dist/lib/modules/device/types/DeviceEvents.d.ts +1 -1
- package/dist/lib/modules/group/GroupsController.d.ts +3 -3
- package/dist/lib/modules/group/GroupsController.js +66 -66
- package/dist/lib/modules/group/GroupsController.js.map +1 -1
- package/dist/lib/modules/group/GroupsService.d.ts +14 -14
- package/dist/lib/modules/group/GroupsService.js +64 -64
- package/dist/lib/modules/group/GroupsService.js.map +1 -1
- package/dist/lib/modules/group/types/GroupsApi.d.ts +1 -1
- package/dist/lib/modules/measure/MeasureExporter.d.ts +5 -5
- package/dist/lib/modules/measure/MeasureExporter.js +20 -20
- package/dist/lib/modules/measure/MeasureExporter.js.map +1 -1
- package/dist/lib/modules/measure/MeasureService.d.ts +2 -2
- package/dist/lib/modules/measure/MeasureService.js +5 -5
- package/dist/lib/modules/measure/MeasureService.js.map +1 -1
- package/dist/lib/modules/measure/MeasureTargetBuilder.d.ts +1 -1
- package/dist/lib/modules/measure/MeasureTargetBuilder.js +2 -2
- package/dist/lib/modules/measure/MeasureTargetBuilder.js.map +1 -1
- package/dist/lib/modules/measure/types/MeasureTarget.d.ts +1 -1
- package/dist/lib/modules/measure/types/MeasureTarget.js +1 -1
- package/dist/lib/modules/measure/types/MeasureTarget.js.map +1 -1
- package/dist/lib/modules/model/ModelSerializer.js +13 -13
- package/dist/lib/modules/model/ModelSerializer.js.map +1 -1
- package/dist/lib/modules/model/ModelService.d.ts +17 -21
- package/dist/lib/modules/model/ModelService.js +85 -101
- package/dist/lib/modules/model/ModelService.js.map +1 -1
- package/dist/lib/modules/model/ModelsController.js +46 -47
- package/dist/lib/modules/model/ModelsController.js.map +1 -1
- package/dist/lib/modules/model/ModelsRegister.d.ts +4 -4
- package/dist/lib/modules/model/ModelsRegister.js +6 -6
- package/dist/lib/modules/model/ModelsRegister.js.map +1 -1
- package/dist/lib/modules/model/collections/modelsMappings.js +8 -1
- package/dist/lib/modules/model/collections/modelsMappings.js.map +1 -1
- package/dist/lib/modules/model/types/ModelApi.d.ts +13 -13
- package/dist/lib/modules/model/types/ModelContent.d.ts +6 -6
- package/dist/lib/modules/model/types/ModelEvents.d.ts +3 -3
- package/dist/lib/modules/plugin/DeviceManagerEngine.d.ts +25 -25
- package/dist/lib/modules/plugin/DeviceManagerEngine.js +79 -79
- package/dist/lib/modules/plugin/DeviceManagerEngine.js.map +1 -1
- package/dist/lib/modules/plugin/DeviceManagerPlugin.d.ts +10 -3
- package/dist/lib/modules/plugin/DeviceManagerPlugin.js +30 -9
- package/dist/lib/modules/plugin/DeviceManagerPlugin.js.map +1 -1
- package/dist/lib/modules/shared/services/AbstractExporter.d.ts +8 -8
- package/dist/lib/modules/shared/services/AbstractExporter.js +9 -9
- package/dist/lib/modules/shared/services/AbstractExporter.js.map +1 -1
- package/dist/lib/modules/shared/services/BaseService.d.ts +7 -7
- package/dist/lib/modules/shared/services/BaseService.js +20 -17
- package/dist/lib/modules/shared/services/BaseService.js.map +1 -1
- package/dist/lib/modules/shared/services/DigitalTwinExporter.d.ts +3 -3
- package/dist/lib/modules/shared/services/DigitalTwinExporter.js +18 -18
- package/dist/lib/modules/shared/services/DigitalTwinExporter.js.map +1 -1
- package/dist/lib/modules/shared/services/DigitalTwinService.d.ts +8 -8
- package/dist/lib/modules/shared/services/DigitalTwinService.js +39 -39
- package/dist/lib/modules/shared/services/DigitalTwinService.js.map +1 -1
- package/dist/lib/modules/shared/types/DigitalTwinApi.d.ts +1 -1
- package/dist/lib/modules/shared/types/DigitalTwinEvents.d.ts +2 -2
- package/package.json +3 -2
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/* eslint-disable no-console */
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
/**
|
|
6
|
+
* Renames the `engineGroups` field of the model documents to `tenantClasses`,
|
|
7
|
+
* then updates every device-manager engine so the tenant collections get the
|
|
8
|
+
* mappings of the migrated models.
|
|
9
|
+
*
|
|
10
|
+
* Run it against a Kuzzle that already runs the new Device Manager version.
|
|
11
|
+
* See doc/3/guides/rename-engine-groups-to-tenant-classes.
|
|
12
|
+
*/
|
|
13
|
+
const kuzzle_sdk_1 = require("kuzzle-sdk");
|
|
14
|
+
const args = {};
|
|
15
|
+
for (const val of process.argv.slice(2)) {
|
|
16
|
+
if (val.startsWith("--")) {
|
|
17
|
+
const [key, ...value] = val.slice(2).split("=");
|
|
18
|
+
args[key] = value.length > 0 ? value.join("=") : true;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function option(name, env, defaultValue) {
|
|
22
|
+
const value = args[name] ?? process.env[env] ?? defaultValue;
|
|
23
|
+
return typeof value === "string" ? value : undefined;
|
|
24
|
+
}
|
|
25
|
+
const host = option("host", "KUZZLE_HOST", "localhost");
|
|
26
|
+
const port = Number(option("port", "KUZZLE_PORT", "7512"));
|
|
27
|
+
const protocol = option("protocol", "KUZZLE_PROTOCOL", "websocket");
|
|
28
|
+
const ssl = args.ssl === true || process.env.KUZZLE_SSL === "true";
|
|
29
|
+
const username = option("username", "KUZZLE_USERNAME");
|
|
30
|
+
const password = option("password", "KUZZLE_PASSWORD");
|
|
31
|
+
const platformIndex = option("platform-index", "PLATFORM_INDEX", "device-manager");
|
|
32
|
+
const dryRun = args["dry-run"] === true;
|
|
33
|
+
const skipEngines = args["skip-engines"] === true;
|
|
34
|
+
const MODELS = "models";
|
|
35
|
+
const CHUNK_SIZE = 200;
|
|
36
|
+
async function connect() {
|
|
37
|
+
const Protocol = protocol === "http" ? kuzzle_sdk_1.Http : kuzzle_sdk_1.WebSocket;
|
|
38
|
+
const sdk = new kuzzle_sdk_1.Kuzzle(new Protocol(host, { port, ssl }));
|
|
39
|
+
await sdk.connect();
|
|
40
|
+
if (username) {
|
|
41
|
+
await sdk.auth.login("local", { password, username });
|
|
42
|
+
}
|
|
43
|
+
return sdk;
|
|
44
|
+
}
|
|
45
|
+
async function assertNewMappings(sdk) {
|
|
46
|
+
const mappings = await sdk.collection.getMapping(platformIndex, MODELS);
|
|
47
|
+
if (!mappings.properties?.tenantClasses) {
|
|
48
|
+
throw new Error(`The "${platformIndex}:${MODELS}" collection has no "tenantClasses" field. ` +
|
|
49
|
+
"Start Kuzzle with the new Device Manager version before running this script.");
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async function fetchLegacyModels(sdk) {
|
|
53
|
+
const documents = [];
|
|
54
|
+
let result = await sdk.document.search(platformIndex, MODELS, { query: { exists: { field: "engineGroups" } } }, { lang: "elasticsearch", scroll: "1m", size: CHUNK_SIZE });
|
|
55
|
+
while (result) {
|
|
56
|
+
documents.push(...result.hits);
|
|
57
|
+
result = await result.next();
|
|
58
|
+
}
|
|
59
|
+
return documents;
|
|
60
|
+
}
|
|
61
|
+
async function migrateModels(sdk) {
|
|
62
|
+
const legacyModels = await fetchLegacyModels(sdk);
|
|
63
|
+
console.info(`${legacyModels.length} model(s) still use "engineGroups"`);
|
|
64
|
+
const documents = legacyModels.map(({ _id, _source }) => {
|
|
65
|
+
const { engineGroups, ...body } = _source;
|
|
66
|
+
delete body._kuzzle_info;
|
|
67
|
+
// A model registered by the application at startup may already have
|
|
68
|
+
// been rewritten with `tenantClasses`: the new value wins.
|
|
69
|
+
body.tenantClasses ?? (body.tenantClasses = engineGroups);
|
|
70
|
+
console.info(` ${_id}: ${JSON.stringify(body.tenantClasses)}`);
|
|
71
|
+
return { _id, body };
|
|
72
|
+
});
|
|
73
|
+
if (dryRun) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
for (let i = 0; i < documents.length; i += CHUNK_SIZE) {
|
|
77
|
+
const { errors } = await sdk.document.mReplace(platformIndex, MODELS, documents.slice(i, i + CHUNK_SIZE), { refresh: "wait_for" });
|
|
78
|
+
if (errors.length > 0) {
|
|
79
|
+
for (const error of errors) {
|
|
80
|
+
console.error(` Cannot migrate ${error.document._id}: ${error.reason}`);
|
|
81
|
+
}
|
|
82
|
+
throw new Error(`${errors.length} model(s) could not be migrated`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
const remaining = await sdk.document.count(platformIndex, MODELS, {
|
|
86
|
+
query: { exists: { field: "engineGroups" } },
|
|
87
|
+
});
|
|
88
|
+
if (remaining > 0) {
|
|
89
|
+
throw new Error(`${remaining} model(s) still use "engineGroups"`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async function updateEngines(sdk) {
|
|
93
|
+
const { result } = await sdk.query({
|
|
94
|
+
action: "list",
|
|
95
|
+
controller: "device-manager/engine",
|
|
96
|
+
});
|
|
97
|
+
const engines = result.engines;
|
|
98
|
+
console.info(`Updating ${engines.length} engine(s)`);
|
|
99
|
+
for (const engine of engines) {
|
|
100
|
+
console.info(` ${engine.index} (${engine.group})`);
|
|
101
|
+
if (dryRun) {
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
await sdk.query({
|
|
105
|
+
action: "update",
|
|
106
|
+
controller: "device-manager/engine",
|
|
107
|
+
group: engine.group,
|
|
108
|
+
index: engine.index,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
async function run() {
|
|
113
|
+
const sdk = await connect();
|
|
114
|
+
try {
|
|
115
|
+
if (dryRun) {
|
|
116
|
+
console.info("Dry run: nothing will be written");
|
|
117
|
+
}
|
|
118
|
+
await assertNewMappings(sdk);
|
|
119
|
+
await migrateModels(sdk);
|
|
120
|
+
if (!skipEngines) {
|
|
121
|
+
await updateEngines(sdk);
|
|
122
|
+
}
|
|
123
|
+
console.info("Done");
|
|
124
|
+
}
|
|
125
|
+
finally {
|
|
126
|
+
sdk.disconnect();
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
run().catch((error) => {
|
|
130
|
+
console.error(error.message ?? error);
|
|
131
|
+
process.exitCode = 1;
|
|
132
|
+
});
|
|
133
|
+
//# sourceMappingURL=migrate-tenant-classes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate-tenant-classes.js","sourceRoot":"","sources":["../../../bin/migration/migrate-tenant-classes.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,5 +5,5 @@ import { KuzzleLogger } from "kuzzle-logger";
|
|
|
5
5
|
export declare class AssetHistoryService extends BaseService {
|
|
6
6
|
readonly logger: KuzzleLogger;
|
|
7
7
|
constructor(plugin: DeviceManagerPlugin, assetLogger: KuzzleLogger);
|
|
8
|
-
add<TAssetHistoryEvent extends AssetHistoryEvent>(
|
|
8
|
+
add<TAssetHistoryEvent extends AssetHistoryEvent>(index: string, histories: AssetHistoryContent[]): Promise<void>;
|
|
9
9
|
}
|
|
@@ -8,9 +8,9 @@ class AssetHistoryService extends shared_1.BaseService {
|
|
|
8
8
|
constructor(plugin, assetLogger) {
|
|
9
9
|
super(plugin);
|
|
10
10
|
this.logger = assetLogger;
|
|
11
|
-
(0, kuzzle_plugin_commons_1.onAsk)("ask:device-manager:asset:history:add", async ({
|
|
11
|
+
(0, kuzzle_plugin_commons_1.onAsk)("ask:device-manager:asset:history:add", async ({ index, histories }) => this.add(index, histories));
|
|
12
12
|
}
|
|
13
|
-
async add(
|
|
13
|
+
async add(index, histories) {
|
|
14
14
|
const contents = [];
|
|
15
15
|
for (const { asset, event, id, timestamp } of histories) {
|
|
16
16
|
contents.push({
|
|
@@ -22,7 +22,7 @@ class AssetHistoryService extends shared_1.BaseService {
|
|
|
22
22
|
},
|
|
23
23
|
});
|
|
24
24
|
}
|
|
25
|
-
await this.sdk.document.mCreate(
|
|
25
|
+
await this.sdk.document.mCreate(index, plugin_1.InternalCollection.ASSETS_HISTORY, contents, { strict: true });
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
exports.AssetHistoryService = AssetHistoryService;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssetHistoryService.js","sourceRoot":"","sources":["../../../../lib/modules/asset/AssetHistoryService.ts"],"names":[],"mappings":";;;AAAA,iEAA8C;AAG9C,sCAAoE;AACpE,sCAAwC;AASxC,MAAa,mBAAoB,SAAQ,oBAAW;IAElD,YAAY,MAA2B,EAAE,WAAyB;QAChE,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC;QAC1B,IAAA,6BAAK,EACH,sCAAsC,EACtC,KAAK,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"AssetHistoryService.js","sourceRoot":"","sources":["../../../../lib/modules/asset/AssetHistoryService.ts"],"names":[],"mappings":";;;AAAA,iEAA8C;AAG9C,sCAAoE;AACpE,sCAAwC;AASxC,MAAa,mBAAoB,SAAQ,oBAAW;IAElD,YAAY,MAA2B,EAAE,WAAyB;QAChE,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC;QAC1B,IAAA,6BAAK,EACH,sCAAsC,EACtC,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAC3D,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,GAAG,CACP,KAAa,EACb,SAAgC;QAEhC,MAAM,QAAQ,GAEV,EAAE,CAAC;QAEP,KAAK,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,SAAS,EAAE,CAAC;YACxD,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE;oBACJ,KAAK;oBACL,KAAK;oBACL,EAAE;oBACF,SAAS;iBACV;aACF,CAAC,CAAC;QACL,CAAC;QAED,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAC7B,KAAK,EACL,2BAAkB,CAAC,cAAc,EACjC,QAAQ,EACR,EAAE,MAAM,EAAE,IAAI,EAAE,CACjB,CAAC;IACJ,CAAC;CACF;AArCD,kDAqCC"}
|
|
@@ -11,35 +11,35 @@ export declare class AssetService extends DigitalTwinService {
|
|
|
11
11
|
readonly logger: KuzzleLogger;
|
|
12
12
|
constructor(plugin: DeviceManagerPlugin, assetHistoryService: AssetHistoryService, assetLogger: KuzzleLogger);
|
|
13
13
|
registerAskEvents(): void;
|
|
14
|
-
get(
|
|
14
|
+
get(index: string, assetId: string, request: KuzzleRequest): Promise<KDocument<AssetContent>>;
|
|
15
15
|
/**
|
|
16
16
|
* Update an asset metadata
|
|
17
17
|
*/
|
|
18
|
-
update(
|
|
18
|
+
update(index: string, assetId: string, metadata: Metadata, request: KuzzleRequest): Promise<KDocument<AssetContent>>;
|
|
19
19
|
/**
|
|
20
20
|
* Replace an asset metadata
|
|
21
21
|
*/
|
|
22
|
-
replaceMetadata(
|
|
22
|
+
replaceMetadata(index: string, assetId: string, metadata: Metadata, request: KuzzleRequest): Promise<KDocument<AssetContent>>;
|
|
23
23
|
/**
|
|
24
24
|
* Update or Create an asset metadata
|
|
25
25
|
*/
|
|
26
|
-
upsert(
|
|
26
|
+
upsert(index: string, model: string, reference: string, metadata: Metadata, request: KuzzleRequest): Promise<KDocument<AssetContent>>;
|
|
27
27
|
private _create;
|
|
28
28
|
/**
|
|
29
29
|
* Create an asset metadata
|
|
30
30
|
*/
|
|
31
|
-
create(
|
|
31
|
+
create(index: string, model: string, reference: string, metadata: JSONObject, request: KuzzleRequest): Promise<KDocument<AssetContent>>;
|
|
32
32
|
/**
|
|
33
33
|
* Delete an asset metadata
|
|
34
34
|
*/
|
|
35
|
-
delete(
|
|
36
|
-
search(
|
|
35
|
+
delete(index: string, assetId: string, request: KuzzleRequest): Promise<void>;
|
|
36
|
+
search(index: string, searchParams: SearchParams, request: KuzzleRequest): Promise<SearchResult<KHit<AssetContent>>>;
|
|
37
37
|
unlinkDevices(assetId: string, allMeasures: boolean, deviceIds: string[], measureSlots: string[], request: KuzzleRequest): Promise<ApiAssetUnlinkDevicesResult>;
|
|
38
|
-
migrateTenant(user: User, assetsList: string[],
|
|
38
|
+
migrateTenant(user: User, assetsList: string[], index: string, newIndex: string, includeDevices: boolean, request: KuzzleRequest): Promise<ApiAssetMigrateTenantResult>;
|
|
39
39
|
/**
|
|
40
40
|
* Replace an asset metadata
|
|
41
41
|
*/
|
|
42
|
-
mReplaceAndHistorize(
|
|
42
|
+
mReplaceAndHistorize(index: string, assets: KDocument<AssetContent>[], removedMetadata: string[], { refresh }: {
|
|
43
43
|
refresh: any;
|
|
44
44
|
}): Promise<mReplaceResponse>;
|
|
45
45
|
/**
|
|
@@ -49,13 +49,13 @@ export declare class AssetService extends DigitalTwinService {
|
|
|
49
49
|
* @param model
|
|
50
50
|
*/
|
|
51
51
|
updateModelLocales(request: KuzzleRequest, model: string): Promise<ApiAssetUpdateModelLocales[]>;
|
|
52
|
-
addMeasureSlot(assetId: string, measureSlot: AssetContent["measureSlots"][0],
|
|
53
|
-
removeMeasureSlot(assetId: string, measureSlotName: string,
|
|
52
|
+
addMeasureSlot(assetId: string, measureSlot: AssetContent["measureSlots"][0], index: string, request: KuzzleRequest): Promise<KDocument<AssetContent>>;
|
|
53
|
+
removeMeasureSlot(assetId: string, measureSlotName: string, index: string, request: KuzzleRequest): Promise<KDocument<AssetContent>>;
|
|
54
54
|
/**
|
|
55
55
|
* Update the display name of a measure slot on an asset
|
|
56
56
|
*/
|
|
57
57
|
updateMeasureSlotDisplayName(assetId: string, measureSlotName: string, displayName: {
|
|
58
58
|
[locale: string]: string;
|
|
59
|
-
},
|
|
59
|
+
}, index: string, request: KuzzleRequest): Promise<KDocument<AssetContent>>;
|
|
60
60
|
private refreshModel;
|
|
61
61
|
}
|
|
@@ -21,27 +21,27 @@ class AssetService extends shared_1.DigitalTwinService {
|
|
|
21
21
|
super.registerAskEvents();
|
|
22
22
|
(0, kuzzle_plugin_commons_1.onAsk)("ask:device-manager:asset:refresh-model", this.refreshModel.bind(this));
|
|
23
23
|
}
|
|
24
|
-
async get(
|
|
24
|
+
async get(index, assetId, request) {
|
|
25
25
|
return this.getDocument(request, assetId, {
|
|
26
26
|
collection: plugin_1.InternalCollection.ASSETS,
|
|
27
|
-
|
|
27
|
+
index,
|
|
28
28
|
});
|
|
29
29
|
}
|
|
30
30
|
/**
|
|
31
31
|
* Update an asset metadata
|
|
32
32
|
*/
|
|
33
|
-
async update(
|
|
34
|
-
return (0, shared_1.lock)(`asset:${
|
|
35
|
-
const asset = await this.get(
|
|
33
|
+
async update(index, assetId, metadata, request) {
|
|
34
|
+
return (0, shared_1.lock)(`asset:${index}:${assetId}`, async () => {
|
|
35
|
+
const asset = await this.get(index, assetId, request);
|
|
36
36
|
const updatedPayload = await this.app.trigger("device-manager:asset:update:before", { asset, metadata });
|
|
37
37
|
const updatedAsset = await this.updateDocument(request, {
|
|
38
38
|
_id: assetId,
|
|
39
39
|
_source: { metadata: updatedPayload.metadata },
|
|
40
40
|
}, {
|
|
41
41
|
collection: plugin_1.InternalCollection.ASSETS,
|
|
42
|
-
|
|
42
|
+
index,
|
|
43
43
|
}, { source: true });
|
|
44
|
-
await this.assetHistoryService.add(
|
|
44
|
+
await this.assetHistoryService.add(index, [
|
|
45
45
|
{
|
|
46
46
|
asset: updatedAsset._source,
|
|
47
47
|
event: {
|
|
@@ -64,9 +64,9 @@ class AssetService extends shared_1.DigitalTwinService {
|
|
|
64
64
|
/**
|
|
65
65
|
* Replace an asset metadata
|
|
66
66
|
*/
|
|
67
|
-
async replaceMetadata(
|
|
68
|
-
return (0, shared_1.lock)(`asset:${
|
|
69
|
-
const asset = await this.get(
|
|
67
|
+
async replaceMetadata(index, assetId, metadata, request) {
|
|
68
|
+
return (0, shared_1.lock)(`asset:${index}:${assetId}`, async () => {
|
|
69
|
+
const asset = await this.get(index, assetId, request);
|
|
70
70
|
const unknownMetadata = {};
|
|
71
71
|
for (const key in metadata) {
|
|
72
72
|
if (key in asset._source.metadata) {
|
|
@@ -79,8 +79,8 @@ class AssetService extends shared_1.DigitalTwinService {
|
|
|
79
79
|
// ? If metadata key is unknown on the asset we check that it exists in the assetModel mappings
|
|
80
80
|
if (Object.keys(unknownMetadata).length > 0) {
|
|
81
81
|
const assetModel = await (0, kuzzle_plugin_commons_1.ask)("ask:device-manager:model:asset:get", {
|
|
82
|
-
|
|
83
|
-
|
|
82
|
+
tenantClasses: [index.split("-")[1]],
|
|
83
|
+
index,
|
|
84
84
|
model: asset._source.model,
|
|
85
85
|
});
|
|
86
86
|
for (const key in unknownMetadata) {
|
|
@@ -90,8 +90,8 @@ class AssetService extends shared_1.DigitalTwinService {
|
|
|
90
90
|
}
|
|
91
91
|
}
|
|
92
92
|
const updatedPayload = await this.app.trigger("device-manager:asset:update:before", { asset, metadata });
|
|
93
|
-
const updatedAsset = await this.sdk.document.replace(
|
|
94
|
-
await this.assetHistoryService.add(
|
|
93
|
+
const updatedAsset = await this.sdk.document.replace(index, plugin_1.InternalCollection.ASSETS, assetId, updatedPayload.asset._source, { triggerEvents: true });
|
|
94
|
+
await this.assetHistoryService.add(index, [
|
|
95
95
|
{
|
|
96
96
|
asset: updatedAsset._source,
|
|
97
97
|
event: {
|
|
@@ -114,12 +114,12 @@ class AssetService extends shared_1.DigitalTwinService {
|
|
|
114
114
|
/**
|
|
115
115
|
* Update or Create an asset metadata
|
|
116
116
|
*/
|
|
117
|
-
async upsert(
|
|
117
|
+
async upsert(index, model, reference, metadata, request) {
|
|
118
118
|
const assetId = AssetSerializer_1.AssetSerializer.id(model, reference);
|
|
119
|
-
return (0, shared_1.lock)(`asset:${
|
|
120
|
-
const asset = await this.get(
|
|
119
|
+
return (0, shared_1.lock)(`asset:${index}:${assetId}`, async () => {
|
|
120
|
+
const asset = await this.get(index, assetId, request).catch(() => null);
|
|
121
121
|
if (!asset) {
|
|
122
|
-
return this._create(assetId,
|
|
122
|
+
return this._create(assetId, index, model, reference, metadata, request);
|
|
123
123
|
}
|
|
124
124
|
const updatedPayload = await this.app.trigger("device-manager:asset:update:before", { asset, metadata });
|
|
125
125
|
const updatedAsset = await this.updateDocument(request, {
|
|
@@ -127,9 +127,9 @@ class AssetService extends shared_1.DigitalTwinService {
|
|
|
127
127
|
_source: { metadata: updatedPayload.metadata },
|
|
128
128
|
}, {
|
|
129
129
|
collection: plugin_1.InternalCollection.ASSETS,
|
|
130
|
-
|
|
130
|
+
index,
|
|
131
131
|
}, { source: true });
|
|
132
|
-
await this.assetHistoryService.add(
|
|
132
|
+
await this.assetHistoryService.add(index, [
|
|
133
133
|
{
|
|
134
134
|
asset: updatedAsset._source,
|
|
135
135
|
event: {
|
|
@@ -149,11 +149,11 @@ class AssetService extends shared_1.DigitalTwinService {
|
|
|
149
149
|
return updatedAsset;
|
|
150
150
|
});
|
|
151
151
|
}
|
|
152
|
-
async _create(assetId,
|
|
153
|
-
const engine = await this.getEngine(
|
|
152
|
+
async _create(assetId, index, model, reference, metadata, request) {
|
|
153
|
+
const engine = await this.getEngine(index);
|
|
154
154
|
const assetModel = await (0, kuzzle_plugin_commons_1.ask)("ask:device-manager:model:asset:get", {
|
|
155
|
-
|
|
156
|
-
|
|
155
|
+
tenantClasses: [engine.group],
|
|
156
|
+
index,
|
|
157
157
|
model,
|
|
158
158
|
});
|
|
159
159
|
const assetMetadata = {};
|
|
@@ -176,9 +176,9 @@ class AssetService extends shared_1.DigitalTwinService {
|
|
|
176
176
|
},
|
|
177
177
|
}, {
|
|
178
178
|
collection: plugin_1.InternalCollection.ASSETS,
|
|
179
|
-
|
|
179
|
+
index,
|
|
180
180
|
});
|
|
181
|
-
await this.assetHistoryService.add(
|
|
181
|
+
await this.assetHistoryService.add(index, [
|
|
182
182
|
{
|
|
183
183
|
asset: asset._source,
|
|
184
184
|
event: {
|
|
@@ -196,17 +196,17 @@ class AssetService extends shared_1.DigitalTwinService {
|
|
|
196
196
|
/**
|
|
197
197
|
* Create an asset metadata
|
|
198
198
|
*/
|
|
199
|
-
async create(
|
|
199
|
+
async create(index, model, reference, metadata, request) {
|
|
200
200
|
const assetId = AssetSerializer_1.AssetSerializer.id(model, reference);
|
|
201
|
-
return (0, shared_1.lock)(`asset:${
|
|
201
|
+
return (0, shared_1.lock)(`asset:${index}:${assetId}`, async () => this._create(assetId, index, model, reference, metadata, request));
|
|
202
202
|
}
|
|
203
203
|
/**
|
|
204
204
|
* Delete an asset metadata
|
|
205
205
|
*/
|
|
206
|
-
async delete(
|
|
206
|
+
async delete(index, assetId, request) {
|
|
207
207
|
const strict = request.getBoolean("strict");
|
|
208
|
-
return (0, shared_1.lock)(`asset:${
|
|
209
|
-
const asset = await this.get(
|
|
208
|
+
return (0, shared_1.lock)(`asset:${index}:${assetId}`, async () => {
|
|
209
|
+
const asset = await this.get(index, assetId, request);
|
|
210
210
|
if (strict && asset._source.linkedMeasures.length !== 0) {
|
|
211
211
|
throw new kuzzle_1.BadRequestError(`Asset "${assetId}" is still linked to devices.`);
|
|
212
212
|
}
|
|
@@ -215,19 +215,19 @@ class AssetService extends shared_1.DigitalTwinService {
|
|
|
215
215
|
}
|
|
216
216
|
await this.deleteDocument(request, assetId, {
|
|
217
217
|
collection: plugin_1.InternalCollection.ASSETS,
|
|
218
|
-
|
|
218
|
+
index,
|
|
219
219
|
});
|
|
220
220
|
});
|
|
221
221
|
}
|
|
222
|
-
async search(
|
|
222
|
+
async search(index, searchParams, request) {
|
|
223
223
|
return this.searchDocument(request, searchParams, {
|
|
224
224
|
collection: plugin_1.InternalCollection.ASSETS,
|
|
225
|
-
|
|
225
|
+
index,
|
|
226
226
|
});
|
|
227
227
|
}
|
|
228
228
|
async unlinkDevices(assetId, allMeasures, deviceIds, measureSlots, request) {
|
|
229
|
-
const
|
|
230
|
-
let asset = await this.get(
|
|
229
|
+
const index = request.getIndex();
|
|
230
|
+
let asset = await this.get(index, assetId, request);
|
|
231
231
|
const devices = [];
|
|
232
232
|
// CASE ALL MEASURES TO UNLINK
|
|
233
233
|
if (allMeasures) {
|
|
@@ -257,26 +257,26 @@ class AssetService extends shared_1.DigitalTwinService {
|
|
|
257
257
|
}
|
|
258
258
|
return { asset, devices };
|
|
259
259
|
}
|
|
260
|
-
async migrateTenant(user, assetsList,
|
|
260
|
+
async migrateTenant(user, assetsList, index, newIndex, includeDevices, request) {
|
|
261
261
|
let errors = [];
|
|
262
262
|
let successes = [];
|
|
263
263
|
//Sanity check
|
|
264
264
|
if (assetsList.length === 0) {
|
|
265
265
|
throw new kuzzle_1.BadRequestError("No assets to migrate");
|
|
266
266
|
}
|
|
267
|
-
await (0, shared_1.lock)(`engine:${
|
|
267
|
+
await (0, shared_1.lock)(`engine:${index}:${newIndex}`, async () => {
|
|
268
268
|
if (!user.profileIds.includes("admin")) {
|
|
269
269
|
throw new kuzzle_1.BadRequestError(`User ${user._id} is not authorized to migrate assets`);
|
|
270
270
|
}
|
|
271
|
-
// check if tenant destination is
|
|
272
|
-
const engine = await this.getEngine(
|
|
273
|
-
const newEngine = await this.getEngine(
|
|
271
|
+
// check if tenant destination is of the same tenant class
|
|
272
|
+
const engine = await this.getEngine(index);
|
|
273
|
+
const newEngine = await this.getEngine(newIndex);
|
|
274
274
|
if (engine.group !== newEngine.group) {
|
|
275
|
-
throw new kuzzle_1.BadRequestError(`Engine ${
|
|
275
|
+
throw new kuzzle_1.BadRequestError(`Engine ${newIndex} is not of the same tenant class as ${index}`);
|
|
276
276
|
}
|
|
277
277
|
//First of all, as mCreate seems to be buggy, ensure some assets don't
|
|
278
278
|
//already exists in the destination tenant
|
|
279
|
-
const assetsCheck = await this.sdk.document.mGet(
|
|
279
|
+
const assetsCheck = await this.sdk.document.mGet(newIndex, plugin_1.InternalCollection.ASSETS, assetsList);
|
|
280
280
|
const assetsCheckedIdExisting = assetsCheck.successes.map((a) => a._id);
|
|
281
281
|
errors = [...assetsCheckedIdExisting];
|
|
282
282
|
//Get all assets to migrate
|
|
@@ -284,7 +284,7 @@ class AssetService extends shared_1.DigitalTwinService {
|
|
|
284
284
|
if (assetsCheckedList.length === 0) {
|
|
285
285
|
throw new kuzzle_1.BadRequestError("All assets to migrate already exists in destination tenant.");
|
|
286
286
|
}
|
|
287
|
-
const assets = await this.sdk.document.mGet(
|
|
287
|
+
const assets = await this.sdk.document.mGet(index, plugin_1.InternalCollection.ASSETS, assetsCheckedList);
|
|
288
288
|
errors = errors.concat(...assets.errors);
|
|
289
289
|
if (assets.successes.length === 0) {
|
|
290
290
|
this.logger.error("No assets found to migrate");
|
|
@@ -303,7 +303,7 @@ class AssetService extends shared_1.DigitalTwinService {
|
|
|
303
303
|
}
|
|
304
304
|
//Even if they exist in the destination tenant, try creating them all
|
|
305
305
|
//using batch
|
|
306
|
-
const assetsCreated = await this.sdk.document.mCreate(
|
|
306
|
+
const assetsCreated = await this.sdk.document.mCreate(newIndex, plugin_1.InternalCollection.ASSETS, assetsContentCopy);
|
|
307
307
|
//We consider here we will return as success what we have been able
|
|
308
308
|
//to create, and related errors
|
|
309
309
|
const assetsCreatedId = assetsCreated.successes.map((a) => a._id);
|
|
@@ -328,11 +328,11 @@ class AssetService extends shared_1.DigitalTwinService {
|
|
|
328
328
|
// ... and attach to new tenant
|
|
329
329
|
await (0, kuzzle_plugin_commons_1.ask)("ask:device-manager:device:attach-engine", {
|
|
330
330
|
deviceId: link.deviceId,
|
|
331
|
-
|
|
331
|
+
index: newIndex,
|
|
332
332
|
user,
|
|
333
333
|
});
|
|
334
334
|
// ... and link this device to the asset in the new tenant
|
|
335
|
-
await this.linkAssetDevice(
|
|
335
|
+
await this.linkAssetDevice(newIndex, link.deviceId, asset._id, link.measureSlots, false, request);
|
|
336
336
|
}
|
|
337
337
|
else {
|
|
338
338
|
await this.unlinkAssetDevice(link.deviceId, asset._id, link.measureSlots, false, request);
|
|
@@ -340,31 +340,31 @@ class AssetService extends shared_1.DigitalTwinService {
|
|
|
340
340
|
}
|
|
341
341
|
}
|
|
342
342
|
// Finally here, we can delete the successefully migrated assets from the source engine !
|
|
343
|
-
await this.sdk.document.mDelete(
|
|
343
|
+
await this.sdk.document.mDelete(index, plugin_1.InternalCollection.ASSETS, assetsCreatedId);
|
|
344
344
|
//Refresh ES indexes and collections
|
|
345
345
|
const collectionsToRefresh = [
|
|
346
346
|
{
|
|
347
347
|
collection: plugin_1.InternalCollection.ASSETS,
|
|
348
|
-
index:
|
|
348
|
+
index: index,
|
|
349
349
|
},
|
|
350
350
|
{
|
|
351
351
|
collection: plugin_1.InternalCollection.DEVICES,
|
|
352
|
-
index:
|
|
352
|
+
index: index,
|
|
353
353
|
},
|
|
354
354
|
{
|
|
355
355
|
collection: plugin_1.InternalCollection.ASSETS,
|
|
356
|
-
index:
|
|
356
|
+
index: newIndex,
|
|
357
357
|
},
|
|
358
358
|
{
|
|
359
359
|
collection: plugin_1.InternalCollection.DEVICES,
|
|
360
|
-
index:
|
|
360
|
+
index: newIndex,
|
|
361
361
|
},
|
|
362
362
|
{
|
|
363
363
|
collection: plugin_1.InternalCollection.DEVICES,
|
|
364
364
|
index: this.config.platformIndex,
|
|
365
365
|
},
|
|
366
|
-
].map((
|
|
367
|
-
return this.sdk.collection.refresh(index, collection);
|
|
366
|
+
].map((target) => {
|
|
367
|
+
return this.sdk.collection.refresh(target.index, target.collection);
|
|
368
368
|
});
|
|
369
369
|
await Promise.all(collectionsToRefresh);
|
|
370
370
|
});
|
|
@@ -373,8 +373,8 @@ class AssetService extends shared_1.DigitalTwinService {
|
|
|
373
373
|
/**
|
|
374
374
|
* Replace an asset metadata
|
|
375
375
|
*/
|
|
376
|
-
async mReplaceAndHistorize(
|
|
377
|
-
const replacedAssets = await this.sdk.document.mReplace(
|
|
376
|
+
async mReplaceAndHistorize(index, assets, removedMetadata, { refresh }) {
|
|
377
|
+
const replacedAssets = await this.sdk.document.mReplace(index, plugin_1.InternalCollection.ASSETS, assets.map((asset) => ({ _id: asset._id, body: asset._source })), { refresh, source: true });
|
|
378
378
|
const histories = replacedAssets.successes.map((asset) => ({
|
|
379
379
|
asset: asset._source,
|
|
380
380
|
event: {
|
|
@@ -386,7 +386,7 @@ class AssetService extends shared_1.DigitalTwinService {
|
|
|
386
386
|
id: asset._id,
|
|
387
387
|
timestamp: Date.now(),
|
|
388
388
|
}));
|
|
389
|
-
await this.assetHistoryService.add(
|
|
389
|
+
await this.assetHistoryService.add(index, histories);
|
|
390
390
|
return replacedAssets;
|
|
391
391
|
}
|
|
392
392
|
/**
|
|
@@ -444,15 +444,15 @@ class AssetService extends shared_1.DigitalTwinService {
|
|
|
444
444
|
}
|
|
445
445
|
return results;
|
|
446
446
|
}
|
|
447
|
-
async addMeasureSlot(assetId, measureSlot,
|
|
448
|
-
const asset = await this.get(
|
|
447
|
+
async addMeasureSlot(assetId, measureSlot, index, request) {
|
|
448
|
+
const asset = await this.get(index, assetId, request);
|
|
449
449
|
if (asset._source.measureSlots.some((slot) => slot.name === measureSlot.name)) {
|
|
450
450
|
throw new kuzzle_1.BadRequestError(`A measure slot with ${measureSlot.name} as a name already exists for ${assetId}`);
|
|
451
451
|
}
|
|
452
452
|
try {
|
|
453
453
|
await (0, kuzzle_plugin_commons_1.ask)("ask:device-manager:model:measure:get", {
|
|
454
454
|
type: measureSlot.type,
|
|
455
|
-
|
|
455
|
+
index,
|
|
456
456
|
});
|
|
457
457
|
}
|
|
458
458
|
catch {
|
|
@@ -461,12 +461,12 @@ class AssetService extends shared_1.DigitalTwinService {
|
|
|
461
461
|
asset._source.measureSlots.push(measureSlot);
|
|
462
462
|
const updatedAsset = await this.updateDocument(request, asset, {
|
|
463
463
|
collection: plugin_1.InternalCollection.ASSETS,
|
|
464
|
-
|
|
464
|
+
index,
|
|
465
465
|
});
|
|
466
466
|
return updatedAsset;
|
|
467
467
|
}
|
|
468
|
-
async removeMeasureSlot(assetId, measureSlotName,
|
|
469
|
-
const asset = await this.get(
|
|
468
|
+
async removeMeasureSlot(assetId, measureSlotName, index, request) {
|
|
469
|
+
const asset = await this.get(index, assetId, request);
|
|
470
470
|
if (!asset._source.measureSlots.some((slot) => slot.name === measureSlotName)) {
|
|
471
471
|
throw new kuzzle_1.BadRequestError(`Asset ${assetId} does not have a measure slot named ${measureSlotName}`);
|
|
472
472
|
}
|
|
@@ -474,8 +474,8 @@ class AssetService extends shared_1.DigitalTwinService {
|
|
|
474
474
|
if (linkedDevice) {
|
|
475
475
|
throw new kuzzle_1.BadRequestError(`Measure slot ${measureSlotName} can not be removed as it is currently linked to ${linkedDevice.deviceId}`);
|
|
476
476
|
}
|
|
477
|
-
const engine = await this.getEngine(
|
|
478
|
-
const assetModel = await this.getAssetModel(engine.group, asset._source.model,
|
|
477
|
+
const engine = await this.getEngine(index);
|
|
478
|
+
const assetModel = await this.getAssetModel(engine.group, asset._source.model, index);
|
|
479
479
|
if (!assetModel) {
|
|
480
480
|
throw new kuzzle_1.NotFoundError(`Model ${asset._source.model} not found`);
|
|
481
481
|
}
|
|
@@ -485,15 +485,15 @@ class AssetService extends shared_1.DigitalTwinService {
|
|
|
485
485
|
asset._source.measureSlots = asset._source.measureSlots.filter((slot) => slot.name !== measureSlotName);
|
|
486
486
|
const updatedAsset = await this.updateDocument(request, asset, {
|
|
487
487
|
collection: plugin_1.InternalCollection.ASSETS,
|
|
488
|
-
|
|
488
|
+
index,
|
|
489
489
|
});
|
|
490
490
|
return updatedAsset;
|
|
491
491
|
}
|
|
492
492
|
/**
|
|
493
493
|
* Update the display name of a measure slot on an asset
|
|
494
494
|
*/
|
|
495
|
-
async updateMeasureSlotDisplayName(assetId, measureSlotName, displayName,
|
|
496
|
-
const asset = await this.get(
|
|
495
|
+
async updateMeasureSlotDisplayName(assetId, measureSlotName, displayName, index, request) {
|
|
496
|
+
const asset = await this.get(index, assetId, request);
|
|
497
497
|
const slot = asset._source.measureSlots.find((s) => s.name === measureSlotName);
|
|
498
498
|
if (!slot) {
|
|
499
499
|
throw new kuzzle_1.BadRequestError(`Asset ${assetId} does not have a measure slot named ${measureSlotName}`);
|
|
@@ -501,16 +501,16 @@ class AssetService extends shared_1.DigitalTwinService {
|
|
|
501
501
|
slot.displayName = displayName;
|
|
502
502
|
const updatedAsset = await this.updateDocument(request, asset, {
|
|
503
503
|
collection: plugin_1.InternalCollection.ASSETS,
|
|
504
|
-
|
|
504
|
+
index,
|
|
505
505
|
});
|
|
506
506
|
return updatedAsset;
|
|
507
507
|
}
|
|
508
508
|
async refreshModel({ assetModel, }) {
|
|
509
|
-
// For
|
|
509
|
+
// For tenant class 'commons', fetch all engines
|
|
510
510
|
const engines = await (0, kuzzle_plugin_commons_1.ask)("ask:device-manager:engine:list", {
|
|
511
|
-
|
|
511
|
+
tenantClass: assetModel.tenantClasses?.includes("commons")
|
|
512
512
|
? null
|
|
513
|
-
: assetModel.
|
|
513
|
+
: assetModel.tenantClasses?.[0],
|
|
514
514
|
});
|
|
515
515
|
const targets = engines.map((engine) => ({
|
|
516
516
|
collections: [plugin_1.InternalCollection.ASSETS],
|