(Apollo) Схема слияния GraphQL - PullRequest
       6

(Apollo) Схема слияния GraphQL

0 голосов
/ 25 сентября 2018

Я использую инструменты / библиотеки GraphQL, предлагаемые Apollo.

Возможно ли объединить удаленную схему GraphQL во вложенную структуру?

Предположим, у меня есть n удаленные схемы, и я хотел бы объединить Query, Mutation и Subscription из разных схем в одну схему, за исключением того, что каждая удаленная схема размещается под собственной type.

Предположим, у нас есть удаленная схема с именем MenuX с:

type Item {
  id: Int!
  description: String
  cost: Int
}

type Query {
  items: [Item]
}

и удаленная схема с именем MenuY с:

type Item {
  id: Int!
  name: String
  cost: Int
}

type Query {
  items: [Item]
}

Я хотел бы объединить схему в одну схему, но под свои собственные типы.Придуманный пример:

type MenuXItem {
  id: Int!
  description: String
  cost: Int
}

type MenuYItem {
  id: Int!
  name: String
  cost: Int
}

type MenuXQuery {
  items: [MenuXItem]
}

type MenuYQuery {
  items: [MenuYItem]
}

type Query {
  MenuX: MenuXItem
  MenuY: MenuYItem
}

Как мы видим, под типом Query он содержит два новых типа, которые содержат тип запроса из удаленных схем.Item из схемы MenuX были переименованы с использованием преобразователей из graphql-tools, аналогично Item из схемы MenuY также было преобразовано.

Но возможно ли также преобразовать структуру?

В реальных удаленных схемах мы рассматриваем сотни типов из каждой схемы, и в идеале я бы не хотел загрязнятькорневые типы и документация Introspection в GraphiQL.

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

Возможно получить схему, где тип Query имеет корневые поля в качестве точек входа в исходные схемы, но только для типа Query, так как тип Mutation не поддерживает вложение мутаций под именами.

По этой причине префикс имен является предпочтительным решением для сшивания схемы.

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

Существует плагин для Gatsby, который содержит преобразователь, который делает то, что вы хотите: https://github.com/gatsbyjs/gatsby/blob/master/packages/gatsby-source-graphql/src/transforms.js

. Это пространство имен типов существующих схем GraphQL, так что вы получите:

type Namespace1Item {
    ...
}

type Namespace2Item {
    ...
}

type Namespace1Query {
    items: [Namespace1Item]
}

type Namespace2Query {
    items: [Namespace2Item]
}

type Query {
    namespace1: Namespace1Query
    namespace2: Namespace2Query
}

Итак, если вы преобразуете свои схемы, а они объединяют их, у вас все получится.

0 голосов
/ 26 сентября 2018

Apollo graphql-tools включает в себя модуль для преобразования схем .Вы должны иметь возможность переименовать все в MenuX с помощью чего-то вроде

import {
  makeRemoteExecutableSchema,
  transformSchema,
  RenameTypes
} from 'graphql-tools';
const schema = makeRemoteExecutableSchema(...);
const menuXSchema = transformSchema(schema, [
  RenameTypes((name) => `MenuX${name}`)
]);

Тогда вы можете использовать преобразованную схему в качестве входных данных для mergeSchemas.

Обратите внимание, что типы Query и Mutation верхнего уровня являются чем-то особенным, и вы можете попытаться объединить эти типы напрямую, не переименовывая их, особенно если они не конфликтуют.

...