Skip to content

Commit 91a1005

Browse files
author
Adrien Maret
authored
Merge pull request #222 from kuzzleio/2-dev
2 parents 625e2ee + 9839f10 commit 91a1005

40 files changed

+1366
-653
lines changed

doc/1/controllers/decoder/list-decoders/index.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,23 @@ List available registered decoders.
1616
### HTTP
1717

1818
```http
19-
URL: http://localhost:7512/_/device-manager/decoders/_list
19+
URL: http://localhost:7512/_/device-manager/decoder/_list
2020
Method: GET
2121
```
2222

2323
### Other protocols
2424

2525
```js
2626
{
27-
"controller": "device-manager/decoders",
27+
"controller": "device-manager/decoder",
2828
"action": "list",
2929
}
3030
```
3131

3232
### Kourou
3333

3434
```bash
35-
kourou device-manager/decoders:list
35+
kourou device-manager/decoder:list
3636
```
3737
---
3838

@@ -41,7 +41,7 @@ kourou device-manager/decoders:list
4141
```js
4242
{
4343
"action": "list",
44-
"controller": "device-manager/decoders",
44+
"controller": "device-manager/decoder",
4545
"error": null,
4646
"node": "knode-nine-hydra-22631",
4747
"requestId": "d888a8e1-2f80-4849-99d0-86ea70fe91e4",

features/AssetCategory.feature

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ Feature: AssetCategory
173173
| status | 400 |
174174

175175

176-
Scenario: Create an asset with AssetCategory and present mandatory metadata
176+
Scenario: Create an asset with AssetCategory and present mandatory metadata, then verify content given by get and search method
177177
When I successfully execute the action "device-manager/asset":"create" with args:
178178
| engineId | "engine-ayse" |
179179
| body.type | "truck" |
@@ -197,6 +197,16 @@ Feature: AssetCategory
197197
| reference | "asset_02" |
198198
| category.name | "bigTruck" |
199199
| metadata.surname | "test" |
200+
Then I refresh the collection "engine-ayse":"assets"
201+
When I successfully execute the action "device-manager/asset":"search" with args:
202+
| engineId | "engine-ayse" |
203+
| body.query.match.reference | "asset_02" |
204+
Then I should receive a result matching:
205+
| hits[0]._source.type | "truck" |
206+
| hits[0]._source.model | "M" |
207+
| hits[0]._source.reference | "asset_02" |
208+
| hits[0]._source.category.name | "bigTruck" |
209+
| hits[0]._source.metadata.surname | "test" |
200210

201211
Scenario: Create an assetCategory, a mandatory metadata, link them statically and create an asset with
202212
When I successfully execute the action "device-manager/assetCategory":"create" with args:
@@ -470,4 +480,4 @@ Feature: AssetCategory
470480
| body.category | "genericTrailerTruck" |
471481
| body.metadata.trailer | {'color' : 'red', 'size' : 'giant', 'maxLoad' : 60} |
472482
Then I should receive an error matching:
473-
| id | "device-manager.asset_controller.enum_metadata" |
483+
| id | "device-manager.asset_controller.enum_metadata" |

features/Decoders.feature

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,5 @@
11
Feature: Device Manager Decoders
22

3-
Scenario: List all registered decoders
4-
When When I successfully execute the action "device-manager/decoders":"list"
5-
Then I should receive a result matching:
6-
| decoders[0] | {"deviceModel":"DummyTemp","decoderMeasures":{"theBatteryLevel":"battery"}} |
7-
| decoders[1] | {"deviceModel":"DummyMultiTemp","decoderMeasures":{"innerTemp":"temperature","outerTemp":"temperature","lvlBattery":"battery"}} |
8-
| decoders[2] | {"deviceModel":"DummyTempPosition","decoderMeasures":{"theTemperature":"temperature","theBattery":"battery","thePosition":"position"}} |
9-
103
Scenario: Creates default roles, profiles and users
114
Then I am able to get a role with id "payload-gateway.dummy-temp"
125
Then I am able to get a role with id "payload-gateway.dummy-temp-position"

features/DeviceController/LinkAsset.feature

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ Feature: LinkAsset
3535
| deviceLinks[0].measureNamesLinks[2].assetMeasureName | "lvlBattery" |
3636
| deviceLinks[0].measureNamesLinks[2].deviceMeasureName | "lvlBattery" |
3737

38-
Scenario: Link device to an asset with measureNamesLinks
38+
Scenario: Link device to an asset with partial measureNamesLinks and receive a payload
3939
When I successfully execute the action "device-manager/device":"linkAsset" with args:
4040
| _id | "DummyMultiTemp-attached_ayse_unlinked_1" |
4141
| assetId | "container-FRIDGE-unlinked_1" |
@@ -50,6 +50,19 @@ Feature: LinkAsset
5050
| deviceLinks[0].deviceId | "DummyMultiTemp-attached_ayse_unlinked_1" |
5151
| deviceLinks[0].measureNamesLinks[0].assetMeasureName | "coreInnerTemp" |
5252
| deviceLinks[0].measureNamesLinks[0].deviceMeasureName | "innerTemp" |
53+
When I successfully receive a "dummy-multi-temp" payload with:
54+
| payloads[0].deviceEUI | "attached_ayse_unlinked_1" |
55+
| payloads[0].registerInner | 1 |
56+
| payloads[0].registerOuter | 2 |
57+
| payloads[0].lvlBattery | 1 |
58+
And I refresh the collection "engine-ayse":"assets"
59+
Then The document "engine-ayse":"assets":"container-FRIDGE-unlinked_1" content match:
60+
| measures[0].type | "temperature" |
61+
| measures[0].values.temperature | 1 |
62+
| measures[0].deviceMeasureName | "innerTemp" |
63+
| measures[0].assetMeasureName | "coreInnerTemp" |
64+
| measures[0].origin.assetId | "container-FRIDGE-unlinked_1" |
65+
| measures[0].origin.id | "DummyMultiTemp-attached_ayse_unlinked_1" |
5366

5467
Scenario: Link device to an asset and enriching the asset with before event
5568
When I successfully execute the action "device-manager/device":"linkAsset" with args:

features/DeviceController/Misc.feature

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -39,17 +39,15 @@ Feature: Device Controller actions
3939
Then I should receive a result matching:
4040
| total | 1 |
4141

42-
Scenario: Get measure without deviceMeasureName
42+
Scenario: Throw an error when decoding unknown measure name
4343
Given I successfully execute the action "device-manager/device":"create" with args:
44-
| engineId | "device-manager" |
45-
| body.model | "DummyTemp" |
46-
| body.reference | "test" |
47-
When I successfully receive a "dummy-temp" payload with:
48-
| deviceEUI | "test" |
49-
| register55 | 100 |
50-
| batteryLevel | 1 |
44+
| engineId | "device-manager" |
45+
| body.model | "DummyTemp" |
46+
| body.reference | "test" |
47+
When I receive a "dummy-temp" payload with:
48+
| deviceEUI | "test" |
49+
| register55 | 100 |
50+
| unknownMeasure | 100 |
51+
| batteryLevel | 1 |
5152
Then The document "device-manager":"devices":"DummyTemp-test" content match:
52-
| measures[0].type | "temperature" |
53-
| measures[0].deviceMeasureName | "temperature" |
54-
| measures[1].type | "battery" |
55-
| measures[1].deviceMeasureName | "theBatteryLevel" |
53+
| measures | [] |

features/PayloadController.feature

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,3 +203,14 @@ Feature: Payloads Controller
203203
| measures[0].origin.id | "DummyMultiTemp-enrich_me_master+container-FRIDGE-unlinked_1" |
204204
| measures[1].origin.id | "DummyMultiTemp-enrich_me_master+container-FRIDGE-unlinked_1" |
205205

206+
Scenario: Decode Device metadata from payload
207+
When I successfully receive a "dummy-temp" payload with:
208+
| deviceEUI | "12345" |
209+
| register55 | 23.3 |
210+
| lvlBattery | 0.8 |
211+
| metadata.color | "RED" |
212+
And I refresh the collection "device-manager":"devices"
213+
Then The document "device-manager":"devices":"DummyTemp-12345" content match:
214+
| reference | "12345" |
215+
| model | "DummyTemp" |
216+
| metadata.color | "RED" |

features/fixtures/application/app.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,27 @@ import {
55
DummyMultiTempDecoder,
66
DummyTempDecoder,
77
DummyTempPositionDecoder,
8+
DummyAccelerometer3dDecoder,
89
} from './decoders';
910
import { registerTestPipes } from './testPipes'
1011
import { TreeNodeController } from '../../fakeclasses/TreeNodeController';
1112
import { InvertTreeNodeController } from '../../fakeclasses/InvertTreeNodeController';
13+
import { acceleration3dMeasure } from './measures/Acceleration3dMeasure';
1214

1315
const app = new Backend('kuzzle');
1416

1517
const deviceManager = new DeviceManagerPlugin();
1618

17-
deviceManager.decoders.register(new DummyTempDecoder(deviceManager.measures));
18-
deviceManager.decoders.register(new DummyMultiTempDecoder(deviceManager.measures));
19-
deviceManager.decoders.register(new DummyTempPositionDecoder(deviceManager.measures));
19+
deviceManager.measures.register('acceleration3d', acceleration3dMeasure);
20+
21+
deviceManager.decoders.register(new DummyTempDecoder());
22+
deviceManager.devices.registerMetadata({
23+
color: { type: 'keyword' }
24+
});
25+
26+
deviceManager.decoders.register(new DummyMultiTempDecoder());
27+
deviceManager.decoders.register(new DummyTempPositionDecoder());
28+
deviceManager.decoders.register(new DummyAccelerometer3dDecoder());
2029

2130
deviceManager.devices.registerMetadata({
2231
group: {
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { JSONObject } from 'kuzzle';
2+
3+
import {
4+
DecodedPayload, Decoder
5+
} from '../../../../index';
6+
import { Acceleration3dMeasurement } from '../measures/Acceleration3dMeasure';
7+
8+
export class DummyAccelerometer3dDecoder extends Decoder {
9+
public measures = [
10+
{ name: 'acceleration3d', type: 'acceleration3d' },
11+
] as const;
12+
13+
constructor () {
14+
super();
15+
16+
this.payloadsMappings = {
17+
deviceEUI: { type: 'keyword' }
18+
};
19+
}
20+
21+
async validate (payload: JSONObject) {
22+
return payload.x && payload.y && payload.z && payload.id;
23+
}
24+
25+
async decode (payload: JSONObject): Promise<DecodedPayload<Decoder>> {
26+
const decodedPayload = new DecodedPayload<DummyAccelerometer3dDecoder>(this);
27+
28+
const measurement: Acceleration3dMeasurement = {
29+
measuredAt: Date.now(),
30+
type: 'acceleration3d',
31+
values: {
32+
x: payload.x,
33+
y: payload.y,
34+
z: payload.z,
35+
}
36+
}
37+
38+
decodedPayload.addMeasurement(payload.id, 'acceleration3d', measurement);
39+
40+
return decodedPayload;
41+
}
42+
}

features/fixtures/application/decoders/DummyMultiTempDecoder.ts

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { JSONObject, KuzzleRequest, PreconditionError } from 'kuzzle';
1+
import { JSONObject, PreconditionError } from 'kuzzle';
22

33
import {
44
Decoder,
@@ -9,20 +9,21 @@ import {
99
} from '../../../../index';
1010

1111
export class DummyMultiTempDecoder extends Decoder {
12-
constructor (measuresRegister: MeasuresRegister) {
13-
super('DummyMultiTemp', {
14-
innerTemp: 'temperature',
15-
outerTemp: 'temperature',
16-
lvlBattery: 'battery',
17-
},
18-
measuresRegister);
12+
public measures = [
13+
{ name: 'innerTemp', type: 'temperature' },
14+
{ name: 'outerTemp', type: 'temperature' },
15+
{ name: 'lvlBattery', type: 'battery' },
16+
] as const;
17+
18+
constructor () {
19+
super();
1920

2021
this.payloadsMappings = {
2122
deviceEUI: { type: 'keyword' }
2223
};
2324
}
2425

25-
async validate (payload: JSONObject, request: KuzzleRequest) {
26+
async validate (payload: JSONObject) {
2627
if (payload.payloads.find(devicePayload => ! devicePayload.deviceEUI)) {
2728
throw new PreconditionError('Invalid payload: missing "deviceEUI" in some devicePayload');
2829
}
@@ -34,47 +35,45 @@ export class DummyMultiTempDecoder extends Decoder {
3435
return true;
3536
}
3637

37-
async decode (payload: JSONObject, request: KuzzleRequest): Promise<DecodedPayload> {
38-
const decodedPayload: DecodedPayload = {};
38+
async decode (payload: JSONObject): Promise<DecodedPayload<Decoder>> {
39+
const decodedPayload = new DecodedPayload<DummyMultiTempDecoder>(this);
3940

4041
for (const devicePayload of payload.payloads) {
41-
const deviceMeasurements = [];
42-
4342
if (devicePayload.registerInner) {
44-
deviceMeasurements.push({
45-
deviceMeasureName: 'innerTemp',
43+
const innerTemp: TemperatureMeasurement = {
4644
measuredAt: devicePayload.measuredAtRegisterInner ?? Date.now(),
4745
type: 'temperature',
4846
values: {
4947
temperature: devicePayload.registerInner,
5048
},
51-
});
49+
}
50+
51+
decodedPayload.addMeasurement(devicePayload.deviceEUI, 'innerTemp', innerTemp);
5252
}
5353

5454
if (devicePayload.registerOuter) {
55-
deviceMeasurements.push(
56-
{
57-
deviceMeasureName: 'outerTemp',
58-
measuredAt: devicePayload.measuredAtRegisterOuter ?? Date.now(),
59-
type: 'temperature',
60-
values: {
61-
temperature: devicePayload.registerOuter,
62-
},
63-
});
55+
const outerTemp: TemperatureMeasurement = {
56+
measuredAt: devicePayload.measuredAtRegisterOuter ?? Date.now(),
57+
type: 'temperature',
58+
values: {
59+
temperature: devicePayload.registerOuter,
60+
},
61+
};
62+
63+
decodedPayload.addMeasurement(devicePayload.deviceEUI, 'outerTemp', outerTemp);
6464
}
6565

6666
if (devicePayload.lvlBattery) {
67-
deviceMeasurements.push({
68-
deviceMeasureName: 'lvlBattery',
67+
const battery: BatteryMeasurement = {
6968
measuredAt: devicePayload.measuredAtLvlBattery ?? Date.now(),
7069
type: 'battery',
7170
values: {
7271
battery: devicePayload.lvlBattery * 100,
7372
},
74-
});
75-
}
73+
}
7674

77-
decodedPayload[devicePayload.deviceEUI] = deviceMeasurements;
75+
decodedPayload.addMeasurement(devicePayload.deviceEUI, 'lvlBattery', battery);
76+
}
7877
}
7978

8079
return decodedPayload;

0 commit comments

Comments
 (0)