Skip to content

Commit 5f1383b

Browse files
Merge pull request #440 from kuzzleio/KZLPRD-1032-routing-payloads
feat(payload controller): route endpoint redirect to decoders
2 parents 108b303 + 3564311 commit 5f1383b

File tree

5 files changed

+264
-162
lines changed

5 files changed

+264
-162
lines changed

lib/modules/decoder/DecodersController.ts

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ControllerDefinition, KuzzleRequest } from "kuzzle";
1+
import { BadRequestError, ControllerDefinition, KuzzleRequest } from "kuzzle";
22

33
import { DecodersRegister } from "./DecodersRegister";
44
import { PayloadService } from "./PayloadService";
@@ -32,6 +32,15 @@ export class DecodersController {
3232
{ path: "device-manager/decoders/_prunePayloads", verb: "delete" },
3333
],
3434
},
35+
route: {
36+
handler: this.route.bind(this),
37+
http: [
38+
{
39+
path: "device-manager/decoders/route",
40+
verb: "post",
41+
},
42+
],
43+
},
3544
},
3645
};
3746
}
@@ -61,4 +70,32 @@ export class DecodersController {
6170

6271
return { deleted };
6372
}
73+
74+
async route(request: KuzzleRequest): Promise<{ valid: boolean }> {
75+
const payload = request.getBody();
76+
const model =
77+
payload.deviceModel ?? request.getString("deviceModel", "unknownModel");
78+
const apiAction = `${request.input.controller}:${request.input.action}`;
79+
if (model === "unknownModel") {
80+
app.log.warn(
81+
"Received payload without a device model: routing to receiveUnknown",
82+
);
83+
this.payloadService.receiveUnknown(model, payload, apiAction);
84+
throw new BadRequestError(
85+
"Payload must specify the deviceModel for proper routing",
86+
);
87+
}
88+
const decoder = this.decodersRegister.decoders.find(
89+
(d) => d.deviceModel === model,
90+
);
91+
if (!decoder) {
92+
app.log.warn(
93+
`Received payload from ${model} model, no associated decoder found: routing to receiveUnknown`,
94+
);
95+
this.payloadService.receiveUnknown(model, payload, apiAction);
96+
throw new BadRequestError("The specified device model is unknown");
97+
}
98+
app.log.debug("Routing payload to decoder for " + decoder.deviceModel);
99+
return this.payloadService.receive(request, decoder);
100+
}
64101
}

lib/modules/decoder/DecodersRegister.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,11 @@ export class DecodersRegister {
128128
private registerDefaultRole() {
129129
const role = {
130130
controllers: {
131+
"device-manager/decoders": {
132+
actions: {
133+
route: true,
134+
},
135+
},
131136
"device-manager/payloads": {
132137
actions: {
133138
"*": true,

lib/modules/decoder/roles/RolePayloadsAll.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ export const RolePayloadsAll: KuzzleRole = {
1919
"*": true,
2020
},
2121
},
22+
"device-manager/decoders": {
23+
actions: {
24+
route: true,
25+
},
26+
},
2227
},
2328
},
2429
};

0 commit comments

Comments
 (0)