Skip to content

Commit

Permalink
update federation-jvm implementation with latest schema changes (#173)
Browse files Browse the repository at this point in the history
Related: #166
  • Loading branch information
dariuszkuc committed Aug 12, 2022
1 parent 80b958b commit 820f3a3
Show file tree
Hide file tree
Showing 9 changed files with 234 additions and 37 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.apollographql.federation.compatibility;

import com.apollographql.federation.compatibility.model.DeprecatedProduct;
import org.springframework.graphql.data.method.annotation.Argument;
import org.springframework.graphql.data.method.annotation.QueryMapping;
import org.springframework.graphql.data.method.annotation.SchemaMapping;
import org.springframework.stereotype.Controller;

@Controller
public class DeprecatedProductController {

@QueryMapping
public DeprecatedProduct deprecatedProduct(@Argument String sku, @Argument("package") String pkg) {
return DeprecatedProduct.resolveBySkuAndPackage(sku, pkg);
}

@SchemaMapping(typeName="DeprecatedProduct", field="package")
public String getPackage(DeprecatedProduct product) {
return product.getPkg();
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.apollographql.federation.compatibility;

import com.apollographql.federation.compatibility.model.DeprecatedProduct;
import com.apollographql.federation.compatibility.model.Product;
import com.apollographql.federation.compatibility.model.ProductResearch;
import com.apollographql.federation.compatibility.model.User;
import com.apollographql.federation.graphqljava.Federation;
import com.apollographql.federation.graphqljava._Entity;
Expand All @@ -26,19 +28,24 @@ public GraphQlSourceBuilderCustomizer federationTransform() {
Federation.transform(registry, wiring)
.fetchEntities(env ->
env.<List<Map<String, Object>>>getArgument(_Entity.argumentName).stream().map(reference -> {
if ("Product".equals(reference.get("__typename"))) {
return Product.resolveReference(reference);
} else if ("User".equals(reference.get("__typename"))) {
return User.resolveReference(reference);
} else {
return null;
}
final String typeName = (String)reference.get("__typename");
return switch (typeName) {
case "DeprecatedProduct" -> DeprecatedProduct.resolveReference(reference);
case "Product" -> Product.resolveReference(reference);
case "ProductResearch" -> ProductResearch.resolveReference(reference);
case "User" -> User.resolveReference(reference);
default -> null;
};
}).collect(Collectors.toList())
)
.resolveEntityType(env -> {
final Object src = env.getObject();
if (src instanceof Product) {
if (src instanceof DeprecatedProduct) {
return env.getSchema().getObjectType("DeprecatedProduct");
} else if (src instanceof Product) {
return env.getSchema().getObjectType("Product");
} else if (src instanceof ProductResearch) {
return env.getSchema().getObjectType("ProductResearch");
} else if (src instanceof User) {
return env.getSchema().getObjectType("User");
} else {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package com.apollographql.federation.compatibility;

import com.apollographql.federation.compatibility.model.DeprecatedProduct;
import com.apollographql.federation.compatibility.model.Product;
import org.springframework.graphql.data.method.annotation.Argument;
import org.springframework.graphql.data.method.annotation.QueryMapping;
import org.springframework.graphql.data.method.annotation.SchemaMapping;
import org.springframework.stereotype.Controller;

@Controller
Expand All @@ -12,4 +14,9 @@ public class ProductController {
public Product product(@Argument String id) {
return Product.resolveById(id);
}

@SchemaMapping(typeName="Product", field="package")
public String getPackage(Product product) {
return product.getPkg();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.apollographql.federation.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,66 @@
package com.apollographql.federation.compatibility.model;

import java.util.Map;
import org.jetbrains.annotations.NotNull;

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) {
this.sku = sku;
this.pkg = pkg;
this.reason = null;
this.createdBy = User.DEFAULT_USER;
}

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

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

public String getSku() {
return sku;
}

public String getPkg() {
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;
}
}

public static DeprecatedProduct resolveReference(@NotNull Map<String, Object> reference) {
if (reference.get("sku") instanceof String sku && reference.get("package") instanceof String pkg) {
return resolveBySkuAndPackage(sku, pkg);
}
return null;
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.apollographql.federation.compatibility.model;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
Expand All @@ -9,52 +11,57 @@
public class Product {

private static final Map<String, Product> PRODUCTS = Stream.of(
new Product("apollo-federation", "federation", "@apollo/federation", "OSS"),
new Product("apollo-studio", "studio", "", "platform")
new Product("apollo-federation", "federation", "@apollo/federation", "OSS", List.of(ProductResearch.FEDERATION_STUDY)),
new Product("apollo-studio", "studio", "", "platform", List.of(ProductResearch.STUDIO_STUDY))
).collect(Collectors.toMap(Product::getId, product -> product));

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

private final List<ProductResearch> research;

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

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

public Product(String id, String sku, String productPackage, String variationId) {
public Product(String id, String sku, String pkg, String variationId, List<ProductResearch> research) {
this.id = id;
this.sku = sku;
this.productPackage = productPackage;
this.pkg = pkg;
this.variation = new ProductVariation(variationId);
this.dimensions = new ProductDimension("small", 1, "kg");
this.createdBy = new User("support@apollographql.com");
this.createdBy = User.DEFAULT_USER;
this.research = research;
}

public Product(String sku, String productPackage) {
public Product(String sku, String pkg) {
this.id = "";
this.sku = sku;
this.productPackage = productPackage;
this.pkg = pkg;
this.variation = new ProductVariation("");
this.dimensions = new ProductDimension("small", 1, "kg");
this.createdBy = new User("support@apollographql.com");
this.createdBy = User.DEFAULT_USER;
this.research = new ArrayList<>();
}

public Product(String sku, ProductVariation variation) {
this.id = "";
this.productPackage = "";
this.pkg = "";
this.sku = sku;
this.variation = variation;
this.dimensions = new ProductDimension("small", 1, "kg");
this.createdBy = new User("support@apollographql.com");
this.createdBy = User.DEFAULT_USER;
this.research = new ArrayList<>();
}

public String getId() {
Expand All @@ -69,8 +76,8 @@ public ProductDimension getDimensions() {
return dimensions;
}

public String getProductPackage() {
return productPackage;
public String getPkg() {
return pkg;
}

public ProductVariation getVariation() {
Expand All @@ -81,6 +88,10 @@ public User getCreatedBy() {
return createdBy;
}

public List<ProductResearch> getResearch() {
return research;
}

public static Product resolveById(String id) {
return PRODUCTS.get(id);
}
Expand All @@ -92,7 +103,7 @@ public static Product resolveReference(@NotNull Map<String, Object> reference) {
String productSku = (String) reference.get("sku");
if (reference.get("package") instanceof String productPackage) {
for (Product product : PRODUCTS.values()) {
if (product.getSku().equals(productSku) && product.getProductPackage().equals(productPackage)) {
if (product.getSku().equals(productSku) && product.getPkg().equals(productPackage)) {
return product;
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.apollographql.federation.compatibility.model;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jetbrains.annotations.NotNull;

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;
}

public static ProductResearch resolveReference(@NotNull Map<String, Object> reference) {
if (reference.get("study") instanceof HashMap caseStudy) {
if (caseStudy.get("caseNumber") instanceof String caseNumber) {
return RESEARCH_LIST.stream()
.filter(research -> research.study.getCaseNumber().equals(caseNumber))
.findAny()
.orElse(null);
}
}
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
import org.jetbrains.annotations.NotNull;

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
Loading

0 comments on commit 820f3a3

Please sign in to comment.