Skip to content

Commit e27e45c

Browse files
committed
fix(controller): create controllers in specified order
Fixes #774
1 parent cf1117d commit e27e45c

File tree

2 files changed

+68
-3
lines changed

2 files changed

+68
-3
lines changed

src/metadata-builder/MetadataArgsStorage.ts

+5-3
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,11 @@ export class MetadataArgsStorage {
7979
* Filters registered controllers by a given classes.
8080
*/
8181
filterControllerMetadatasForClasses(classes: Function[]): ControllerMetadataArgs[] {
82-
return this.controllers.filter(ctrl => {
83-
return classes.filter(cls => ctrl.target === cls).length > 0;
84-
});
82+
return classes.reduce<ControllerMetadataArgs[]>((ctrls, cls) => {
83+
const ctrl = this.controllers.find(ctrl => ctrl.target === cls);
84+
if (ctrl) ctrls.push(ctrl);
85+
return ctrls;
86+
}, []);
8587
}
8688

8789
/**
+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import { Server as HttpServer } from 'http';
2+
import HttpStatusCodes from 'http-status-codes';
3+
import { Controller } from '../../src/decorator/Controller';
4+
import { Get } from '../../src/decorator/Get';
5+
import { createExpressServer, getMetadataArgsStorage } from '../../src/index';
6+
import { axios } from '../utilities/axios';
7+
import DoneCallback = jest.DoneCallback;
8+
9+
describe(``, () => {
10+
let expressServer: HttpServer;
11+
12+
describe('loaded direct from array', () => {
13+
let controllerOrder: number[];
14+
15+
beforeEach(() => {
16+
controllerOrder = [];
17+
});
18+
19+
beforeAll((done: DoneCallback) => {
20+
getMetadataArgsStorage().reset();
21+
22+
@Controller()
23+
class ThirdController {
24+
@Get('/*')
25+
getAll() {
26+
controllerOrder.push(3);
27+
return 'OK';
28+
}
29+
}
30+
31+
@Controller()
32+
class SecondController {
33+
@Get('/second/*')
34+
getAll() {
35+
controllerOrder.push(2);
36+
return 'OK';
37+
}
38+
}
39+
40+
@Controller()
41+
class FirstController {
42+
@Get('/second/first/*')
43+
getAll() {
44+
controllerOrder.push(1);
45+
return 'OK';
46+
}
47+
}
48+
49+
expressServer = createExpressServer({
50+
controllers: [FirstController, SecondController, ThirdController],
51+
}).listen(3001, done);
52+
});
53+
54+
afterAll((done: DoneCallback) => expressServer.close(done));
55+
56+
it('should call controllers in order defined by items order', async () => {
57+
await axios.get('/second/first/any');
58+
await axios.get('/second/any');
59+
await axios.get('/any');
60+
expect(controllerOrder).toEqual([1, 2, 3]);
61+
});
62+
});
63+
});

0 commit comments

Comments
 (0)