Skip to content

Commit 6e1be1f

Browse files
committed
feat(repository): add getRepository to mixin
1 parent ea617ab commit 6e1be1f

File tree

3 files changed

+32
-5
lines changed

3 files changed

+32
-5
lines changed

packages/example-todo/test/acceptance/application.test.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -121,11 +121,7 @@ describe('Application', () => {
121121
}
122122

123123
async function givenTodoRepository() {
124-
// TODO(bajtos) enhance RepositoryMixin to provide repository getter
125-
// Example usage:
126-
// todoRepo = await app.getRepository<TodoRepository>(TodoRepository.name)
127-
// See https://github.com/strongloop/loopback-next/issues/745
128-
todoRepo = await app.get<TodoRepository>('repositories.TodoRepository');
124+
todoRepo = await app.getRepository(TodoRepository);
129125
}
130126

131127
async function givenTodoInstance(todo?: Partial<Todo>) {

packages/repository/src/repository-mixin.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,16 @@ export function RepositoryMixin<T extends Class<any>>(superClass: T) {
6262
.tag('repository');
6363
}
6464

65+
/**
66+
* Retrieve the repository instance from the given Repository class
67+
*
68+
* @param repo The repository class to retrieve the instance of
69+
*/
70+
// tslint:disable-next-line:no-any
71+
async getRepository<R extends Repository<any>>(repo: Class<R>): Promise<R> {
72+
return await this.get(`repositories.${repo.name}`);
73+
}
74+
6575
/**
6676
* Add the dataSource to this application.
6777
*
@@ -139,5 +149,9 @@ export function RepositoryMixin<T extends Class<any>>(superClass: T) {
139149
export interface AppWithRepository extends Application {
140150
// tslint:disable-next-line:no-any
141151
repository(repo: Class<any>): void;
152+
// tslint:disable-next-line:no-any
153+
getRepository<R extends Repository<any>>(repo: Class<R>): Promise<R>;
154+
dataSource(dataSource: juggler.DataSource, name?: string): void;
155+
component(component: Class<{}>): void;
142156
mountComponentRepository(component: Class<{}>): void;
143157
}

packages/repository/test/unit/repository-mixin/repository-mixin.test.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,23 @@ describe('RepositoryMixin', () => {
3434
expectNoteRepoToBeBound(myApp);
3535
});
3636

37+
it('mixed class has .getRepository()', () => {
38+
const myApp = new AppWithRepoMixin();
39+
expect(typeof myApp.getRepository).to.eql('function');
40+
});
41+
42+
it('gets repository instance from app.getRepository()', async () => {
43+
const myApp = new AppWithRepoMixin();
44+
myApp
45+
.bind('repositories.NoteRepo')
46+
.toClass(NoteRepo)
47+
.tag('repository');
48+
49+
const repoInstance = await myApp.getRepository(NoteRepo);
50+
51+
expect(repoInstance).to.be.instanceOf(NoteRepo);
52+
});
53+
3754
it('binds user defined component without repository', () => {
3855
class EmptyTestComponent {}
3956

0 commit comments

Comments
 (0)