Схема прошивки разрешает конфликт путем добавления префикса - PullRequest
0 голосов
/ 08 февраля 2019

Итак, у меня есть две схемы

Схема1

type Permission {
    relation: Relation
}

enum Relation {
    ONE
    TWO
    THREE
}

Схема2

type Permission {
    relation: Relation
}

enum Relation {
    FOUR
    FIVE
    SIX
}  

Ожидаемый результат примерно такой: (но я открыт дляразличные идеи) Запросы, которые я хотел бы сделать после слияния:

{
    permissions{
        relation
    }
}

и получить результат, подобный

"permissions": [
  {
    "relation": "ONE"
  },
  {
    "relation": "SIX"
  }
]

или

"permissions": [
  {
    "relation": "schema1ONE"
  },
  {
    "relation": "schema2SIX"
  }
]

И мутациинапример:

mutation{
  createPermission(
    relation: ONE
  ){
    relation
  }
}

mutation{
  createPermission(
    relation: SIX
  ){
    relation
  }
}

или

mutation{
  createPermission(
    relation: schema1ONE
  ){
    relation
  }
}

mutation{
  createPermission(
    relation: schema2SIX
  ){
    relation
  }
}

Я пытаюсь использовать функцию transformSchema на инструментах graphql, но не могу понять это правильно:

const Schema1 = await getRemoteSchema('schema1_url', 'schema1');
const Schema2 = await getRemoteSchema('schema2_url', 'schema2');

const schemas = [Schema1, Schema2]

const schema = mergeSchemas({
  schemas: schemas,
  resolvers: {}
});

определение getRemoteSchema

export const getRemoteSchema = async (uri: string, schemaName: string): Promise<GraphQLSchema> => {
  const httpLink = new HttpLink({ uri, fetch });

  const schema = await introspectSchema(httpLink);

  const executableSchema = makeRemoteExecutableSchema({
    schema,
    httpLink,
  });

  // transform schema by renaming root fields and types
  const renamedSchema = transformSchema(
    executableSchema,
    [
      new RenameTypes(name => {
        if (name == 'Relation') {
          return schemaName + name
        } else {
          return name
        }
      }),
      // new RenameRootFields((operation, name) => `${schemaName}_${name}`)
    ]
  );

  return renamedSchema;
}    

Я сделал этот глюк https://glitch.com/edit/#!/schema-stitching-conflict Так что легче увидеть проблему.

1 Ответ

0 голосов
/ 12 февраля 2019

В настоящее время я не вижу простого способа добиться желаемого поведения с помощью graphql-tools , потому что при реализации mergeSchemas() опция onTypeConflict была сначала устарелаа затем удалил , хотя он все еще существует в общедоступном интерфейсе.С помощью этой опции мы смогли просто передать обратный вызов, который знал о конфликтующих типах и их соответствующих AST.

transformSchema() однако, когда вы попытаетесь его использовать, мы будем переименовывать только имена типов перечислений, но незначения перечисления.Скорее всего, вам потребуется реализовать собственное преобразование, а не использовать заранее определенное для достижения ваших целей.Я хотел бы рекомендовать взглянуть на реализацию из ConvertEnumValues.Это может дать вам лучшее представление о том, как ходить и управлять AST в соответствии с вашими потребностями при реализации вашей собственной Transform.

Например, я бы рассмотрел реализацию, которая отслеживает все GraphQlEnumTypes, что онавидел и глубоко сливает их, если встречает столкновение имен.Либо вы отслеживаете использование переменных в области видимости модуля или свойства экземпляра в Transform.Если вы сделаете последнее, не забудьте заранее создать его экземпляр и передать его последующим tranformSchema() вызовам по ссылке.

...