Skip to content

Commit

Permalink
Return all CanDecide errors simultaneously (#421)
Browse files Browse the repository at this point in the history
* 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]>
  • Loading branch information
Milena-Czierlinski and jkoenig134 authored Feb 17, 2025
1 parent 4821dcc commit 8685910
Show file tree
Hide file tree
Showing 6 changed files with 447 additions and 261 deletions.
1 change: 1 addition & 0 deletions packages/consumption/src/modules/common/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
export * from "./flattenObject";
export * from "./mergeResults";
export * from "./ValidationResult";
10 changes: 10 additions & 0 deletions packages/consumption/src/modules/common/mergeResults.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { ValidationResult } from "./ValidationResult";

export function mergeResults(result1: ValidationResult, result2: ValidationResult): ValidationResult {
if (result1.items.length !== result2.items.length) throw new Error("The dimensions of the ValidationResults do not match.");

if (result1.items.length === 0) return result1.isError() ? result1 : result2;

const mergedValidationResults = result1.items.map((item, index) => mergeResults(item, result2.items[index]));
return ValidationResult.fromItems(mergedValidationResults);
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { DecideRequestItemParametersJSON, isDecideRequestItemParametersJSON } fr
import { InternalDecideRequestParametersJSON } from "./decide/InternalDecideRequestParameters";

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

return ValidationResult.success();
}

public validateItems(params: InternalDecideRequestParametersJSON, request: LocalRequest): ValidationResult {
const validationResults = request.content.items.map((requestItem, index) => this.checkItemOrGroup(requestItem, params.items[index], params.accept));
return ValidationResult.fromItems(validationResults);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { ConsumptionControllerName } from "../../../consumption/ConsumptionContr
import { ConsumptionCoreErrors } from "../../../consumption/ConsumptionCoreErrors";
import { ConsumptionError } from "../../../consumption/ConsumptionError";
import { ConsumptionIds } from "../../../consumption/ConsumptionIds";
import { mergeResults } from "../../common";
import { ValidationResult } from "../../common/ValidationResult";
import { IncomingRequestReceivedEvent, IncomingRequestStatusChangedEvent } from "../events";
import { RequestItemProcessorRegistry } from "../itemProcessors/RequestItemProcessorRegistry";
Expand Down Expand Up @@ -214,12 +215,22 @@ export class IncomingRequestsController extends ConsumptionBaseController {
);
}

const validationResult = this.decideRequestParamsValidator.validate(params, request);
if (validationResult.isError()) return validationResult;
const validateRequestResult = this.decideRequestParamsValidator.validateRequest(params, request);
if (validateRequestResult.isError()) return validateRequestResult;

const itemResults = await this.canDecideItems(params.items, request.content.items, request);
const validateItemsResult = this.decideRequestParamsValidator.validateItems(params, request);

return ValidationResult.fromItems(itemResults);
const canDecideItemsResults = await this.canDecideItems(params.items, request.content.items, request);
const canDecideItemsResult = ValidationResult.fromItems(canDecideItemsResults);

try {
return mergeResults(validateItemsResult, canDecideItemsResult);
} catch (_) {
this._log.error(
`Merging '${JSON.stringify(validateItemsResult)}' and '${JSON.stringify(canDecideItemsResult)}' was not possible because their dimensions don't match.`
);
return validateItemsResult.isError() ? validateItemsResult : canDecideItemsResult;
}
}

private async canDecideGroup(params: DecideRequestItemGroupParametersJSON, requestItemGroup: RequestItemGroup, request: LocalRequest) {
Expand Down
Loading

0 comments on commit 8685910

Please sign in to comment.