Создание условных свойств в определении типа GraphQL - PullRequest
2 голосов
/ 12 марта 2020

Я настраиваю сервер GraphQL с использованием фреймворка Apollo.

У него будет сущность с именем Shelf. Shelf имеет shelfId и packages.

. Мне нужно иметь возможность запросить Shelves с shelfId или packageCode.

Мой источник данных может обрабатывать оба этих сценария, но я хочу иметь для этого 1 распознаватель с именем shelf.

Пример

query getShelf(shelfId: "1") {
  shelfId
}

или:

query getShelf(packageCode: "123") {
  shelfId
}

Как определить тип проверки, если установлен packageCode или shelfId?

  • Когда указано packageCode shelfId не требуется
  • Когда предоставляется shelfId packageCode не требуется
  • Когда ни один из них не предоставлен, ни один из них не требуется

Единственные варианты, которые я думаю, у меня есть:

  • A) Создайте отдельные распознаватели для каждого сценария
  • B) Сделайте их оба необязательными и верните ошибку из распознавателя.

Как мне поступить?

1 Ответ

2 голосов
/ 12 марта 2020

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

В качестве альтернативы, если оба аргумента имеют одинаковый тип, вы можете сделать что-то вроде этого:

type Query {
  getShelf(id: ID! idType: ShelfIdType!)
}

enum ShelfIdType {
  SHELF_ID
  PACKAGE_CODE
}

Не думаю, что это обязательно лучше, но это вариант, если вы хотите полагаться исключительно на систему типов GraphQL для проверки.

...