#graphql
Вопрос:
Я работаю над созданием API GraphQL. Опыт в основном хороший, но я изо всех сил пытаюсь найти обычный, но способный и подходящий способ выявления мутаций в свойствах объекта типа, имеющего множество подтипов, в частности, как указать конкретный экземпляр, который должен быть «установлен» (или добавлен, или удален) в поле «ссылка».
Рассмотрим следующую простую схему:
interface Pet {
id: ID
name: String
}
type Dog implements Pet {
id: ID
name: String
}
type Cat implements Pet {
id: ID
name: String
}
type Person {
id: ID
pet: Pet
}
Как должна выглядеть мутация, из-за которой у человека появляется домашнее животное? Я склоняюсь к тому, что описано здесь https://blog.logrocket.com/supporting-opt-in-nested-mutations-in-graphql/ поскольку у меня есть очень обширная схема для работы со многими различными мутациями и описанными вложениями, она может очень хорошо организовать вещи. Я полностью контролирую параллелизм, поэтому меня это не беспокоит.
Полиморфизм по-прежнему представляет проблему. Как бы можно было отличить установку/добавление/удаление собак от кошек? Обратите внимание, что я не хочу гарантировать, что необработанные идентификаторы уникальны более чем для одного типа (даже если они действительно могут быть), так как это может измениться в будущем.
Например:
Матрица аргументов для каждого поля-подтипа:
set1(input: { petCat: "1111" }) { id }
set1(input: { petDog: "2222" }) { id }
Проблема, не может быть и того, и другого, и я не знаю типов ввода объединения:
set1(input: { petCat: "1111" petDog: "2222" }) { id }
Гнездовые мутации, чтобы содержались аргументы для каждого типа?
set2 { pet(input: { cat: "1111" }) { id } }
set2 { pet(input: { dog: "2222" }) { id } }
Гнездиться глубже?
set3 { pet { setCat(id: "1111") { id } }
set3 { pet { setDog(id: "2222") { id } }
Определите тип, используя перечисление разрешенных типов? Сколько перечислений? Один глобальный или для каждого поля?
set4 { pet(input: { petType: Cat id: "1111" }) { id } }
set4 { pet(input: { petType: Dog id: "2222" }) { id } }
Use plain ol’ type names? I don’t like this, no checking at all…
set5 { pet(input: { petType: "Cat" id: "1111" }) { id } }
set5 { pet(input: { petType: "Dog" id: "2222" }) { id } }
Embed type inside id?
set5 { pet(input: { id: "cat:1111" }) { id } }
set5 { pet(input: { id: "dog:2222" }) { id } }
or
set1b(input: { pet: "cat:1111" }) { id }
set1b(input: { pet: "dog:2222" }) { id }
or
set2b { pet(input: { id: "cat:1111" }) { id } }
set2b { pet(input: { id: "dog:2222" }) { id } }
Treat those as queries?
set6 { pet { set { cat(...query criteria...) { what here? } } } }
set6 { pet { set { dog(...query criteria...) { what here? } } } }
I think I outlined my conundrum well. Can anyone help?