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.
Files changed (74) hide show
  1. package/lib/DeviceManagerPlugin.d.ts +8 -1
  2. package/lib/DeviceManagerPlugin.js +35 -9
  3. package/lib/InternalCollection.d.ts +5 -0
  4. package/lib/InternalCollection.js +10 -0
  5. package/lib/controllers/AssetCategoryController.d.ts +28 -0
  6. package/lib/controllers/AssetCategoryController.js +189 -0
  7. package/lib/controllers/AssetController.d.ts +35 -7
  8. package/lib/controllers/AssetController.js +151 -18
  9. package/lib/controllers/DecodersController.js +1 -1
  10. package/lib/controllers/DeviceController.d.ts +22 -7
  11. package/lib/controllers/DeviceController.js +102 -32
  12. package/lib/controllers/MeasureDefinitionController.d.ts +0 -0
  13. package/lib/controllers/MeasureDefinitionController.js +1 -0
  14. package/lib/controllers/MetadataController.d.ts +16 -0
  15. package/lib/controllers/MetadataController.js +70 -0
  16. package/lib/controllers/RelationalController.d.ts +155 -0
  17. package/lib/controllers/RelationalController.js +410 -0
  18. package/lib/core-classes/AssetCategoryService.d.ts +20 -0
  19. package/lib/core-classes/AssetCategoryService.js +178 -0
  20. package/lib/core-classes/AssetService.d.ts +12 -3
  21. package/lib/core-classes/AssetService.js +18 -3
  22. package/lib/core-classes/Decoder.d.ts +9 -6
  23. package/lib/core-classes/Decoder.js +11 -6
  24. package/lib/core-classes/DeviceManagerEngine.js +10 -0
  25. package/lib/core-classes/DeviceService.d.ts +64 -47
  26. package/lib/core-classes/DeviceService.js +157 -97
  27. package/lib/core-classes/MeasureService.d.ts +77 -0
  28. package/lib/core-classes/MeasureService.js +302 -0
  29. package/lib/core-classes/PayloadService.d.ts +13 -45
  30. package/lib/core-classes/PayloadService.js +12 -157
  31. package/lib/core-classes/index.d.ts +4 -4
  32. package/lib/core-classes/index.js +4 -4
  33. package/lib/core-classes/registers/DecodersRegister.d.ts +4 -2
  34. package/lib/core-classes/registers/DecodersRegister.js +5 -1
  35. package/lib/core-classes/registers/MeasuresRegister.d.ts +1 -0
  36. package/lib/core-classes/registers/MeasuresRegister.js +3 -0
  37. package/lib/mappings/assetCategoryMappings.d.ts +69 -0
  38. package/lib/mappings/assetCategoryMappings.js +23 -0
  39. package/lib/mappings/assetsMappings.d.ts +95 -1
  40. package/lib/mappings/assetsMappings.js +40 -4
  41. package/lib/mappings/fieldpathMappings.d.ts +17 -0
  42. package/lib/mappings/fieldpathMappings.js +21 -0
  43. package/lib/mappings/genericEmbeddedMapping.d.ts +1 -0
  44. package/lib/mappings/genericEmbeddedMapping.js +11 -0
  45. package/lib/mappings/index.d.ts +1 -1
  46. package/lib/mappings/index.js +1 -1
  47. package/lib/mappings/measuresMappings.d.ts +54 -25
  48. package/lib/mappings/measuresMappings.js +48 -24
  49. package/lib/mappings/metadataMappings.d.ts +149 -0
  50. package/lib/mappings/metadataMappings.js +64 -0
  51. package/lib/mappings/payloadsMappings.d.ts +4 -0
  52. package/lib/mappings/payloadsMappings.js +4 -0
  53. package/lib/models/BaseAsset.d.ts +10 -1
  54. package/lib/models/BaseAsset.js +44 -0
  55. package/lib/models/Device.d.ts +5 -1
  56. package/lib/models/Device.js +22 -0
  57. package/lib/types/AssetCategoryContent.d.ts +29 -0
  58. package/lib/types/AssetCategoryContent.js +3 -0
  59. package/lib/types/BaseAssetContent.d.ts +37 -5
  60. package/lib/types/DecodedPayload.d.ts +46 -35
  61. package/lib/types/DecoderContent.d.ts +2 -1
  62. package/lib/types/DeviceContent.d.ts +5 -3
  63. package/lib/types/MetadataContent.d.ts +30 -0
  64. package/lib/types/MetadataContent.js +15 -0
  65. package/lib/types/Request.d.ts +26 -0
  66. package/lib/types/{measures/Measurement.js → Request.js} +1 -1
  67. package/lib/types/index.d.ts +0 -1
  68. package/lib/types/index.js +0 -1
  69. package/lib/types/measures/MeasureContent.d.ts +46 -23
  70. package/lib/types/measures/MeasureContent.js +9 -0
  71. package/lib/types/measures/MeasureDefinition.d.ts +12 -12
  72. package/lib/utils/writeMany.js +3 -1
  73. package/package.json +4 -4
  74. 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.measures.register('temperature', measures_1.temperatureMeasure);
138
- this.measures.register('position', measures_1.positionMeasure);
139
- this.measures.register('movement', measures_1.movementMeasure);
140
- this.measures.register('humidity', measures_1.humidityMeasure);
141
- this.measures.register('battery', measures_1.batteryMeasure);
142
- this.assetService = new core_classes_1.AssetService(this);
143
- this.payloadService = new core_classes_1.PayloadService(this, this.measuresRegister);
144
- this.deviceService = new core_classes_1.DeviceService(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,5 @@
1
+ export declare enum InternalCollection {
2
+ ASSETS = "assets",
3
+ DEVICES = "devices",
4
+ MEASURES = "measures"
5
+ }
@@ -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 { CRUDController } from 'kuzzle-plugin-commons';
2
- import { KuzzleRequest, Plugin } from 'kuzzle';
3
- import { AssetService } from '../core-classes';
4
- export declare class AssetController extends CRUDController {
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 get sdk();
7
- constructor(plugin: Plugin, assetService: AssetService);
8
- measures(request: KuzzleRequest): Promise<{
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
- class AssetController extends kuzzle_plugin_commons_1.CRUDController {
12
- constructor(plugin, assetService) {
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/:index/assets', verb: 'post' }],
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/:index/assets/:_id', verb: 'delete' }],
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/:index/assets/_import', verb: 'post' }]
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/:index/assets/_search', verb: 'post' },
34
- { path: 'device-manager/:index/assets/_search', verb: 'get' },
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/:index/assets/:_id', verb: 'put' }],
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
- get sdk() {
50
- return this.context.accessors.sdk;
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 measures(request) {
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 = request.getString('engineId');
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
- request.input.args.index = request.getString('engineId');
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
  }
@@ -19,7 +19,7 @@ class DecodersController {
19
19
  * List all available decoders
20
20
  */
21
21
  async list() {
22
- const decoders = await this.decodersRegister.list();
22
+ const decoders = this.decodersRegister.list();
23
23
  return { decoders };
24
24
  }
25
25
  }