Skip to content

Commit 19795a8

Browse files
author
Rick Dutour Geerling
committed
docs: test examples of code-first federation
1 parent bc6b5c9 commit 19795a8

File tree

1 file changed

+28
-26
lines changed

1 file changed

+28
-26
lines changed

content/graphql/federation.md

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -110,12 +110,12 @@ export class UsersResolvers {
110110
constructor(private usersService: UsersService) {}
111111

112112
@Query(returns => User)
113-
getUser(@Args('id') id: string) {
113+
getUser(@Args('id') id: number): User {
114114
return this.usersService.findById(id);
115115
}
116116

117117
@ResolveReference()
118-
resolveReference(reference: { __typename: string; id: string }) {
118+
resolveReference(reference: { __typename: string; id: number }): User {
119119
return this.usersService.findById(reference.id);
120120
}
121121
}
@@ -127,14 +127,15 @@ Finally, we hook everything up in a module together with a `GraphQLFederationMod
127127
import { Module } from '@nestjs/common';
128128
import { GraphQLFederationModule } from '@nestjs/graphql';
129129
import { UsersResolvers } from './users.resolvers';
130+
import { UsersService } from './users.service'; // Not included in this example
130131

131132
@Module({
132133
imports: [
133134
GraphQLFederationModule.forRoot({
134135
autoSchemaFile: true,
135136
}),
136137
],
137-
providers: [UsersResolvers],
138+
providers: [UsersResolvers, UsersService],
138139
})
139140
export class AppModule {}
140141
```
@@ -211,7 +212,7 @@ export class AppModule {}
211212
We will need to create a class representing our `User` entity. Even though it lives in another service, we will be using and extending it. Note the `@extends` and `@external` directives.
212213

213214
```ts
214-
import { Directive, Field, ID, ObjectType } from '@nestjs/graphql';
215+
import { Directive, ObjectType, Field, ID } from '@nestjs/graphql';
215216
import { Post } from './post.entity';
216217

217218
@ObjectType()
@@ -223,10 +224,10 @@ export class User {
223224
public id: number;
224225

225226
@Field(type => [Post])
226-
public posts: Post[];
227+
public posts?: Post[];
227228

228-
constructor(post: Partial<User>) {
229-
Object.assign(this, post);
229+
constructor(user: Partial<User>) {
230+
Object.assign(this, user);
230231
}
231232
}
232233
```
@@ -235,17 +236,17 @@ We create the resolver for our extension on the `User` entity as follows:
235236

236237
```ts
237238
import { Parent, ResolveField, Resolver } from '@nestjs/graphql';
238-
import { PostService } from './post.service';
239+
import { PostsService } from './posts.service';
239240
import { Post } from './post.entity';
240241
import { User } from './user.entity';
241242

242243
@Resolver(of => User)
243244
export class UsersResolvers {
244-
constructor(private readonly postService: PostService) {}
245+
constructor(private readonly postsService: PostsService) {}
245246

246247
@ResolveField(of => [Post])
247-
public posts(@Parent() user: User) {
248-
return this.postService.forAuthor(user.id);
248+
public posts(@Parent() user: User): Post[] {
249+
return this.postsService.forAuthor(user.id);
249250
}
250251
}
251252
```
@@ -269,7 +270,7 @@ export class Post {
269270
public authorId: number;
270271

271272
@Field(type => User)
272-
public user: User;
273+
public user?: User;
273274

274275
constructor(post: Partial<Post>) {
275276
Object.assign(this, post);
@@ -280,28 +281,28 @@ export class Post {
280281
And its resolver:
281282

282283
```ts
283-
import { Query, Args, ResolveReference, Resolver } from '@nestjs/graphql';
284-
import { PostService } from './post.service';
284+
import { Query, Args, ResolveField, Resolver, Parent } from '@nestjs/graphql';
285+
import { PostsService } from './posts.service';
285286
import { Post } from './post.entity';
286287
import { User } from './user.entity';
287288

288289
@Resolver(of => Post)
289-
export class PostResolver {
290-
constructor(private readonly postService: PostService) {}
290+
export class PostsResolvers {
291+
constructor(private readonly postsService: PostsService) {}
291292

292293
@Query(returns => Post)
293-
public findPost(@Args('id') id: number) {
294-
return this.postService.findOne(id);
294+
public findPost(@Args('id') id: number): Post {
295+
return this.postsService.findOne(id);
295296
}
296297

297298
@Query(returns => [Post])
298-
public getPosts() {
299-
return this.postService.all();
299+
public getPosts(): Post[] {
300+
return this.postsService.all();
300301
}
301302

302303
@ResolveField(of => User)
303-
public user(@Parent() post) {
304-
return { __typename: 'User', id: post.userId };
304+
public user(@Parent() post: Post): any {
305+
return { __typename: 'User', id: post.authorId };
305306
}
306307
}
307308
```
@@ -311,9 +312,10 @@ And finally tie it together in a module. Note the schema build options, where we
311312
```ts
312313
import { Module } from '@nestjs/common';
313314
import { GraphQLFederationModule } from '@nestjs/graphql';
314-
import { User } from './user/user.entity';
315-
import { PostResolver } from './post.resolver';
315+
import { User } from './user.entity';
316+
import { PostsResolvers } from './posts.resolvers';
316317
import { UsersResolvers } from './users.resolvers';
318+
import { PostsService } from './posts.service'; // Not included in example
317319

318320
@Module({
319321
imports: [
@@ -324,9 +326,9 @@ import { UsersResolvers } from './users.resolvers';
324326
},
325327
}),
326328
],
327-
providers: [PostResolver, UsersResolvers],
329+
providers: [PostsResolvers, UsersResolvers, PostsService],
328330
})
329-
export class ApplicationModule {}
331+
export class AppModule {}
330332
```
331333

332334
#### Federated example: Gateway

0 commit comments

Comments
 (0)