Skip to content

Commit 65c133a

Browse files
authored
Update the nestjs implementation for new @requires / @key tests (#228)
Covers the changes outlined in #166. Fixes #192
1 parent 329da9b commit 65c133a

File tree

5 files changed

+172
-13
lines changed

5 files changed

+172
-13
lines changed
Lines changed: 46 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,54 @@
11
extend schema
2-
@link(url: "https://specs.apollo.dev/federation/v2.0",
3-
import: ["@key", "@shareable", "@provides", "@external", "@tag", "@extends", "@override", "@inaccessible"])
2+
@link(
3+
url: "https://specs.apollo.dev/federation/v2.0",
4+
import: [
5+
"@extends",
6+
"@external",
7+
"@key",
8+
"@inaccessible",
9+
"@override",
10+
"@provides",
11+
"@requires",
12+
"@shareable",
13+
"@tag"
14+
]
15+
)
416

5-
directive @override(from: String!) on FIELD_DEFINITION
17+
type Product
18+
@key(fields: "id")
19+
@key(fields: "sku package")
20+
@key(fields: "sku variation { id }") {
21+
id: ID!
22+
sku: String
23+
package: String
24+
variation: ProductVariation
25+
dimensions: ProductDimension
26+
createdBy: User @provides(fields: "totalProductsCreated")
27+
notes: String @tag(name: "internal")
28+
research: [ProductResearch!]!
29+
}
630

7-
type Product @key(fields: "id") @key(fields: "sku package") @key(fields: "sku variation { id }") {
8-
id: ID!
9-
sku: String
10-
package: String
11-
variation: ProductVariation
12-
dimensions: ProductDimension
13-
createdBy: User @provides(fields: "totalProductsCreated")
14-
notes: String @tag(name: "internal")
31+
type DeprecatedProduct @key(fields: "sku package") {
32+
sku: String!
33+
package: String!
34+
reason: String
35+
createdBy: User
1536
}
1637

1738
type ProductVariation {
1839
id: ID!
1940
}
2041

42+
type ProductResearch @key(fields: "study { caseNumber }") {
43+
study: CaseStudy!
44+
outcome: String
45+
}
46+
47+
type CaseStudy {
48+
caseNumber: ID!
49+
description: String
50+
}
51+
2152
type ProductDimension @shareable {
2253
size: String
2354
weight: Float
@@ -26,10 +57,13 @@ type ProductDimension @shareable {
2657

2758
extend type Query {
2859
product(id: ID!): Product
60+
deprecatedProduct(sku: String!, package: String!): DeprecatedProduct @deprecated(reason: "Use product query instead")
2961
}
3062

3163
extend type User @key(fields: "email") {
64+
averageProductsCreatedPerYear: Int @requires(fields: "totalProductsCreated yearsOfEmployment")
3265
email: ID! @external
33-
name: String @shareable @override(from: "users")
66+
name: String @override(from: "users")
3467
totalProductsCreated: Int @external
68+
yearsOfEmployment: Int! @external
3569
}

implementations/nestjs/src/app.module.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import {
77

88
import { UsersResolver } from "./users.resolver";
99
import { ProductsResolver } from "./products.resolver";
10+
import { ProductResearchResolver } from "./product-research.resolver";
11+
import { DeprecatedProductsResolver } from "./deprecated-products.resolver";
1012

1113
@Module({
1214
imports: [
@@ -16,6 +18,11 @@ import { ProductsResolver } from "./products.resolver";
1618
path: "/",
1719
}),
1820
],
19-
providers: [UsersResolver, ProductsResolver],
21+
providers: [
22+
UsersResolver,
23+
ProductsResolver,
24+
ProductResearchResolver,
25+
DeprecatedProductsResolver,
26+
],
2027
})
2128
export class AppModule {}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import {
2+
Args,
3+
Query,
4+
Resolver,
5+
ResolveField,
6+
ResolveReference,
7+
} from "@nestjs/graphql";
8+
9+
interface User {
10+
email: string;
11+
name: string;
12+
totalProductsCreated: number;
13+
}
14+
15+
interface DeprecatedProduct {
16+
sku: string;
17+
package: string;
18+
reason: string;
19+
createdBy: User;
20+
}
21+
22+
const user = {
23+
24+
name: "Jane Smith",
25+
totalProductsCreated: 1337,
26+
};
27+
28+
const deprecatedProduct = {
29+
sku: "apollo-federation-v1",
30+
package: "@apollo/federation-v1",
31+
reason: "Migrate to Federation V2",
32+
};
33+
34+
@Resolver("DeprecatedProduct")
35+
export class DeprecatedProductsResolver {
36+
constructor() {}
37+
38+
@Query()
39+
deprecatedProduct(
40+
@Args("sku") sku: string,
41+
@Args("package") packageName: string,
42+
) {
43+
return sku === deprecatedProduct.sku &&
44+
packageName === deprecatedProduct.package
45+
? deprecatedProduct
46+
: null;
47+
}
48+
49+
@ResolveField("createdBy")
50+
getCreatedBy() {
51+
return user;
52+
}
53+
54+
@ResolveReference()
55+
resolveReference(reference: DeprecatedProduct) {
56+
if (
57+
reference.sku === deprecatedProduct.sku &&
58+
reference.package === deprecatedProduct.package
59+
) {
60+
return deprecatedProduct;
61+
} else {
62+
return null;
63+
}
64+
}
65+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { Resolver, ResolveField, ResolveReference } from "@nestjs/graphql";
2+
3+
interface CaseStudy {
4+
caseNumber: string;
5+
description: string;
6+
}
7+
8+
interface ProductResearch {
9+
study: CaseStudy;
10+
outcome: string;
11+
}
12+
13+
const productResearch = [
14+
{
15+
study: {
16+
caseNumber: "1234",
17+
description: "Federation Study",
18+
},
19+
},
20+
{
21+
study: {
22+
caseNumber: "1235",
23+
description: "Studio Study",
24+
},
25+
},
26+
];
27+
28+
@Resolver("ProductResearch")
29+
export class ProductResearchResolver {
30+
constructor() {}
31+
32+
@ResolveField()
33+
getStudy() {
34+
return productResearch[0].study;
35+
}
36+
37+
@ResolveReference()
38+
resolveReference(reference: ProductResearch) {
39+
return productResearch.find(
40+
(p) => reference.study.caseNumber === p.study.caseNumber,
41+
);
42+
}
43+
}

implementations/nestjs/src/users.resolver.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,14 @@ export class UsersResolver {
88
getName() {
99
return "Jane Smith";
1010
}
11+
12+
@ResolveField("averageProductsCreatedPerYear")
13+
getAverageProductsCreatedPerYear({
14+
totalProductsCreated,
15+
yearsOfEmployment,
16+
}) {
17+
return totalProductsCreated
18+
? Math.round(totalProductsCreated / yearsOfEmployment)
19+
: null;
20+
}
1121
}

0 commit comments

Comments
 (0)