Skip to content

Commit 6970334

Browse files
authored
Merge branch 'master' into fix/auth-decorator-status-code
2 parents 17e4cd6 + 52f8458 commit 6970334

File tree

5 files changed

+72
-29
lines changed

5 files changed

+72
-29
lines changed

src/ActionParameterHandler.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,13 @@ export class ActionParameterHandler {
125125

126126
return !!value;
127127

128+
case "date":
129+
const parsedDate = new Date(value);
130+
if (isNaN(parsedDate.getTime())) {
131+
return Promise.reject(new BadRequestError(`${param.name} is invalid! It can't be parsed to date.`));
132+
}
133+
return parsedDate;
134+
128135
default:
129136
if (value && (param.parse || param.isTargetObject)) {
130137
value = this.parseValue(value, param);

src/metadata/ActionMetadata.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -261,12 +261,15 @@ export class ActionMetadata {
261261
/**
262262
* Appends base route to a given regexp route.
263263
*/
264-
static appendBaseRoute(baseRoute: string, route: RegExp | string) {
264+
static appendBaseRoute(baseRoute: string, route: RegExp|string) {
265+
const prefix = `${baseRoute.length > 0 && baseRoute.indexOf("/") < 0 ? "/" : ""}${baseRoute}`;
265266
if (typeof route === "string")
266-
return `${baseRoute}${route}`;
267+
return `${prefix}${route}`;
267268

268269
if (!baseRoute || baseRoute === "") return route;
269-
const fullPath = baseRoute.replace("\/", "\\\\/") + route.toString().substr(1);
270+
271+
const fullPath = `^${prefix}${route.toString().substr(1)}?$`;
272+
270273
return new RegExp(fullPath, route.flags);
271274
}
272275

test/functional/action-params.spec.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,11 @@ describe("action parameters", () => {
285285
return body;
286286
}
287287

288+
@Get("/posts-after")
289+
getPhotosAfter(@QueryParam("from", { required: true }) from: Date): any {
290+
return from.toISOString();
291+
}
292+
288293
@Post("/users")
289294
postUser(@BodyParam("name") name: string,
290295
@BodyParam("age") age: number,
@@ -431,6 +436,21 @@ describe("action parameters", () => {
431436
});
432437
});
433438

439+
describe("for @QueryParam when the type is Date then it should be parsed", () => {
440+
assertRequest([3001, 3002], "get", "posts-after/?from=2017-01-01T00:00:00Z", response => {
441+
expect(response).to.be.status(200);
442+
expect(response.body).to.be.equal("2017-01-01T00:00:00.000Z");
443+
});
444+
});
445+
446+
describe("for @QueryParam when the type is Date and it is invalid then the response should be a BadRequest error", () => {
447+
assertRequest([3001, 3002], "get", "posts-after/?from=InvalidDate", response => {
448+
expect(response).to.be.status(400);
449+
expect(response.body.name).to.be.equals("BadRequestError");
450+
expect(response.body.message).to.be.equals("from is invalid! It can't be parsed to date.");
451+
});
452+
});
453+
434454
describe("for @QueryParam when parseJson flag is used query param must be converted to object", () => {
435455
assertRequest([3001, 3002], "get", "photos-with-json/?filter={\"keyword\": \"name\", \"limit\": 5}", response => {
436456
queryParamFilter.should.be.eql({ keyword: "name", limit: 5 });

test/functional/global-options.spec.ts

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@ describe("routing-controllers global options", () => {
3737
return "";
3838
}
3939

40+
@Post(new RegExp("/(prefix|regex)/users"))
41+
postUsersWithRegex(@Body() user: User) {
42+
initializedUser = user;
43+
return "";
44+
}
45+
4046
}
4147
});
4248

@@ -84,13 +90,20 @@ describe("routing-controllers global options", () => {
8490

8591
describe("when routePrefix is used all controller routes should be appended by it", () => {
8692

87-
let expressApp: any, koaApp: any;
88-
before(done => expressApp = createExpressServer({ routePrefix: "/api" }).listen(3001, done));
89-
after(done => expressApp.close(done));
90-
before(done => koaApp = createKoaServer({ routePrefix: "/api" }).listen(3002, done));
91-
after(done => koaApp.close(done));
93+
let apps: any[] = [];
94+
before(done => apps.push(createExpressServer({ routePrefix: "/api" }).listen(3001, done)));
95+
before(done => apps.push(createExpressServer({ routePrefix: "api" }).listen(3002, done)));
96+
before(done => apps.push(createKoaServer({ routePrefix: "/api" }).listen(3003, done)));
97+
before(done => apps.push(createKoaServer({ routePrefix: "api" }).listen(3004, done)));
98+
after(done => { apps.forEach(app => app.close()); done(); });
9299

93-
assertRequest([3001, 3002], "post", "api/users", { firstName: "Umed", lastName: "Khudoiberdiev" }, response => {
100+
assertRequest([3001, 3002, 3003, 3004], "post", "api/users", { firstName: "Umed", lastName: "Khudoiberdiev" }, response => {
101+
expect(initializedUser).to.be.instanceOf(User);
102+
expect(response).to.have.status(200);
103+
});
104+
105+
assertRequest([3001, 3002, 3003, 3004], "post", "api/regex/users", { firstName: "Umed", lastName: "Khudoiberdiev" }, response => {
106+
expect(initializedUser).to.be.instanceOf(User);
94107
expect(response).to.have.status(200);
95108
});
96109
});

test/functional/redirect-decorator.spec.ts

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {createExpressServer, createKoaServer, getMetadataArgsStorage} from "../.
44
import {assertRequest} from "./test-utils";
55
import {Redirect} from "../../src/decorator/Redirect";
66
import {JsonController} from "../../src/decorator/JsonController";
7+
import {Param} from "../../src/decorator/Param";
78
const chakram = require("chakram");
89
const expect = chakram.expect;
910

@@ -14,18 +15,31 @@ describe("dynamic redirect", function () {
1415
// reset metadata args storage
1516
getMetadataArgsStorage().reset();
1617

18+
@JsonController("/users")
19+
class TestController {
20+
21+
@Get("/:id")
22+
async getOne(@Param("id") id: string) {
23+
return {
24+
login: id
25+
};
26+
}
27+
28+
29+
}
30+
1731
@JsonController()
1832
class RedirectController {
1933

2034
@Get("/template")
21-
@Redirect("https://api.github.com/users/:owner")
35+
@Redirect("/users/:owner")
2236
template() {
2337
// console.log("/template");
2438
return {owner: "pleerock", repo: "routing-controllers"};
2539
}
2640

2741
@Get("/original")
28-
@Redirect("https://api.github.com/users/pleerock")
42+
@Redirect("/users/pleerock")
2943
original() {
3044
// console.log("/original");
3145
}
@@ -34,7 +48,7 @@ describe("dynamic redirect", function () {
3448
@Redirect("https://api.github.com")
3549
override() {
3650
// console.log("/override");
37-
return "https://api.github.com/users/pleerock";
51+
return "/users/pleerock";
3852
}
3953

4054
}
@@ -54,36 +68,22 @@ describe("dynamic redirect", function () {
5468
});
5569
after(done => koaApp.close(done));
5670

57-
this.timeout(5000); // 2000ms timeout
58-
5971
describe("using template", () => {
60-
assertRequest([3001, 3002], "get", "template", {
61-
headers: {
62-
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
63-
}
64-
}, response => {
72+
assertRequest([3001, 3002], "get", "template", response => {
6573
expect(response).to.have.status(200);
6674
expect(response.body).has.property("login", "pleerock");
6775
});
6876
});
6977

7078
describe("using override", () => {
71-
assertRequest([3001, 3002], "get", "override", {
72-
headers: {
73-
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
74-
}
75-
}, response => {
79+
assertRequest([3001, 3002], "get", "override", response => {
7680
expect(response).to.have.status(200);
7781
expect(response.body).has.property("login", "pleerock");
7882
});
7983
});
8084

8185
describe("using original", () => {
82-
assertRequest([3001, 3002], "get", "original", {
83-
headers: {
84-
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
85-
}
86-
}, response => {
86+
assertRequest([3001, 3002], "get", "original", response => {
8787
expect(response).to.have.status(200);
8888
expect(response.body).has.property("login", "pleerock");
8989
});

0 commit comments

Comments
 (0)