Skip to content

Commit

Permalink
fix: create controllers in specified order
Browse files Browse the repository at this point in the history
  • Loading branch information
getfatday committed Sep 16, 2021
1 parent cf1117d commit e13b988
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 3 deletions.
8 changes: 5 additions & 3 deletions src/metadata-builder/MetadataArgsStorage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,9 +79,11 @@ export class MetadataArgsStorage {
* Filters registered controllers by a given classes.
*/
filterControllerMetadatasForClasses(classes: Function[]): ControllerMetadataArgs[] {
return this.controllers.filter(ctrl => {
return classes.filter(cls => ctrl.target === cls).length > 0;
});
return classes.reduce<ControllerMetadataArgs[]>((ctrls, cls) => {
const ctrl = this.controllers.find(ctrl => ctrl.target === cls);
if (ctrl) ctrls.push(ctrl);
return ctrls;
}, []);
}

/**
Expand Down
63 changes: 63 additions & 0 deletions test/functional/controller-order.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import { Server as HttpServer } from 'http';
import HttpStatusCodes from 'http-status-codes';
import { Controller } from '../../src/decorator/Controller';
import { Get } from '../../src/decorator/Get';
import { createExpressServer, getMetadataArgsStorage } from '../../src/index';
import { axios } from '../utilities/axios';
import DoneCallback = jest.DoneCallback;

describe(``, () => {
let expressServer: HttpServer;

describe('loaded direct from array', () => {
let controllerOrder: number[];

beforeEach(() => {
controllerOrder = [];
});

beforeAll((done: DoneCallback) => {
getMetadataArgsStorage().reset();

@Controller()
class ThirdController {
@Get('/*')
getAll() {
controllerOrder.push(3);
return 'OK';
}
}

@Controller()
class SecondController {
@Get('/second/*')
getAll() {
controllerOrder.push(2);
return 'OK';
}
}

@Controller()
class FirstController {
@Get('/second/first/*')
getAll() {
controllerOrder.push(1);
return 'OK';
}
}

expressServer = createExpressServer({
controllers: [FirstController, SecondController, ThirdController],
}).listen(3001, done);
});

afterAll((done: DoneCallback) => expressServer.close(done));

it('should call controllers in order defined by items order', async () => {
await axios.get('/second/first/any');
await axios.get('/second/any');
await axios.get('/any');
expect(controllerOrder).toEqual([1, 2, 3]);
});
});
});

0 comments on commit e13b988

Please sign in to comment.