Skip to content

Commit b03d7b4

Browse files
fix: uuid support added with test
1 parent af0cdf8 commit b03d7b4

File tree

2 files changed

+84
-5
lines changed

2 files changed

+84
-5
lines changed

src/ActionParameterHandler.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { AuthorizationRequiredError } from './error/AuthorizationRequiredError';
1010
import { CurrentUserCheckerNotDefinedError } from './error/CurrentUserCheckerNotDefinedError';
1111
import { isPromiseLike } from './util/isPromiseLike';
1212
import { InvalidParamError } from './error/ParamNormalizationError';
13+
import {ParamType} from "./metadata/types/ParamType";
1314

1415
/**
1516
* Handles action parameter.
@@ -96,11 +97,12 @@ export class ActionParameterHandler<T extends BaseDriver> {
9697
protected async normalizeParamValue(value: any, param: ParamMetadata): Promise<any> {
9798
if (value === null || value === undefined) return value;
9899

100+
const isNormalisationNeeded = typeof value === 'object' && ['queries', 'headers', 'params', 'cookies'].some(paramType => paramType === param.type);
101+
const isTargetPrimitive = ['number', 'string', 'boolean'].indexOf(param.targetName) > -1;
102+
const isTransformationNeeded = (param.parse || param.isTargetObject) && param.type !== 'param';
103+
99104
// if param value is an object and param type match, normalize its string properties
100-
if (
101-
typeof value === 'object' &&
102-
['queries', 'headers', 'params', 'cookies'].some(paramType => paramType === param.type)
103-
) {
105+
if (isNormalisationNeeded) {
104106
await Promise.all(
105107
Object.keys(value).map(async key => {
106108
const keyValue = value[key];
@@ -123,6 +125,7 @@ export class ActionParameterHandler<T extends BaseDriver> {
123125
})
124126
);
125127
}
128+
126129
// if value is a string, normalize it to demanded type
127130
else if (typeof value === 'string') {
128131
switch (param.targetName) {
@@ -135,7 +138,7 @@ export class ActionParameterHandler<T extends BaseDriver> {
135138
}
136139

137140
// if target type is not primitive, transform and validate it
138-
if (['number', 'string', 'boolean'].indexOf(param.targetName) === -1 && (param.parse || param.isTargetObject)) {
141+
if (!isTargetPrimitive && isTransformationNeeded) {
139142
value = this.parseValue(value, param);
140143
value = this.transformValue(value, param);
141144
value = await this.validateValue(value, param);

test/ActionParameterHandler.spec.ts

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import {ActionParameterHandler} from "../src/ActionParameterHandler";
2+
import {
3+
ActionMetadata,
4+
ControllerMetadata,
5+
ExpressDriver,
6+
ParamMetadata,
7+
} from "../src";
8+
import {ActionMetadataArgs} from "../src/metadata/args/ActionMetadataArgs";
9+
import {ControllerMetadataArgs} from "../src/metadata/args/ControllerMetadataArgs";
10+
11+
const expect = require("chakram").expect;
12+
13+
describe("ActionParameterHandler", () => {
14+
15+
it("handle", async () => {
16+
const driver = new ExpressDriver();
17+
const actionParameterHandler = new ActionParameterHandler(driver);
18+
19+
const action = {
20+
request: {
21+
params: {
22+
id: "0b5ec98f-e26d-4414-b798-dcd35a5ef859"
23+
},
24+
},
25+
response: {}
26+
};
27+
const controllerMetadataArgs: ControllerMetadataArgs = {
28+
target: function () {
29+
},
30+
route: "",
31+
type: "json",
32+
options: {},
33+
};
34+
const controllerMetadata = new ControllerMetadata(controllerMetadataArgs);
35+
const args: ActionMetadataArgs = {
36+
route: "",
37+
method: "getProduct",
38+
options: {},
39+
target: function () {
40+
41+
},
42+
type: "get",
43+
appendParams: undefined,
44+
};
45+
const actionMetadata = new ActionMetadata(controllerMetadata, args, {});
46+
47+
const param: ParamMetadata = {
48+
targetName: "product",
49+
isTargetObject: true,
50+
actionMetadata,
51+
target: () => {
52+
},
53+
method: "getProduct",
54+
object: "getProduct",
55+
extraOptions: undefined,
56+
index: 0,
57+
type: "param",
58+
name: "id",
59+
parse: undefined,
60+
required: false,
61+
transform: function (action, value) {
62+
return value;
63+
},
64+
classTransform: undefined,
65+
validate: undefined,
66+
targetType: function () {
67+
68+
},
69+
};
70+
71+
const processedValue = await actionParameterHandler.handle(action, param);
72+
73+
expect(processedValue).to.be.eq(action.request.params.id);
74+
});
75+
76+
});

0 commit comments

Comments
 (0)