kuzzle-device-manager 2.0.0-rc3 → 2.0.0-rc4
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/lib/DeviceManagerPlugin.d.ts +8 -1
- package/lib/DeviceManagerPlugin.js +35 -9
- package/lib/InternalCollection.d.ts +5 -0
- package/lib/InternalCollection.js +10 -0
- package/lib/controllers/AssetCategoryController.d.ts +28 -0
- package/lib/controllers/AssetCategoryController.js +189 -0
- package/lib/controllers/AssetController.d.ts +35 -7
- package/lib/controllers/AssetController.js +151 -18
- package/lib/controllers/DecodersController.js +1 -1
- package/lib/controllers/DeviceController.d.ts +22 -7
- package/lib/controllers/DeviceController.js +102 -32
- package/lib/controllers/MeasureDefinitionController.d.ts +0 -0
- package/lib/controllers/MeasureDefinitionController.js +1 -0
- package/lib/controllers/MetadataController.d.ts +16 -0
- package/lib/controllers/MetadataController.js +70 -0
- package/lib/controllers/RelationalController.d.ts +155 -0
- package/lib/controllers/RelationalController.js +410 -0
- package/lib/core-classes/AssetCategoryService.d.ts +20 -0
- package/lib/core-classes/AssetCategoryService.js +178 -0
- package/lib/core-classes/AssetService.d.ts +12 -3
- package/lib/core-classes/AssetService.js +18 -3
- package/lib/core-classes/Decoder.d.ts +9 -6
- package/lib/core-classes/Decoder.js +11 -6
- package/lib/core-classes/DeviceManagerEngine.js +10 -0
- package/lib/core-classes/DeviceService.d.ts +64 -47
- package/lib/core-classes/DeviceService.js +157 -97
- package/lib/core-classes/MeasureService.d.ts +77 -0
- package/lib/core-classes/MeasureService.js +302 -0
- package/lib/core-classes/PayloadService.d.ts +13 -45
- package/lib/core-classes/PayloadService.js +12 -157
- package/lib/core-classes/index.d.ts +4 -4
- package/lib/core-classes/index.js +4 -4
- package/lib/core-classes/registers/DecodersRegister.d.ts +4 -2
- package/lib/core-classes/registers/DecodersRegister.js +5 -1
- package/lib/core-classes/registers/MeasuresRegister.d.ts +1 -0
- package/lib/core-classes/registers/MeasuresRegister.js +3 -0
- package/lib/mappings/assetCategoryMappings.d.ts +69 -0
- package/lib/mappings/assetCategoryMappings.js +23 -0
- package/lib/mappings/assetsMappings.d.ts +95 -1
- package/lib/mappings/assetsMappings.js +40 -4
- package/lib/mappings/fieldpathMappings.d.ts +17 -0
- package/lib/mappings/fieldpathMappings.js +21 -0
- package/lib/mappings/genericEmbeddedMapping.d.ts +1 -0
- package/lib/mappings/genericEmbeddedMapping.js +11 -0
- package/lib/mappings/index.d.ts +1 -1
- package/lib/mappings/index.js +1 -1
- package/lib/mappings/measuresMappings.d.ts +54 -25
- package/lib/mappings/measuresMappings.js +48 -24
- package/lib/mappings/metadataMappings.d.ts +149 -0
- package/lib/mappings/metadataMappings.js +64 -0
- package/lib/mappings/payloadsMappings.d.ts +4 -0
- package/lib/mappings/payloadsMappings.js +4 -0
- package/lib/models/BaseAsset.d.ts +10 -1
- package/lib/models/BaseAsset.js +44 -0
- package/lib/models/Device.d.ts +5 -1
- package/lib/models/Device.js +22 -0
- package/lib/types/AssetCategoryContent.d.ts +29 -0
- package/lib/types/AssetCategoryContent.js +3 -0
- package/lib/types/BaseAssetContent.d.ts +37 -5
- package/lib/types/DecodedPayload.d.ts +46 -35
- package/lib/types/DecoderContent.d.ts +2 -1
- package/lib/types/DeviceContent.d.ts +5 -3
- package/lib/types/MetadataContent.d.ts +30 -0
- package/lib/types/MetadataContent.js +15 -0
- package/lib/types/Request.d.ts +26 -0
- package/lib/types/{measures/Measurement.js → Request.js} +1 -1
- package/lib/types/index.d.ts +0 -1
- package/lib/types/index.js +0 -1
- package/lib/types/measures/MeasureContent.d.ts +46 -23
- package/lib/types/measures/MeasureContent.js +9 -0
- package/lib/types/measures/MeasureDefinition.d.ts +12 -12
- package/lib/utils/writeMany.js +3 -1
- package/package.json +4 -4
- package/lib/types/measures/Measurement.d.ts +0 -19
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Plugin, PluginContext, JSONObject } from 'kuzzle';
|
|
1
|
+
import { Plugin, PluginContext, JSONObject, KuzzleRequest } from 'kuzzle';
|
|
2
2
|
import { AssetsRegister, DevicesRegister, MeasuresRegister, DecodersRegister } from './core-classes';
|
|
3
3
|
import { DeviceManagerConfiguration } from './types';
|
|
4
4
|
export declare class DeviceManagerPlugin extends Plugin {
|
|
@@ -7,10 +7,16 @@ export declare class DeviceManagerPlugin extends Plugin {
|
|
|
7
7
|
private deviceController;
|
|
8
8
|
private decodersController;
|
|
9
9
|
private engineController;
|
|
10
|
+
private assetCategoryController;
|
|
11
|
+
private metadataController;
|
|
12
|
+
private treeNodeController;
|
|
13
|
+
private batchController;
|
|
10
14
|
private assetService;
|
|
15
|
+
private assetCategoryService;
|
|
11
16
|
private payloadService;
|
|
12
17
|
private deviceManagerEngine;
|
|
13
18
|
private deviceService;
|
|
19
|
+
private measuresService;
|
|
14
20
|
private decodersRegister;
|
|
15
21
|
private measuresRegister;
|
|
16
22
|
private devicesRegister;
|
|
@@ -45,6 +51,7 @@ export declare class DeviceManagerPlugin extends Plugin {
|
|
|
45
51
|
*/
|
|
46
52
|
get decoders(): DecodersRegister;
|
|
47
53
|
constructor();
|
|
54
|
+
unknowPayload(request: KuzzleRequest): Promise<void>;
|
|
48
55
|
/**
|
|
49
56
|
* Init the plugin
|
|
50
57
|
*/
|
|
@@ -11,6 +11,10 @@ const controllers_1 = require("./controllers");
|
|
|
11
11
|
const core_classes_1 = require("./core-classes");
|
|
12
12
|
const measures_1 = require("./measures");
|
|
13
13
|
const mappings_1 = require("./mappings");
|
|
14
|
+
const AssetCategoryController_1 = require("./controllers/AssetCategoryController");
|
|
15
|
+
const MetadataController_1 = require("./controllers/MetadataController");
|
|
16
|
+
const AssetCategoryService_1 = require("./core-classes/AssetCategoryService");
|
|
17
|
+
const MeasureService_1 = require("./core-classes/MeasureService");
|
|
14
18
|
class DeviceManagerPlugin extends kuzzle_1.Plugin {
|
|
15
19
|
constructor() {
|
|
16
20
|
super({
|
|
@@ -61,6 +65,11 @@ class DeviceManagerPlugin extends kuzzle_1.Plugin {
|
|
|
61
65
|
batchInterval: 10
|
|
62
66
|
};
|
|
63
67
|
/* eslint-enable sort-keys */
|
|
68
|
+
this.measures.register('temperature', measures_1.temperatureMeasure);
|
|
69
|
+
this.measures.register('position', measures_1.positionMeasure);
|
|
70
|
+
this.measures.register('movement', measures_1.movementMeasure);
|
|
71
|
+
this.measures.register('humidity', measures_1.humidityMeasure);
|
|
72
|
+
this.measures.register('battery', measures_1.batteryMeasure);
|
|
64
73
|
}
|
|
65
74
|
get sdk() {
|
|
66
75
|
return this.context.accessors.sdk;
|
|
@@ -99,6 +108,15 @@ class DeviceManagerPlugin extends kuzzle_1.Plugin {
|
|
|
99
108
|
get decoders() {
|
|
100
109
|
return this.decodersRegister;
|
|
101
110
|
}
|
|
111
|
+
async unknowPayload(request) {
|
|
112
|
+
const body = request.getBody();
|
|
113
|
+
const device = request.getString('device');
|
|
114
|
+
const documentContent = {
|
|
115
|
+
deviceModel: device,
|
|
116
|
+
rawPayload: body
|
|
117
|
+
};
|
|
118
|
+
this.sdk.document.create('device-manager', 'payloads', documentContent);
|
|
119
|
+
}
|
|
102
120
|
/**
|
|
103
121
|
* Init the plugin
|
|
104
122
|
*/
|
|
@@ -134,24 +152,32 @@ class DeviceManagerPlugin extends kuzzle_1.Plugin {
|
|
|
134
152
|
mappings: this.config.engineCollections.config.mappings,
|
|
135
153
|
settings: this.config.engineCollections.config.settings,
|
|
136
154
|
});
|
|
137
|
-
this.
|
|
138
|
-
this.
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
this.
|
|
142
|
-
this.
|
|
143
|
-
this.
|
|
144
|
-
this.
|
|
155
|
+
this.assetCategoryService = new AssetCategoryService_1.AssetCategoryService(this);
|
|
156
|
+
this.batchController = new kuzzle_1.BatchController(this.sdk, {
|
|
157
|
+
interval: this.config.batchInterval
|
|
158
|
+
});
|
|
159
|
+
this.assetService = new core_classes_1.AssetService(this, this.batchController);
|
|
160
|
+
this.deviceService = new core_classes_1.DeviceService(this, this.batchController, this.assetService, this.decodersRegister);
|
|
161
|
+
this.measuresService = new MeasureService_1.MeasureService(this, this.batchController, this.deviceService, this.assetService, this.measuresRegister);
|
|
162
|
+
this.payloadService = new core_classes_1.PayloadService(this, this.batchController, this.measuresRegister, this.measuresService);
|
|
145
163
|
this.deviceManagerEngine = new core_classes_1.DeviceManagerEngine(this, this.assetsRegister, this.devicesRegister, this.measuresRegister, this.adminConfigManager, this.engineConfigManager);
|
|
146
164
|
this.decodersRegister.init(this.context);
|
|
147
|
-
this.assetController = new controllers_1.AssetController(this, this.assetService);
|
|
165
|
+
this.assetController = new controllers_1.AssetController(this, this.assetService, this.deviceService, this.assetCategoryService, this.measuresService);
|
|
148
166
|
this.deviceController = new controllers_1.DeviceController(this, this.deviceService);
|
|
149
167
|
this.decodersController = new controllers_1.DecodersController(this, this.decodersRegister);
|
|
150
168
|
this.engineController = new kuzzle_plugin_commons_1.EngineController('device-manager', this, this.deviceManagerEngine);
|
|
169
|
+
this.assetCategoryController = new AssetCategoryController_1.AssetCategoryController(this, this.assetCategoryService);
|
|
170
|
+
this.metadataController = new MetadataController_1.MetadataController(this, this.assetCategoryService);
|
|
151
171
|
this.api['device-manager/payload'] = this.decodersRegister.getPayloadController(this.payloadService);
|
|
152
172
|
this.api['device-manager/asset'] = this.assetController.definition;
|
|
153
173
|
this.api['device-manager/device'] = this.deviceController.definition;
|
|
154
174
|
this.api['device-manager/decoders'] = this.decodersController.definition;
|
|
175
|
+
this.api['device-manager/assetCategory'] = this.assetCategoryController.definition;
|
|
176
|
+
this.api['device-manager/metadata'] = this.metadataController.definition;
|
|
177
|
+
this.api['device-manager/payload'].actions.generic = {
|
|
178
|
+
handler: this.unknowPayload.bind(this),
|
|
179
|
+
http: [{ path: 'device-manager/payload/:device', verb: 'post' }]
|
|
180
|
+
};
|
|
155
181
|
this.hooks = {
|
|
156
182
|
'kuzzle:state:live': async () => {
|
|
157
183
|
await this.decodersRegister.createDefaultRights();
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InternalCollection = void 0;
|
|
4
|
+
var InternalCollection;
|
|
5
|
+
(function (InternalCollection) {
|
|
6
|
+
InternalCollection["ASSETS"] = "assets";
|
|
7
|
+
InternalCollection["DEVICES"] = "devices";
|
|
8
|
+
InternalCollection["MEASURES"] = "measures";
|
|
9
|
+
})(InternalCollection = exports.InternalCollection || (exports.InternalCollection = {}));
|
|
10
|
+
//# sourceMappingURL=InternalCollection.js.map
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { KuzzleRequest, Plugin } from 'kuzzle';
|
|
2
|
+
import { RelationalController } from './RelationalController';
|
|
3
|
+
import { ProcessedAssetCategoryContent } from '../types/AssetCategoryContent';
|
|
4
|
+
import { AssetCategoryService } from '../core-classes/AssetCategoryService';
|
|
5
|
+
export declare class AssetCategoryController extends RelationalController {
|
|
6
|
+
private assetCategoryService;
|
|
7
|
+
constructor(plugin: Plugin, assetCategoryService: AssetCategoryService);
|
|
8
|
+
create(request: KuzzleRequest): Promise<import("kuzzle").KDocument<{
|
|
9
|
+
[x: string]: any;
|
|
10
|
+
}>>;
|
|
11
|
+
update(request: KuzzleRequest): Promise<import("kuzzle").KDocument<{
|
|
12
|
+
[x: string]: any;
|
|
13
|
+
}>>;
|
|
14
|
+
delete(request: KuzzleRequest): Promise<string>;
|
|
15
|
+
linkParent(request: KuzzleRequest): Promise<import("kuzzle").KDocument<{
|
|
16
|
+
[x: string]: any;
|
|
17
|
+
}>>;
|
|
18
|
+
unlinkParent(request: KuzzleRequest): Promise<import("kuzzle").KDocument<{
|
|
19
|
+
[x: string]: any;
|
|
20
|
+
}>>;
|
|
21
|
+
unlinkMetadata(request: KuzzleRequest): Promise<import("kuzzle").KDocument<{
|
|
22
|
+
[x: string]: any;
|
|
23
|
+
}>>;
|
|
24
|
+
linkMetadata(request: KuzzleRequest): Promise<import("kuzzle").KDocument<{
|
|
25
|
+
[x: string]: any;
|
|
26
|
+
}>>;
|
|
27
|
+
get(request: KuzzleRequest): Promise<ProcessedAssetCategoryContent>;
|
|
28
|
+
}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AssetCategoryController = void 0;
|
|
4
|
+
const RelationalController_1 = require("./RelationalController");
|
|
5
|
+
class AssetCategoryController extends RelationalController_1.RelationalController {
|
|
6
|
+
constructor(plugin, assetCategoryService) {
|
|
7
|
+
super(plugin, 'asset-category');
|
|
8
|
+
this.assetCategoryService = assetCategoryService;
|
|
9
|
+
global.app.errors.register('device-manager', 'relational_controller', 'forbidden_parent', {
|
|
10
|
+
class: 'BadRequestError',
|
|
11
|
+
description: 'you can\'t have a parent that is a subcategory',
|
|
12
|
+
message: 'you can\'t have a parent that is a subcategory',
|
|
13
|
+
});
|
|
14
|
+
/* eslint-disable sort-keys */
|
|
15
|
+
this.definition = {
|
|
16
|
+
actions: {
|
|
17
|
+
get: {
|
|
18
|
+
handler: this.get.bind(this),
|
|
19
|
+
http: [{ path: 'device-manager/:engineId/assetCategory/:_id', verb: 'get' }],
|
|
20
|
+
},
|
|
21
|
+
create: {
|
|
22
|
+
handler: this.create.bind(this),
|
|
23
|
+
http: [{ path: 'device-manager/:engineId/assetCategory', verb: 'post' }],
|
|
24
|
+
},
|
|
25
|
+
delete: {
|
|
26
|
+
handler: this.delete.bind(this),
|
|
27
|
+
http: [{ path: 'device-manager/:engineId/assetCategory/:_id', verb: 'delete' }],
|
|
28
|
+
},
|
|
29
|
+
update: {
|
|
30
|
+
handler: this.update.bind(this),
|
|
31
|
+
http: [{ path: 'device-manager/:engineId/assetCategory/:_id', verb: 'put' }],
|
|
32
|
+
},
|
|
33
|
+
linkMetadata: {
|
|
34
|
+
handler: this.linkMetadata.bind(this),
|
|
35
|
+
http: [{ path: 'device-manager/:engineId/assetCategory/:_id/_link/metadata/:metadataId', verb: 'put' }],
|
|
36
|
+
},
|
|
37
|
+
unlinkMetadata: {
|
|
38
|
+
handler: this.unlinkMetadata.bind(this),
|
|
39
|
+
http: [{ path: 'device-manager/:engineId/assetCategory/:_id/_unlink/metadata/:metadataId', verb: 'delete' }],
|
|
40
|
+
},
|
|
41
|
+
linkParent: {
|
|
42
|
+
handler: this.linkParent.bind(this),
|
|
43
|
+
http: [{ path: 'device-manager/:engineId/assetCategory/:_id/_link/parent/:parentId', verb: 'put' }],
|
|
44
|
+
},
|
|
45
|
+
unlinkParent: {
|
|
46
|
+
handler: this.unlinkParent.bind(this),
|
|
47
|
+
http: [{ path: 'device-manager/:engineId/assetCategory/:_id/_unlink/parent/:parentId', verb: 'delete' }],
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
async create(request) {
|
|
53
|
+
request.input.resource._id = request.input.body.name;
|
|
54
|
+
let metadataValues = request.input.body.metadataValues;
|
|
55
|
+
let assetMetadata = request.input.body.assetMetadata;
|
|
56
|
+
if (!assetMetadata) {
|
|
57
|
+
request.input.body.assetMetadata = [];
|
|
58
|
+
}
|
|
59
|
+
if (!metadataValues) {
|
|
60
|
+
request.input.body.metadataValues = [];
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
const metadataValuesTable = [];
|
|
64
|
+
for (const [key, value] of Object.entries(metadataValues)) {
|
|
65
|
+
metadataValuesTable.push({ key, value });
|
|
66
|
+
}
|
|
67
|
+
request.input.body.metadataValues = metadataValuesTable;
|
|
68
|
+
}
|
|
69
|
+
return super.create(request);
|
|
70
|
+
}
|
|
71
|
+
async update(request) {
|
|
72
|
+
const id = request.getId();
|
|
73
|
+
const engineId = request.getString('engineId');
|
|
74
|
+
const assetMetadata = request.input.body.assetMetadata;
|
|
75
|
+
if (assetMetadata) {
|
|
76
|
+
//if elemets are removed in assetMetadata, we need to also remove the values associated in metadataValues
|
|
77
|
+
if (!request.input.body.metadataValues) {
|
|
78
|
+
const document = await this.sdk.document.get(engineId, this.collection, id);
|
|
79
|
+
request.input.body.metadataValues = document._source.metadataValues;
|
|
80
|
+
}
|
|
81
|
+
let index = 0;
|
|
82
|
+
const metadataValues = request.input.body.metadataValues;
|
|
83
|
+
for (const values of metadataValues) {
|
|
84
|
+
if (!assetMetadata.includes(values.key)) {
|
|
85
|
+
metadataValues.splice(index);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
index++;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return super.genericUpdate(request);
|
|
93
|
+
}
|
|
94
|
+
async delete(request) {
|
|
95
|
+
const linkedAsset = this.getFieldPath(request, 'category', null, 'assets');
|
|
96
|
+
const children = this.getFieldPath(request, 'parent');
|
|
97
|
+
return super.genericDelete(request, [], [], [linkedAsset, children]);
|
|
98
|
+
}
|
|
99
|
+
async linkParent(request) {
|
|
100
|
+
const parent = request.getString('parentId');
|
|
101
|
+
const document = await this.sdk.document.get(request.getString('engineId'), 'asset-category', parent);
|
|
102
|
+
if (document._source.parentId) {
|
|
103
|
+
throw global.app.errors.get('device-manager', 'asset_controller', 'forbidden_parent');
|
|
104
|
+
}
|
|
105
|
+
request.input.body = {
|
|
106
|
+
parent
|
|
107
|
+
};
|
|
108
|
+
return this.update(request);
|
|
109
|
+
}
|
|
110
|
+
async unlinkParent(request) {
|
|
111
|
+
request.input.body = {
|
|
112
|
+
'parent': null
|
|
113
|
+
};
|
|
114
|
+
return this.update(request);
|
|
115
|
+
}
|
|
116
|
+
async unlinkMetadata(request) {
|
|
117
|
+
const id = request.getId();
|
|
118
|
+
const engineId = request.getString('engineId');
|
|
119
|
+
const metadataId = request.getString('metadataId');
|
|
120
|
+
const category = await this.sdk.document.get(engineId, 'asset-category', id);
|
|
121
|
+
const updatedMetadata = category._source.assetMetadata.filter(ownedMetadataId => ownedMetadataId !== metadataId);
|
|
122
|
+
request.input.body = {
|
|
123
|
+
assetMetadata: updatedMetadata
|
|
124
|
+
};
|
|
125
|
+
return this.update(request);
|
|
126
|
+
}
|
|
127
|
+
async linkMetadata(request) {
|
|
128
|
+
const id = request.getId();
|
|
129
|
+
const engineId = request.getString('engineId');
|
|
130
|
+
const metadataId = request.getString('metadataId');
|
|
131
|
+
const value = request.input.body?.value;
|
|
132
|
+
const [metadataContent, category] = await Promise.all([
|
|
133
|
+
await this.sdk.document.get(engineId, 'metadata', metadataId),
|
|
134
|
+
await this.sdk.document.get(engineId, 'asset-category', id)
|
|
135
|
+
]);
|
|
136
|
+
const metadata = category._source.assetMetadata ? category._source.assetMetadata : [];
|
|
137
|
+
let metadataValues = category._source.metadataValues;
|
|
138
|
+
if (metadata.includes(metadataId)) {
|
|
139
|
+
throw global.app.errors.get('device-manager', 'relational_controller', 'link_already_exist');
|
|
140
|
+
}
|
|
141
|
+
metadata.push(metadataId);
|
|
142
|
+
request.input.body = {
|
|
143
|
+
assetMetadata: metadata
|
|
144
|
+
};
|
|
145
|
+
let update = false;
|
|
146
|
+
if (value) {
|
|
147
|
+
this.assetCategoryService.validateEnumMetadata(metadataContent._source, value);
|
|
148
|
+
const formattedValue = this.assetCategoryService.formatValue(value);
|
|
149
|
+
if (metadataValues) {
|
|
150
|
+
for (const metadataValue of metadataValues) {
|
|
151
|
+
if (metadataValue.key === metadataId) {
|
|
152
|
+
metadataValue.value = formattedValue;
|
|
153
|
+
update = true;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
metadataValues = [];
|
|
159
|
+
}
|
|
160
|
+
if (!update) {
|
|
161
|
+
metadataValues.push({ key: metadataId, value: formattedValue });
|
|
162
|
+
}
|
|
163
|
+
request.input.body.metadataValues = metadataValues;
|
|
164
|
+
}
|
|
165
|
+
return this.update(request);
|
|
166
|
+
}
|
|
167
|
+
async get(request) {
|
|
168
|
+
const id = request.getId();
|
|
169
|
+
const engineId = request.getString('engineId');
|
|
170
|
+
const category = await this.sdk.document.get(engineId, 'asset-category', id);
|
|
171
|
+
const categorySource = category._source;
|
|
172
|
+
const [assetMetadata, metadataValues] = await Promise.all([
|
|
173
|
+
this.assetCategoryService.getMetadata(categorySource, engineId),
|
|
174
|
+
this.assetCategoryService.getMetadataValues(categorySource, engineId)
|
|
175
|
+
]);
|
|
176
|
+
const formattedAssetMetadata = this.assetCategoryService.formatMetadataForGet(metadataValues);
|
|
177
|
+
const children = this.getFieldPath(request, 'parent');
|
|
178
|
+
const processedCategory = await this.genericGet(engineId, this.collection, id, [children]);
|
|
179
|
+
const processedAssetCategoryContent = {
|
|
180
|
+
name: categorySource.name,
|
|
181
|
+
parent: processedCategory._source.parent,
|
|
182
|
+
assetMetadata,
|
|
183
|
+
metadataValues: formattedAssetMetadata
|
|
184
|
+
};
|
|
185
|
+
return processedAssetCategoryContent;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
exports.AssetCategoryController = AssetCategoryController;
|
|
189
|
+
//# sourceMappingURL=AssetCategoryController.js.map
|
|
@@ -1,13 +1,41 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { AssetService } from '../core-classes';
|
|
4
|
-
|
|
1
|
+
import { JSONObject, KuzzleRequest, Plugin } from 'kuzzle';
|
|
2
|
+
import { BaseAsset } from '../models/BaseAsset';
|
|
3
|
+
import { AssetService, DeviceService } from '../core-classes';
|
|
4
|
+
import { AssetCategoryService } from '../core-classes/AssetCategoryService';
|
|
5
|
+
import { RelationalController } from './RelationalController';
|
|
6
|
+
import { MeasureService } from 'lib/core-classes/MeasureService';
|
|
7
|
+
export declare class AssetController extends RelationalController {
|
|
5
8
|
private assetService;
|
|
6
|
-
private
|
|
7
|
-
|
|
8
|
-
|
|
9
|
+
private deviceService;
|
|
10
|
+
private assetCategoryService;
|
|
11
|
+
private measureService;
|
|
12
|
+
constructor(plugin: Plugin, assetService: AssetService, deviceService: DeviceService, assetCategoryService: AssetCategoryService, measureService: MeasureService);
|
|
13
|
+
mRemoveMeasures(request: KuzzleRequest): Promise<{
|
|
14
|
+
notFound: string[];
|
|
15
|
+
removed: any[];
|
|
16
|
+
asset: BaseAsset;
|
|
17
|
+
}>;
|
|
18
|
+
removeMeasure(request: KuzzleRequest): Promise<{
|
|
19
|
+
notFound: string[];
|
|
20
|
+
removed: any[];
|
|
21
|
+
asset: BaseAsset;
|
|
22
|
+
}>;
|
|
23
|
+
getMeasures(request: KuzzleRequest): Promise<{
|
|
9
24
|
measures: import("kuzzle").KDocument<import("../types").MeasureContent>[];
|
|
10
25
|
}>;
|
|
26
|
+
get(request: KuzzleRequest): Promise<JSONObject>;
|
|
27
|
+
unlinkCategory(request: KuzzleRequest): Promise<import("kuzzle").KDocument<{
|
|
28
|
+
[x: string]: any;
|
|
29
|
+
}>>;
|
|
30
|
+
linkCategory(request: KuzzleRequest): Promise<import("kuzzle").KDocument<{
|
|
31
|
+
[x: string]: any;
|
|
32
|
+
}>>;
|
|
33
|
+
pushMeasures(request: KuzzleRequest): Promise<{
|
|
34
|
+
asset: JSONObject | (() => JSONObject);
|
|
35
|
+
engineId: string;
|
|
36
|
+
invalids: JSONObject[];
|
|
37
|
+
valids: any[] | import("../types").MeasureContent[];
|
|
38
|
+
}>;
|
|
11
39
|
update(request: KuzzleRequest): Promise<import("kuzzle").KDocument<{
|
|
12
40
|
[x: string]: any;
|
|
13
41
|
}>>;
|
|
@@ -5,51 +5,98 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.AssetController = void 0;
|
|
7
7
|
const csvtojson_1 = __importDefault(require("csvtojson"));
|
|
8
|
-
const kuzzle_plugin_commons_1 = require("kuzzle-plugin-commons");
|
|
9
8
|
const kuzzle_1 = require("kuzzle");
|
|
10
9
|
const BaseAsset_1 = require("../models/BaseAsset");
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
const RelationalController_1 = require("./RelationalController");
|
|
11
|
+
class AssetController extends RelationalController_1.RelationalController {
|
|
12
|
+
constructor(plugin, assetService, deviceService, assetCategoryService, measureService) {
|
|
13
13
|
super(plugin, 'assets');
|
|
14
|
+
global.app.errors.register('device-manager', 'asset_controller', 'mandatory_metadata', {
|
|
15
|
+
class: 'BadRequestError',
|
|
16
|
+
description: 'Metadata which are specified in AssetCategory as mandatory must be present',
|
|
17
|
+
message: 'metadata %s is mandatory for the asset',
|
|
18
|
+
});
|
|
19
|
+
global.app.errors.register('device-manager', 'asset_controller', 'enum_metadata', {
|
|
20
|
+
class: 'BadRequestError',
|
|
21
|
+
description: 'Metadata must have one of the values specified in metadata valueList',
|
|
22
|
+
message: 'metadata %s cannot have %s value : value must have one of the value of metadata valueList ',
|
|
23
|
+
});
|
|
24
|
+
this.assetCategoryService = assetCategoryService;
|
|
14
25
|
this.assetService = assetService;
|
|
26
|
+
this.deviceService = deviceService;
|
|
27
|
+
this.measureService = measureService;
|
|
15
28
|
/* eslint-disable sort-keys */
|
|
16
29
|
this.definition = {
|
|
17
30
|
actions: {
|
|
18
31
|
create: {
|
|
19
32
|
handler: this.create.bind(this),
|
|
20
|
-
http: [{ path: 'device-manager/:
|
|
33
|
+
http: [{ path: 'device-manager/:engineId/assets', verb: 'post' }],
|
|
21
34
|
},
|
|
22
35
|
delete: {
|
|
23
36
|
handler: this.delete.bind(this),
|
|
24
|
-
http: [{ path: 'device-manager/:
|
|
37
|
+
http: [{ path: 'device-manager/:engineId/assets/:_id', verb: 'delete' }],
|
|
38
|
+
},
|
|
39
|
+
get: {
|
|
40
|
+
handler: this.get.bind(this),
|
|
41
|
+
http: [{ path: 'device-manager/:engineId/assets/:_id', verb: 'get' }],
|
|
25
42
|
},
|
|
26
43
|
importAssets: {
|
|
27
44
|
handler: this.importAssets.bind(this),
|
|
28
|
-
http: [{ path: 'device-manager/:
|
|
45
|
+
http: [{ path: 'device-manager/:engineId/assets/_import', verb: 'post' }]
|
|
29
46
|
},
|
|
30
47
|
search: {
|
|
31
48
|
handler: this.search.bind(this),
|
|
32
49
|
http: [
|
|
33
|
-
{ path: 'device-manager/:
|
|
34
|
-
{ path: 'device-manager/:
|
|
50
|
+
{ path: 'device-manager/:engineId/assets/_search', verb: 'post' },
|
|
51
|
+
{ path: 'device-manager/:engineId/assets/_search', verb: 'get' },
|
|
35
52
|
],
|
|
36
53
|
},
|
|
37
54
|
update: {
|
|
38
55
|
handler: this.update.bind(this),
|
|
39
|
-
http: [{ path: 'device-manager/:
|
|
56
|
+
http: [{ path: 'device-manager/:engineId/assets/:_id', verb: 'put' }],
|
|
57
|
+
},
|
|
58
|
+
getMeasures: {
|
|
59
|
+
handler: this.getMeasures.bind(this),
|
|
60
|
+
http: [{ path: 'device-manager/:engineId/assets/:_id/measures', verb: 'get' }],
|
|
61
|
+
},
|
|
62
|
+
linkCategory: {
|
|
63
|
+
handler: this.linkCategory.bind(this),
|
|
64
|
+
http: [{ path: 'device-manager/:engineId/assets/:_id/_link/category/:categoryId', verb: 'put' }],
|
|
65
|
+
},
|
|
66
|
+
unlinkCategory: {
|
|
67
|
+
handler: this.unlinkCategory.bind(this),
|
|
68
|
+
http: [{ path: 'device-manager/:engineId/assets/:_id/_unlink/category/:categoryId', verb: 'delete' }],
|
|
69
|
+
},
|
|
70
|
+
pushMeasures: {
|
|
71
|
+
handler: this.pushMeasures.bind(this),
|
|
72
|
+
http: [{ path: 'device-manager/:engineId/assets/:_id/measures', verb: 'post' }],
|
|
73
|
+
},
|
|
74
|
+
removeMeasure: {
|
|
75
|
+
handler: this.removeMeasure.bind(this),
|
|
76
|
+
http: [{ path: 'device-manager/:engineId/assets/:_id/measures/:assetMeasureName', verb: 'delete' }],
|
|
77
|
+
},
|
|
78
|
+
mRemoveMeasures: {
|
|
79
|
+
handler: this.mRemoveMeasures.bind(this),
|
|
80
|
+
http: [{ path: 'device-manager/:engineId/assets/:_id/measures', verb: 'delete' }],
|
|
40
81
|
},
|
|
41
|
-
measures: {
|
|
42
|
-
handler: this.measures.bind(this),
|
|
43
|
-
http: [{ path: 'device-manager/:index/assets/:_id/measures', verb: 'get' }],
|
|
44
|
-
}
|
|
45
82
|
},
|
|
46
83
|
};
|
|
47
84
|
/* eslint-enable sort-keys */
|
|
48
85
|
}
|
|
49
|
-
|
|
50
|
-
|
|
86
|
+
async mRemoveMeasures(request) {
|
|
87
|
+
const id = request.getId();
|
|
88
|
+
const strict = request.getBoolean('strict');
|
|
89
|
+
const engineId = request.getString('engineId');
|
|
90
|
+
const assetMeasureNames = request.getBodyArray('assetMeasureNames');
|
|
91
|
+
return this.assetService.removeMeasures(engineId, id, assetMeasureNames, { strict });
|
|
51
92
|
}
|
|
52
|
-
async
|
|
93
|
+
async removeMeasure(request) {
|
|
94
|
+
const id = request.getId();
|
|
95
|
+
const engineId = request.getString('engineId');
|
|
96
|
+
const assetMeasureName = request.getString('assetMeasureName');
|
|
97
|
+
return this.assetService.removeMeasures(engineId, id, [assetMeasureName], { strict: true });
|
|
98
|
+
}
|
|
99
|
+
async getMeasures(request) {
|
|
53
100
|
const id = request.getId();
|
|
54
101
|
const engineId = request.getString('engineId');
|
|
55
102
|
const size = request.input.args.size;
|
|
@@ -61,11 +108,69 @@ class AssetController extends kuzzle_plugin_commons_1.CRUDController {
|
|
|
61
108
|
const measures = await this.assetService.measureHistory(engineId, id, { endAt, size, startAt });
|
|
62
109
|
return { measures };
|
|
63
110
|
}
|
|
111
|
+
async get(request) {
|
|
112
|
+
const id = request.getId();
|
|
113
|
+
const engineId = request.getString('engineId');
|
|
114
|
+
const category = this.getFieldPath(request, 'category', null, 'asset-category');
|
|
115
|
+
const document = await this.genericGet(engineId, this.collection, id, [category]);
|
|
116
|
+
const metadata = document._source.metadata;
|
|
117
|
+
const asset = document._source;
|
|
118
|
+
if (metadata) {
|
|
119
|
+
asset.metadata = await this.assetCategoryService.formatMetadataForGet(metadata);
|
|
120
|
+
}
|
|
121
|
+
return asset;
|
|
122
|
+
}
|
|
123
|
+
async unlinkCategory(request) {
|
|
124
|
+
const id = request.getId();
|
|
125
|
+
const engineId = request.getString('engineId');
|
|
126
|
+
const categoryId = request.getString('categoryId');
|
|
127
|
+
const document = await this.sdk.document.get(engineId, this.collection, id);
|
|
128
|
+
if (document._source.category !== categoryId && document._source.subCategory !== categoryId) {
|
|
129
|
+
throw global.app.errors.get('device-manager', 'relational_controller', 'remove_unexisting_link');
|
|
130
|
+
}
|
|
131
|
+
request.input.body = { category: null, subCategory: null };
|
|
132
|
+
return this.update(request);
|
|
133
|
+
}
|
|
134
|
+
async linkCategory(request) {
|
|
135
|
+
const id = request.getId();
|
|
136
|
+
const engineId = request.getString('engineId');
|
|
137
|
+
const categoryId = request.getString('categoryId');
|
|
138
|
+
const document = await this.sdk.document.get(engineId, this.collection, id);
|
|
139
|
+
const categoryDocument = await this.sdk.document.get(engineId, 'asset-category', categoryId);
|
|
140
|
+
const updateRequest = {
|
|
141
|
+
category: null,
|
|
142
|
+
subCategory: null
|
|
143
|
+
};
|
|
144
|
+
if (document._source.category) {
|
|
145
|
+
throw global.app.errors.get('device-manager', 'relational_controller', 'already_linked', 'asset', 'category');
|
|
146
|
+
}
|
|
147
|
+
else if (categoryDocument._source.parent) {
|
|
148
|
+
updateRequest.category = categoryDocument._source.parent;
|
|
149
|
+
updateRequest.subCategory = request.getString('categoryId');
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
updateRequest.category = request.getString('categoryId');
|
|
153
|
+
}
|
|
154
|
+
request.input.body = updateRequest;
|
|
155
|
+
return this.update(request);
|
|
156
|
+
}
|
|
157
|
+
async pushMeasures(request) {
|
|
158
|
+
const engineId = request.getString('engineId');
|
|
159
|
+
const assetId = request.getId();
|
|
160
|
+
const refresh = request.getRefresh();
|
|
161
|
+
const strict = request.getBoolean('strict');
|
|
162
|
+
const measures = request.getBodyArray('measures');
|
|
163
|
+
const kuid = request.getKuid();
|
|
164
|
+
const { asset, invalids, valids } = await this.measureService.registerByAsset(engineId, assetId, measures, kuid, { refresh, strict });
|
|
165
|
+
return { asset, engineId, invalids, valids };
|
|
166
|
+
}
|
|
64
167
|
async update(request) {
|
|
65
168
|
const id = request.getId();
|
|
66
169
|
const engineId = request.getString('engineId');
|
|
67
170
|
const body = request.getBody();
|
|
68
171
|
const asset = await this.sdk.document.get(engineId, this.collection, id);
|
|
172
|
+
let assetMetadata = request.input.body.metadata;
|
|
173
|
+
request.input.body.metadata = await this.assetCategoryService.formatMetadataForES(assetMetadata);
|
|
69
174
|
const response = await global.app.trigger('device-manager:asset:update:before', {
|
|
70
175
|
asset,
|
|
71
176
|
updates: body
|
|
@@ -80,13 +185,30 @@ class AssetController extends kuzzle_plugin_commons_1.CRUDController {
|
|
|
80
185
|
return result;
|
|
81
186
|
}
|
|
82
187
|
async create(request) {
|
|
188
|
+
const engineId = request.getString('engineId');
|
|
83
189
|
const type = request.getBodyString('type');
|
|
84
190
|
const model = request.getBodyString('model');
|
|
85
191
|
const reference = request.getBodyString('reference');
|
|
192
|
+
const category = request.getBody().category;
|
|
193
|
+
let assetMetadata = request.getBodyObject('metadata', {});
|
|
194
|
+
if (category) {
|
|
195
|
+
await this.assetCategoryService.validateMetadata(assetMetadata, engineId, category);
|
|
196
|
+
const assetCategory = await this.sdk.document.get(engineId, 'asset-category', category);
|
|
197
|
+
const values = await this.assetCategoryService.getMetadataValues(assetCategory._source, engineId);
|
|
198
|
+
request.input.body.metadata = await this.assetCategoryService.formatMetadataForES(assetMetadata);
|
|
199
|
+
request.input.body.metadata = request.input.body.metadata.concat(values);
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
request.input.body.metadata = await this.assetCategoryService.formatMetadataForES(assetMetadata);
|
|
203
|
+
request.input.body.category = null;
|
|
204
|
+
}
|
|
86
205
|
if (!request.input.args._id) {
|
|
87
206
|
request.input.args._id = BaseAsset_1.BaseAsset.id(type, model, reference);
|
|
88
207
|
}
|
|
89
|
-
request.input.args.index =
|
|
208
|
+
request.input.args.index = engineId;
|
|
209
|
+
request.input.body.measures = [];
|
|
210
|
+
request.input.body.deviceLinks = [];
|
|
211
|
+
request.input.body.measures = [];
|
|
90
212
|
return super.create(request);
|
|
91
213
|
}
|
|
92
214
|
async importAssets(request) {
|
|
@@ -100,7 +222,18 @@ class AssetController extends kuzzle_plugin_commons_1.CRUDController {
|
|
|
100
222
|
return results;
|
|
101
223
|
}
|
|
102
224
|
async delete(request) {
|
|
103
|
-
|
|
225
|
+
const engineId = request.getString('engineId');
|
|
226
|
+
request.input.args.index = engineId;
|
|
227
|
+
const assetId = request.getId();
|
|
228
|
+
const refresh = request.getRefresh();
|
|
229
|
+
const strict = request.getBoolean('strict');
|
|
230
|
+
const devicesLinks = await this.assetService.getAsset(engineId, assetId);
|
|
231
|
+
if (Array.isArray(devicesLinks._source.deviceLinks)) {
|
|
232
|
+
for (const deviceLink of devicesLinks._source.deviceLinks) {
|
|
233
|
+
// TODO : Refacto to only get the asset one time
|
|
234
|
+
await this.deviceService.unlinkAsset(deviceLink.deviceId, { refresh, strict });
|
|
235
|
+
}
|
|
236
|
+
}
|
|
104
237
|
return super.delete(request);
|
|
105
238
|
}
|
|
106
239
|
}
|