Skip to content

Commit

Permalink
update dgs implementation with latest schema changes (#177)
Browse files Browse the repository at this point in the history
Related #166
  • Loading branch information
dariuszkuc committed Aug 12, 2022
1 parent aeecfcb commit 41267c6
Show file tree
Hide file tree
Showing 10 changed files with 186 additions and 31 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import org.springframework.context.annotation.Configuration;
import com.apollographql.federation.graphqljava.tracing.FederatedTracingInstrumentation;


@Configuration
public class AppConfiguration {
@Bean
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.netflix.graphql.dgs.compatibility.datafetchers;

import com.netflix.graphql.dgs.DgsComponent;
import com.netflix.graphql.dgs.DgsEntityFetcher;
import com.netflix.graphql.dgs.DgsQuery;
import com.netflix.graphql.dgs.InputArgument;
import com.netflix.graphql.dgs.compatibility.model.DeprecatedProduct;
import java.util.Map;
import org.jetbrains.annotations.NotNull;

@DgsComponent
public class DeprecatedProductDataFetcher {

@DgsQuery(field = "deprecatedProduct")
public DeprecatedProduct getDeprecatedProduct(@InputArgument String sku, @InputArgument("package") String pkg) {
return DeprecatedProduct.resolveBySkuAndPackage(sku, pkg);
}

@DgsEntityFetcher(name = "DeprecatedProduct")
public static DeprecatedProduct resolveReference(@NotNull Map<String, Object> reference) {
if (reference.get("sku") instanceof String sku && reference.get("package") instanceof String pkg) {
return DeprecatedProduct.resolveBySkuAndPackage(sku, pkg);
}
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,33 +15,26 @@
public class ProductDataFetcher {
@DgsQuery(field = "product")
public Product getProduct(@InputArgument String id) {
return Product.getProductById(id);
return Product.resolveById(id);
}

@DgsEntityFetcher(name = "Product")
public static Product resolveReference(@NotNull Map<String, Object> reference) {
if (reference.get("id") instanceof String) {
String productId = (String) reference.get("id");
for (Product product : Product.products) {
if (product.getId().equals(productId)) {
return product;
}
}
if (reference.get("id") instanceof String id) {
return Product.resolveById(id);
} else {
String productSku = (String) reference.get("sku");

if (reference.get("package") instanceof String) {
String productPackage = (String) reference.get("package");
for (Product product : Product.products) {
if (product.getSku().equals(productSku) && product.getPackage().equals(productPackage)) {
if (reference.get("package") instanceof String pkg) {
for (Product product : Product.PRODUCTS) {
if (product.getSku().equals(productSku) && product.getPackage().equals(pkg)) {
return product;
}
}
} else if (reference.get("variation") instanceof HashMap) {
var productVariation = (HashMap) reference.get("variation");
for (Product product : Product.products) {
} else if (reference.get("variation") instanceof HashMap variation) {
for (Product product : Product.PRODUCTS) {
if (product.getSku().equals(productSku)
&& product.getVariation().getId().equals(productVariation.get("id"))) {
&& product.getVariation().getId().equals(variation.get("id"))) {
return product;
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.netflix.graphql.dgs.compatibility.datafetchers;

import com.netflix.graphql.dgs.DgsComponent;
import com.netflix.graphql.dgs.DgsEntityFetcher;
import com.netflix.graphql.dgs.compatibility.model.ProductResearch;
import java.util.HashMap;
import java.util.Map;
import org.jetbrains.annotations.NotNull;

@DgsComponent
public class ProductResearchDataFetcher {

@DgsEntityFetcher(name = "ProductResearch")
public static ProductResearch resolveReference(@NotNull Map<String, Object> reference) {
if (reference.get("study") instanceof HashMap caseStudy) {
if (caseStudy.get("caseNumber") instanceof String caseNumber) {
return ProductResearch.RESEARCH_LIST.stream()
.filter(research -> research.getStudy().getCaseNumber().equals(caseNumber))
.findAny()
.orElse(null);
}
}
return null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.netflix.graphql.dgs.compatibility.model;

public class CaseStudy {
private final String caseNumber;
private final String description;

public CaseStudy(String caseNumber, String description) {
this.caseNumber = caseNumber;
this.description = description;
}

public String getCaseNumber() {
return caseNumber;
}

public String getDescription() {
return description;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.netflix.graphql.dgs.compatibility.model;

public class DeprecatedProduct {
public static DeprecatedProduct DEPRECATED_PRODUCT = new DeprecatedProduct("apollo-federation-v1", "@apollo/federation-v1", "Migrate to Federation V2");

private final String sku;
private final String pkg;
private final String reason;
private final User createdBy;
public DeprecatedProduct(String sku, String pkg, String reason) {
this.sku = sku;
this.pkg = pkg;
this.reason = reason;
this.createdBy = User.DEFAULT_USER;
}

public String getSku() {
return sku;
}

public String getPackage() {
return pkg;
}

public String getReason() {
return reason;
}

public User getCreatedBy() {
return createdBy;
}

public static DeprecatedProduct resolveBySkuAndPackage(String sku, String pkg) {
if (DEPRECATED_PRODUCT.sku.equals(sku) && DEPRECATED_PRODUCT.pkg.equals(pkg)) {
return DEPRECATED_PRODUCT;
} else {
return null;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,25 +5,25 @@
import java.util.List;

public class Product {
public static List<Product> PRODUCTS = List.of(
new Product("apollo-federation", "federation", "@apollo/federation", "OSS"),
new Product("apollo-studio", "studio", "", "platform"));

private final String id;
private final String sku;
private final String productPackage;
private final ProductVariation variation;
private final ProductDimension dimensions;
private final User createdBy;

public static List<Product> products = List.of(
new Product("apollo-federation", "federation", "@apollo/federation", "OSS"),
new Product("apollo-studio", "studio", "", "platform"));

public Product(String id, String sku, String productPackage, String variationId) {
this.id = id;
this.sku = sku;
this.productPackage = productPackage;
this.variation = new ProductVariation(variationId);
this.dimensions = new ProductDimension("small", 1, "kg");

this.createdBy = new User("support@apollographql.com");
this.createdBy = User.DEFAULT_USER;
}

public String getId() {
Expand All @@ -50,8 +50,8 @@ public User getCreatedBy() {
return createdBy;
}

public static Product getProductById(@NotNull String productId) {
for (Product product : products) {
public static Product resolveById(@NotNull String productId) {
for (Product product : PRODUCTS) {
if (product.getId().equals(productId)) {
return product;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.netflix.graphql.dgs.compatibility.model;

import java.util.List;

public class ProductResearch {
public static final ProductResearch FEDERATION_STUDY = new ProductResearch(new CaseStudy("1234", "Federation Study"));
public static final ProductResearch STUDIO_STUDY = new ProductResearch(new CaseStudy("1235", "Studio Study"));
public static final List<ProductResearch> RESEARCH_LIST = List.of(FEDERATION_STUDY, STUDIO_STUDY);

private final CaseStudy study;
private final String outcome;

public ProductResearch(CaseStudy study) {
this.study = study;
this.outcome = null;
}

public ProductResearch(CaseStudy study, String outcome) {
this.study = study;
this.outcome = outcome;
}

public CaseStudy getStudy() {
return study;
}

public String getOutcome() {
return outcome;
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.netflix.graphql.dgs.compatibility.model;

public class User {

public static User DEFAULT_USER = new User("support@apollographql.com");
private final String email;
private final String name;
private Integer totalProductsCreated;
Expand Down
35 changes: 28 additions & 7 deletions implementations/dgs/src/main/resources/schema/products.graphql
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
extend schema
@link(url: "https://specs.apollo.dev/federation/v2.0",
import: ["@key", "@shareable", "@provides", "@external", "@tag", "@extends", "@override", "@inaccessible", "@requires"])
@link(
url: "https://specs.apollo.dev/federation/v2.0",
import: ["@extends", "@external", "@inaccessible", "@key", "@override", "@provides", "@requires", "@shareable", "@tag"]
)

type Product @key(fields: "id") @key(fields: "sku package") @key(fields: "sku variation { id }") {
id: ID!
Expand All @@ -10,23 +12,42 @@ type Product @key(fields: "id") @key(fields: "sku package") @key(fields: "sku va
dimensions: ProductDimension
createdBy: User @provides(fields: "totalProductsCreated")
notes: String @tag(name: "internal")
research: [ProductResearch!]!
}

type ProductDimension @shareable {
size: String
weight: Float
unit: String @inaccessible
type DeprecatedProduct @key(fields: "sku package") {
sku: String!
package: String!
reason: String
createdBy: User
}

type ProductVariation {
id: ID!
}

type ProductResearch @key(fields: "study { caseNumber }") {
study: CaseStudy!
outcome: String
}

type CaseStudy {
caseNumber: ID!
description: String
}

type ProductDimension @shareable {
size: String
weight: Float
unit: String @inaccessible
}

type Query {
product(id: ID!): Product
deprecatedProduct(sku: String!, package: String!): DeprecatedProduct @deprecated(reason: "Use product query instead")
}

type User @key(fields: "email") @extends {
type User @extends @key(fields: "email") {
averageProductsCreatedPerYear: Int @requires(fields: "totalProductsCreated yearsOfEmployment")
email: ID! @external
name: String @override(from: "users")
Expand Down

0 comments on commit 41267c6

Please sign in to comment.