Skip to content

Commit 52f8458

Browse files
authored
Merge pull request #98 from felipesabino/bugfix/prefix-with-regex-routes
Fix routePrefix handling for routes using regex
2 parents cc1d7e8 + f3eb2e5 commit 52f8458

File tree

3 files changed

+45
-28
lines changed

3 files changed

+45
-28
lines changed

src/metadata/ActionMetadata.ts

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

268270
if (!baseRoute || baseRoute === "") return route;
269-
const fullPath = baseRoute.replace("\/", "\\\\/") + route.toString().substr(1);
271+
272+
const fullPath = `^${prefix}${route.toString().substr(1)}?$`;
273+
270274
return new RegExp(fullPath, route.flags);
271275
}
272276

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)