У нас есть сервер 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.
Каков наилучший подход в этом случае?