GraphQL CodeGen - выполнить одну и ту же мутацию произвольное количество раз с помощью одного запроса
Я определил мутацию, которая позволяет пользователям дублировать свои продукты, по одному продукту за раз:
mutation DuplicateProduct($productID: ID!) {
duplicateProduct(productID: $productID) {
id
}
}
Теперь мне нужно реализовать функцию, которая позволила бы пользователям дублировать сразу несколько продуктов.
Одним из очевидных решений является изменение схемы для приема нескольких идентификаторов продуктов. По возможности я бы хотел избежать этой работы.
Другой вариант - просто опубликовать одну и ту же мутацию несколько раз подряд, но похоже, что с тем, как CodeGen генерирует службы мутации, мне пришлось бы отправлять несколько отдельных HTTP-запросов.
У меня такой вопрос: можно ли объединить динамическое количество мутаций в один запрос с помощью сервисов, созданных CodeGen? Похоже, пакетирование было бы простым, если бы я не использовал CodeGen, поскольку я мог бы просто динамически создавать определение мутации на лету. Однако CodeGen, похоже, применяет довольно статические определения операций.
Есть ли хороший способ достичь того, что я ищу? Возможно, я тоже ошибаюсь в этом, поэтому, если для большинства решений graphql-y действительно требуется редизайн схемы, я был бы счастлив, если бы кто-то указал мне на это.
2 ответа
Думайте о генерации кода как о средстве разработки, а не как о библиотеке времени выполнения, поэтому он должен обеспечивать типизацию и генерировать код. Упомянутые вами функциональные возможности относятся к поведению вашего приложения во время выполнения.
GraphQL-Codegen не поддерживает такого рода функциональные возможности, но вы можете создать собственный плагин, который будет создавать сгруппированные операции, которые вам нужны (https://graphql-code-generator.com/docs/custom-codegen/index).
Я считаю, что лучший способ групповой работы во время выполнения - использовать пакетное решение. Если вы используете Apollo-Client, вы можете использоватьapollo-link-batch-http
(https://www.apollographql.com/docs/link/links/batch-http/), и он сгруппирует операции GraphQL, которые выполняются вместе (вы можете настроить временной интервал).
Оптимальное решением является создание нового поля мутации, чтобы поддержать эту функцию, потому что таким образом можно оптимизировать, как приложение делает фактическую операцию записи (т.е. один вызов базы данных вместо нескольких). В случае, если ваш источник данных требует, чтобы вы отправляли к нему несколько запросов для каждого продукта независимо от того, вы можете захотеть отменить всю работу, которая была сделана, если какая-либо отдельная операция не удалась.
Предполагая, что вы используете клиент Apollo, вы также можете использовать ссылку, которая выполняет пакетную обработку, так что даже если вы делаете отдельные вызовы службы мутации, они будут объединены в один запрос GraphQL.
Если вам нужен какой-то способ выполнять динамические операции с генерацией кода, вы можете отправить проблему с запросом функции. Однако это кажется крайним случаем - если в схеме отсутствуют функции, необходимые клиенту, то лучше попытаться реализовать эту функциональность в схеме, а не пытаться решить ее на стороне клиента. Если вы решите это на стороне клиента, вам придется делать это один раз для каждого клиентского приложения, которое у вас есть.