Как написать последовательные мутации в Apollo / GraphQL? - PullRequest
0 голосов
/ 18 октября 2019

У нас есть сервер apollo, подключенный к нескольким микросервисам.

Для этого вопроса предположим, что у нас есть конечная точка createAccount, которая создает Account с User на микросервисе учетной записи, и у нас есть конечная точка createUser, которая создает пользователя на микросервисе пользователя.

В настоящее время мы имеем преобразователи мутаций, подключенные к каждой конечной точке выше. То есть мы поддерживаем:

mutation { createAccount(user: User) }
mutation { createUser(...) }

Бизнес-правило состоит в том, что для каждой учетной записи должен быть хотя бы один пользователь. Регистрация клиента требует от нас сначала создать объект User клиента, а затем впоследствии создать объект Account клиента с User от предыдущего.

Мы пытаемся найти лучший способ реализовать это.

Для целей этого вопроса давайте предположим, что каждая конечная точка никогда не выйдет из строя.

Подход 1:

Клиент пользовательского интерфейса отправит две отдельные мутации для createUserи createAccount в последовательном порядке. Нам это особенно не нравится, так как мы хотели бы воздержаться от использования бизнес-логики в пользовательском интерфейсе.

Подход 2:

Напишите преобразователь, который подключается к обеим конечным точкам. Это не СУХО, поскольку у нас уже есть два резольвера для обеих конечных точек. Но мы считаем, что это, вероятно, лучший вариант с нашим ноу-хау.

Подход 3:

Микросервис учетной записи предоставит конечную точку, которая отвечает за создание User для пользователя. Microservice. Мы не хотим делать это, так как это объединяет микросервисы.

Идеально:

Мы думаем, что наличие единственной строки мутации, которая делает это автоматически, было бы идеально:

mutation {
    createUser(x),
    createAccount(...) //would like to pass createUser return object into createAccount
}

Я не уверен, возможно ли что-то подобное в GraphQL и Apollo.

Каков наилучший подход в этом случае?

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