From eeb8754f8cc8aadefc0ec3359bf6ebde47a161ee Mon Sep 17 00:00:00 2001 From: shimks Date: Mon, 2 Apr 2018 13:51:13 -0400 Subject: [PATCH] feat(repository): add getRepository to mixin --- .../test/acceptance/application.test.ts | 6 +----- packages/repository/src/repository-mixin.ts | 14 ++++++++++++++ .../repository-mixin/repository-mixin.test.ts | 17 +++++++++++++++++ 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/packages/example-todo/test/acceptance/application.test.ts b/packages/example-todo/test/acceptance/application.test.ts index 9ddd237598a5..d463e313e6ee 100644 --- a/packages/example-todo/test/acceptance/application.test.ts +++ b/packages/example-todo/test/acceptance/application.test.ts @@ -121,11 +121,7 @@ describe('Application', () => { } async function givenTodoRepository() { - // TODO(bajtos) enhance RepositoryMixin to provide repository getter - // Example usage: - // todoRepo = await app.getRepository(TodoRepository.name) - // See https://github.com/strongloop/loopback-next/issues/745 - todoRepo = await app.get('repositories.TodoRepository'); + todoRepo = await app.getRepository(TodoRepository); } async function givenTodoInstance(todo?: Partial) { diff --git a/packages/repository/src/repository-mixin.ts b/packages/repository/src/repository-mixin.ts index 92d22b7cec9c..fe9f3c6dbce5 100644 --- a/packages/repository/src/repository-mixin.ts +++ b/packages/repository/src/repository-mixin.ts @@ -62,6 +62,16 @@ export function RepositoryMixin>(superClass: T) { .tag('repository'); } + /** + * Retrieve the repository instance from the given Repository class + * + * @param repo The repository class to retrieve the instance of + */ + // tslint:disable-next-line:no-any + async getRepository>(repo: Class): Promise { + return await this.get(`repositories.${repo.name}`); + } + /** * Add the dataSource to this application. * @@ -139,5 +149,9 @@ export function RepositoryMixin>(superClass: T) { export interface AppWithRepository extends Application { // tslint:disable-next-line:no-any repository(repo: Class): void; + // tslint:disable-next-line:no-any + getRepository>(repo: Class): Promise; + dataSource(dataSource: juggler.DataSource, name?: string): void; + component(component: Class<{}>): void; mountComponentRepository(component: Class<{}>): void; } diff --git a/packages/repository/test/unit/repository-mixin/repository-mixin.test.ts b/packages/repository/test/unit/repository-mixin/repository-mixin.test.ts index ae3320963160..6056dabff0b4 100644 --- a/packages/repository/test/unit/repository-mixin/repository-mixin.test.ts +++ b/packages/repository/test/unit/repository-mixin/repository-mixin.test.ts @@ -34,6 +34,23 @@ describe('RepositoryMixin', () => { expectNoteRepoToBeBound(myApp); }); + it('mixed class has .getRepository()', () => { + const myApp = new AppWithRepoMixin(); + expect(typeof myApp.getRepository).to.eql('function'); + }); + + it('gets repository instance from app.getRepository()', async () => { + const myApp = new AppWithRepoMixin(); + myApp + .bind('repositories.NoteRepo') + .toClass(NoteRepo) + .tag('repository'); + + const repoInstance = await myApp.getRepository(NoteRepo); + + expect(repoInstance).to.be.instanceOf(NoteRepo); + }); + it('binds user defined component without repository', () => { class EmptyTestComponent {}