У меня есть мутация, которая отправляет данные формы, эти данные могут варьироваться в зависимости от формы, которую вы заполняете.
Форм будет много, и они будут иметь одни и те же «шаги» (каждая форма состоит из 1 или более страниц / шагов).
Итак, у нас могут быть эти многоразовые шаги:
И эти две формы:
genericInfo): имя и фамилия + дата рожденияwhatYouEat): имя и фамилия + избранный фруктМне нужен способ иметь единственную мутацию, которая позволяет определить имя формы и принимает объект data, который необходимо проверить на основе такого имени формы.
Например, если я назову эту мутацию:
submitForm(formName: $formName, formData: $formData) {
resultMessage
}
с formName, установленным на genericInfo, и formData, установленным на { nameAndSurname: 'Foo Bar', favFruit: 'apple' }, он должен выдать ошибку, потому что genericInfo не ожидает favFruit, а dateOfBirth.
Можно ли этого добиться с помощью GraphQL? Может быть, есть лучшие способы добраться сюда?


GraphQL не допускает этого напрямую. Типы входных объектов имеют фиксированную структуру и не имеют условной проверки (встроенной; ваша функция распознавателя может выдавать ошибки на основе собственных проверок, которые более обширны, чем в схеме).
Самый распространенный шаблон, который я видел, использует Соглашения о мутации Relay GraphQL (даже если вы не ожидаете, что ваши клиенты будут использовать Relay). У этого есть одна мутация для каждого возможного действия (в вашем случае одна мутация для каждой отправленной формы) и отдельный тип входного объекта для каждой мутации.
Также обратите внимание, что типы входных объектов могут быть вложенными, поэтому в вашем примере вы можете написать
input Name {
givenName: String!
surname: String!
}
input Fruit {
name: String!
}
input WhatYouEatInput {
name: Name!
fruit: Fruit!
}
mutation {
whatYouEat(input: WhatYouEatInput!): WhatYouEatPayload!
}
что позволит повторно использовать общие части схемы для разных типов мутаций.
Это можно было бы сделать, если бы GraphQL предоставил тип Union, который можно было бы использовать в качестве входных данных. Это было предложено раньше, но, похоже, нет планов по его реализации в ближайшем будущем.
Итак, поскольку у вас будут десятки возможных комбинаций данных формы, я думаю, что лучшим вариантом будет просто отправить строку в формате JSON с данными и выполнить проверку самостоятельно, используя некоторую структуру, которая определяет все возможные formName и его разрешенные поля.
Но таким образом вы не воспользуетесь преимуществами системы набора текста GraphQL.
Даже если мы используем тип JSON для хранения. Так сложно фильтровать данные.
Спасибо, это текущая реализация, которую я использую ... Но она не масштабируется, если у меня будет 100 форм :-(