GraphQL: лучший способ управлять мутациями с помощью интерфейсов?

Я новичок в GraphQL, но мне это очень нравится. Теперь, когда я играю с интерфейсами и объединениями, я столкнулся с проблемой мутаций.

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

interface FoodType {
  id: String
  type: String
}

type Pizza implements FoodType {
  id: String
  type: String
  pizzaType: String
  toppings: [String]
  size: String
}

type Salad implements FoodType {
  id: String
  type: String
  vegetarian: Boolean
  dressing: Boolean
}

type BasicFood implements FoodType {
  id: String
  type: String
}

Теперь я хотел бы создать новые продукты питания, поэтому я начал делать что-то вроде этого:

type Mutation {
    addPizza(input:Pizza):FoodType
    addSalad(input:Salad):FoodType
    addBasic(input:BasicFood):FoodType
}

Это не сработало по 2 причинам:

  1. Если я хочу передать объект в качестве параметра, это должен быть тип ввода. Но "Пицца", "Салат" и "BasicFood" - это просто "тип".
  2. Тип ввода не может реализовать интерфейс.

Итак, мой вопрос: как вы работаете с мутациями в этом контексте интерфейса, не слишком дублируя типы? Я хотел бы избежать использования типа Pizza для запросов и типа InputPizza для мутаций.

Спасибо за помощь.

1 ответ

Решение

Типы ввода и вывода - это принципиально разные вещи, просто потому, что у вас могут быть такие, которые представляют похожий объект (например, Pizza а также PizzaInput), это ложная эквивалентность.

Скажем в вашей схеме Pizza имеет обязательное поле идентификатора (ваши идентификаторы не являются обязательными, но, вероятно, должны быть). Это, вероятно, не имеет смысла для PizzaInput иметь поле идентификатора - оно будет сгенерировано сервером. Я хочу подчеркнуть, что во всех системах, кроме самых простых, будет происходить обработка, чтобы превратить вводимые пользователем данные в полноценный объект для возврата.

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

Другие вопросы по тегам