Skip to content

Commit 4df235e

Browse files
committed
Add ParamNormalization error and change normalization handler flow
1 parent 0087878 commit 4df235e

File tree

2 files changed

+38
-16
lines changed

2 files changed

+38
-16
lines changed

src/ActionParameterHandler.ts

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {ParamRequiredError} from "./error/ParamRequiredError";
99
import {AuthorizationRequiredError} from "./error/AuthorizationRequiredError";
1010
import {CurrentUserCheckerNotDefinedError} from "./error/CurrentUserCheckerNotDefinedError";
1111
import {isPromiseLike} from "./util/isPromiseLike";
12+
import { ParamNormalizationError } from "./error/ParamNormalizationError";
1213

1314
/**
1415
* Handles action parameter.
@@ -145,31 +146,37 @@ export class ActionParameterHandler<T extends BaseDriver> {
145146
/**
146147
* Normalizes string value to number or boolean.
147148
*/
148-
protected normalizeValue(value: any, type: string) {
149-
switch (type) {
149+
protected normalizeStringValue(value: string, parameterName: string, parameterType: string) {
150+
switch (parameterType) {
150151
case "number":
151-
if (value === "")
152-
return undefined;
153-
const valueNumber = Number(value);
154-
// tslint:disable-next-line:triple-equals
155-
if (valueNumber == value)
156-
return valueNumber;
157-
else
158-
throw new BadRequestError(`${value} can't be parsed to number.`);
152+
if (value === "") {
153+
throw new ParamNormalizationError(value, parameterName, parameterType);
154+
}
159155

160-
case "string":
161-
return value;
156+
const valueNumber = +value;
157+
if (valueNumber === NaN) {
158+
throw new ParamNormalizationError(value, parameterName, parameterType);
159+
}
160+
161+
return valueNumber;
162162

163163
case "boolean":
164-
if (value === "true" || value === "1") {
164+
if (value === "true" || value === "1" || value === "") {
165165
return true;
166-
167166
} else if (value === "false" || value === "0") {
168167
return false;
168+
} else {
169+
throw new ParamNormalizationError(value, parameterName, parameterType);
169170
}
170171

171-
return Boolean(value);
172-
172+
case "date":
173+
const parsedDate = new Date(value);
174+
if (Number.isNaN(parsedDate.getTime())) {
175+
throw new ParamNormalizationError(value, parameterName, parameterType);
176+
}
177+
return parsedDate;
178+
179+
case "string":
173180
default:
174181
return value;
175182
}

src/error/ParamNormalizationError.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import {BadRequestError} from "../http-error/BadRequestError";
2+
3+
/**
4+
* Caused when user query parameter is invalid (cannot be parsed into selected type).
5+
*/
6+
export class ParamNormalizationError extends BadRequestError {
7+
name = "ParamNormalizationError";
8+
9+
constructor(value: any, parameterName: string, parameterType: string) {
10+
super(`Given parameter ${parameterName} is invalid. Value (${JSON.stringify(value)}) cannot be parsed into ${parameterType}.`);
11+
12+
Object.setPrototypeOf(this, ParamNormalizationError.prototype);
13+
}
14+
15+
}

0 commit comments

Comments
 (0)