google / rejoiner

Generates a unified GraphQL schema from gRPC microservices and other Protobuf sources
https://google.github.io/rejoiner/
Apache License 2.0
3.67k stars 139 forks source link

Question: TypeModifcation - Replace field with context #112

Open pLeminoq opened 3 years ago

pLeminoq commented 3 years ago

Hello,

we have the issue, that we want to replace a field in our protobuf types depending on the context (the DateFetchingEnvironment). The use case for this is that our type contains a map of languages to labels. We want to resolve the label as a string depending on the Accept-Language Header sent by the client and thus need the context of the request for the type modification. As far as I understand it, if we use Type.find(...).replaceField(...) we need to implement type coercing which does not have access to the context. Our approach was to implement two SchemaModifications:

  1. Remove the label field:
    @SchemaModification
    TypeModification removeMultiLanguageLabel = Type.find(....).removeField("label");
  2. Re-add the label field as a String
    @SchemaModification(addField = "label", onType = ...)
    String addLabel(... type, DataFetchingEnvironment env) {
    return LabelProcessor.getBestMatch(env.getContext().getLanguageCode(), type.getLabel());  
    }

    However, it seems we cannot guarantee the order in which the modifications are executed.

Is there a solution to this problem that we overlook? Otherwise, would it be possible to add a parameter to the SchemaModifcation Annotation that ensures the order in which they are applied?