Skip to content

Commit 695a430

Browse files
Dilukaclaude
andcommitted
refactor: simplify reference resolver by removing backward compatibility
- Remove optional ExecutionContext parameter, make it required - Always use DataLoader for reference resolution, no fallback to getById - Simplify tests to always provide context, matching real-world usage - Reduce code complexity while maintaining full DataLoader functionality - All tests pass, confirming the simplified approach works correctly 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 0a3a1fa commit 695a430

File tree

2 files changed

+17
-43
lines changed

2 files changed

+17
-43
lines changed

packages/query-graphql/__tests__/resolvers/reference.resolver.spec.ts

Lines changed: 6 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -36,21 +36,7 @@ describe('ReferenceResolver', () => {
3636
describe('#resolveReference', () => {
3737
const createContext = (): ExecutionContext => ({}) as unknown as ExecutionContext
3838

39-
it('should call the service getById with the provided input (without context)', async () => {
40-
const { resolver, mockService } = await createResolverFromNest(TestResolver)
41-
const id = 'id-1'
42-
const output: TestResolverDTO = {
43-
id,
44-
stringField: 'foo'
45-
}
46-
when(mockService.getById(id)).thenResolve(output)
47-
// @ts-ignore
48-
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/naming-convention
49-
const result = await resolver.resolveReference({ __type: 'TestReference', id })
50-
return expect(result).toEqual(output)
51-
})
52-
53-
it('should use DataLoader when context is provided', async () => {
39+
it('should use DataLoader to resolve reference', async () => {
5440
const { resolver, mockService } = await createResolverFromNest(TestResolver)
5541
const context = createContext()
5642
const id = 'id-1'
@@ -59,7 +45,6 @@ describe('ReferenceResolver', () => {
5945
stringField: 'foo'
6046
}
6147

62-
// Mock the query method for DataLoader with proper ts-mockito syntax
6348
when(mockService.query(anything())).thenResolve([output])
6449

6550
// @ts-ignore
@@ -69,26 +54,21 @@ describe('ReferenceResolver', () => {
6954
})
7055

7156
it('should reject if the id is not found', async () => {
72-
const { resolver, mockService } = await createResolverFromNest(TestResolver)
73-
const id = 'id-1'
74-
const output: TestResolverDTO = {
75-
id,
76-
stringField: 'foo'
77-
}
78-
when(mockService.getById(id)).thenResolve(output)
57+
const { resolver } = await createResolverFromNest(TestResolver)
58+
const context = createContext()
59+
7960
// @ts-ignore
8061
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/naming-convention
81-
return expect(resolver.resolveReference({ __type: 'TestReference' })).rejects.toThrow(
62+
return expect(resolver.resolveReference({ __type: 'TestReference' }, context)).rejects.toThrow(
8263
'Unable to resolve reference, missing required key id for TestResolverDTO'
8364
)
8465
})
8566

86-
it('should reject if entity is not found when using DataLoader', async () => {
67+
it('should reject if entity is not found', async () => {
8768
const { resolver, mockService } = await createResolverFromNest(TestResolver)
8869
const context = createContext()
8970
const id = 'id-not-found'
9071

91-
// Mock the query method to return empty array
9272
when(mockService.query(anything())).thenResolve([])
9373

9474
// @ts-ignore

packages/query-graphql/src/resolvers/reference.resolver.ts

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ export const Referenceable =
3333
@ResolveReference()
3434
async resolveReference(
3535
representation: RepresentationType,
36-
@Context() context?: ExecutionContext,
36+
@Context() context: ExecutionContext,
3737
@InjectDataLoaderConfig()
3838
dataLoaderConfig?: DataLoaderOptions
3939
): Promise<DTO> {
@@ -42,25 +42,19 @@ export const Referenceable =
4242
throw new BadRequestException(`Unable to resolve reference, missing required key ${key} for ${baseName}`)
4343
}
4444

45-
// If context is available, use DataLoader for batching
46-
if (context) {
47-
const loader = DataLoaderFactory.getOrCreateLoader(
48-
context,
49-
loaderName,
50-
() => referenceLoader.createLoader(this.service),
51-
dataLoaderConfig
52-
)
45+
const loader = DataLoaderFactory.getOrCreateLoader(
46+
context,
47+
loaderName,
48+
() => referenceLoader.createLoader(this.service),
49+
dataLoaderConfig
50+
)
5351

54-
const result = await loader.load({ id: id as string | number })
55-
if (!result) {
56-
throw new BadRequestException(`Unable to find ${baseName} with ${key}: ${String(id)}`)
57-
}
58-
59-
return result
52+
const result = await loader.load({ id: id as string | number })
53+
if (!result) {
54+
throw new BadRequestException(`Unable to find ${baseName} with ${key}: ${String(id)}`)
6055
}
6156

62-
// Fallback to original behavior when context is not available (for backward compatibility)
63-
return this.service.getById(representation[key] as string | number)
57+
return result
6458
}
6559
}
6660

0 commit comments

Comments
 (0)