Skip to content

Commit 8685910

Browse files
Return all CanDecide errors simultaneously (#421)
* refactor validate * test: adjust to split function * feat: add mergeResults * test: mergeResults * refactor: wording * refactor: simplify recursion --------- Co-authored-by: Julian König <[email protected]>
1 parent 4821dcc commit 8685910

File tree

6 files changed

+447
-261
lines changed

6 files changed

+447
-261
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
export * from "./flattenObject";
2+
export * from "./mergeResults";
23
export * from "./ValidationResult";
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { ValidationResult } from "./ValidationResult";
2+
3+
export function mergeResults(result1: ValidationResult, result2: ValidationResult): ValidationResult {
4+
if (result1.items.length !== result2.items.length) throw new Error("The dimensions of the ValidationResults do not match.");
5+
6+
if (result1.items.length === 0) return result1.isError() ? result1 : result2;
7+
8+
const mergedValidationResults = result1.items.map((item, index) => mergeResults(item, result2.items[index]));
9+
return ValidationResult.fromItems(mergedValidationResults);
10+
}

packages/consumption/src/modules/requests/incoming/DecideRequestParametersValidator.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { DecideRequestItemParametersJSON, isDecideRequestItemParametersJSON } fr
88
import { InternalDecideRequestParametersJSON } from "./decide/InternalDecideRequestParameters";
99

1010
export class DecideRequestParametersValidator {
11-
public validate(params: InternalDecideRequestParametersJSON, request: LocalRequest): ValidationResult {
11+
public validateRequest(params: InternalDecideRequestParametersJSON, request: LocalRequest): ValidationResult {
1212
if (!request.id.equals(CoreId.from(params.requestId))) {
1313
throw new Error("The response is invalid because the id of the Request does not match the id of the Response.");
1414
}
@@ -19,6 +19,10 @@ export class DecideRequestParametersValidator {
1919
);
2020
}
2121

22+
return ValidationResult.success();
23+
}
24+
25+
public validateItems(params: InternalDecideRequestParametersJSON, request: LocalRequest): ValidationResult {
2226
const validationResults = request.content.items.map((requestItem, index) => this.checkItemOrGroup(requestItem, params.items[index], params.accept));
2327
return ValidationResult.fromItems(validationResults);
2428
}

packages/consumption/src/modules/requests/incoming/IncomingRequestsController.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { ConsumptionControllerName } from "../../../consumption/ConsumptionContr
99
import { ConsumptionCoreErrors } from "../../../consumption/ConsumptionCoreErrors";
1010
import { ConsumptionError } from "../../../consumption/ConsumptionError";
1111
import { ConsumptionIds } from "../../../consumption/ConsumptionIds";
12+
import { mergeResults } from "../../common";
1213
import { ValidationResult } from "../../common/ValidationResult";
1314
import { IncomingRequestReceivedEvent, IncomingRequestStatusChangedEvent } from "../events";
1415
import { RequestItemProcessorRegistry } from "../itemProcessors/RequestItemProcessorRegistry";
@@ -214,12 +215,22 @@ export class IncomingRequestsController extends ConsumptionBaseController {
214215
);
215216
}
216217

217-
const validationResult = this.decideRequestParamsValidator.validate(params, request);
218-
if (validationResult.isError()) return validationResult;
218+
const validateRequestResult = this.decideRequestParamsValidator.validateRequest(params, request);
219+
if (validateRequestResult.isError()) return validateRequestResult;
219220

220-
const itemResults = await this.canDecideItems(params.items, request.content.items, request);
221+
const validateItemsResult = this.decideRequestParamsValidator.validateItems(params, request);
221222

222-
return ValidationResult.fromItems(itemResults);
223+
const canDecideItemsResults = await this.canDecideItems(params.items, request.content.items, request);
224+
const canDecideItemsResult = ValidationResult.fromItems(canDecideItemsResults);
225+
226+
try {
227+
return mergeResults(validateItemsResult, canDecideItemsResult);
228+
} catch (_) {
229+
this._log.error(
230+
`Merging '${JSON.stringify(validateItemsResult)}' and '${JSON.stringify(canDecideItemsResult)}' was not possible because their dimensions don't match.`
231+
);
232+
return validateItemsResult.isError() ? validateItemsResult : canDecideItemsResult;
233+
}
223234
}
224235

225236
private async canDecideGroup(params: DecideRequestItemGroupParametersJSON, requestItemGroup: RequestItemGroup, request: LocalRequest) {

0 commit comments

Comments
 (0)