Skip to content

Commit 4830cd9

Browse files
author
hirsch88
committed
fix dataloaders for multiple results
1 parent aac4a76 commit 4830cd9

File tree

5 files changed

+20
-31
lines changed

5 files changed

+20
-31
lines changed

src/api/types/PetType.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export const PetType = new GraphQLObjectType({
3535
type: OwnerType,
3636
description: 'The owner of the pet',
3737
resolve: (pet: Pet, args: any, context: GraphQLContext<any, any>) =>
38-
context.dataLoaders.users.load(pet.userId),
38+
context.dataLoaders.user.load(pet.userId),
3939
},
4040
} }),
4141
});

src/api/types/UserType.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export const UserType = new GraphQLObjectType({
3434
description: 'The pets of a user',
3535
resolve: async (user: User, args: any, context: GraphQLContext<any, any>) =>
3636
// We use data-loaders to save db queries
37-
context.dataLoaders.petByUserIds.loadMany([user.id]),
37+
context.dataLoaders.petsByUserIds.load(user.id),
3838
// This would be the case with a normal service, but not very fast
3939
// context.container.get<PetService>(PetService).findByUser(user),
4040
},

src/lib/graphql/dataloader.ts

Lines changed: 0 additions & 21 deletions
This file was deleted.

src/lib/graphql/index.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import { Container as container, ObjectType } from 'typedi';
66
import { getCustomRepository, getRepository, Repository } from 'typeorm';
77

88
import { getFromContainer } from './container';
9-
import { ensureInputOrder } from './dataloader';
109
import { getErrorCode, getErrorMessage, handlingErrors } from './graphql-error-handling';
1110
import { GraphQLContext, GraphQLContextDataLoader } from './GraphQLContext';
1211
import { importClassesFromDirectories } from './importClassesFromDirectories';
@@ -29,10 +28,16 @@ export * from './container';
2928
// Main Functions
3029
// -------------------------------------------------------------------------
3130

31+
export interface CreateDataLoaderOptions {
32+
method?: string;
33+
key?: string;
34+
batch?: boolean;
35+
}
36+
3237
/**
3338
* Creates a new dataloader with the typorm repository
3439
*/
35-
export function createDataLoader<T>(obj: ObjectType<T>, method?: string, key?: string): DataLoader<any, any> {
40+
export function createDataLoader<T>(obj: ObjectType<T>, options: CreateDataLoaderOptions = {}): DataLoader<any, any> {
3641
let repository;
3742
try {
3843
repository = getCustomRepository<Repository<any>>(obj);
@@ -46,13 +51,14 @@ export function createDataLoader<T>(obj: ObjectType<T>, method?: string, key?: s
4651

4752
return new DataLoader(async (ids: number[]) => {
4853
let items = [];
49-
if (method) {
50-
items = await repository[method](ids);
54+
if (options.method) {
55+
items = await repository[options.method](ids);
5156
} else {
5257
items = await repository.findByIds(ids);
5358
}
5459

55-
return ensureInputOrder(ids, items, key || 'id');
60+
const handleBatch = (arr: any[]) => options.batch === true ? arr : arr[0];
61+
return ids.map(id => handleBatch(items.filter(item => item[options.key || 'id'] === id)));
5662
});
5763
}
5864

src/loaders/graphqlLoader.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,13 @@ export const graphqlLoader: MicroframeworkLoader = (settings: MicroframeworkSett
1616
queries: env.app.dirs.queries,
1717
mutations: env.app.dirs.mutations,
1818
dataLoaders: {
19-
users: createDataLoader(UserRepository),
20-
pets: createDataLoader(Pet),
21-
petByUserIds: createDataLoader(PetRepository, 'findByUserIds', 'userId'),
19+
user: createDataLoader(UserRepository),
20+
pet: createDataLoader(Pet),
21+
petsByUserIds: createDataLoader(PetRepository, {
22+
method: 'findByUserIds',
23+
key: 'userId',
24+
batch: true,
25+
}),
2226
},
2327
});
2428

0 commit comments

Comments
 (0)