Каков обычный способ выявления мутаций в полиморфных связях в GraphQL?

#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?