GraphQL CodeGen - выполнить одну и ту же мутацию произвольное количество раз с помощью одного запроса

Я определил мутацию, которая позволяет пользователям дублировать свои продукты, по одному продукту за раз:

mutation DuplicateProduct($productID: ID!) {
  duplicateProduct(productID: $productID) {
    id
  }
}

Теперь мне нужно реализовать функцию, которая позволила бы пользователям дублировать сразу несколько продуктов.

Одним из очевидных решений является изменение схемы для приема нескольких идентификаторов продуктов. По возможности я бы хотел избежать этой работы.

Другой вариант - просто опубликовать одну и ту же мутацию несколько раз подряд, но похоже, что из-за того, как CodeGen генерирует службы мутации, мне придется отправлять несколько отдельных HTTP-запросов.

У меня такой вопрос: можно ли сгруппировать динамическое количество мутаций в одном запросе с помощью сервисов, созданных CodeGen? Кажется, пакетирование было бы простым, если бы я не использовал CodeGen, поскольку я мог бы просто динамически создавать определение мутации на лету. Однако CodeGen, похоже, применяет довольно статические определения операций.

Есть ли хороший способ достичь того, что я ищу? Возможно, я тоже ошибаюсь в этом, поэтому, если для большинства решений graphql-y действительно требуется редизайн схемы, я был бы счастлив, если бы кто-то указал мне на это.


person Avius    schedule 30.07.2020    source источник


Ответы (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, которые выполняются вместе (вы можете настроить временной интервал).

person Dotan Simha    schedule 30.07.2020

Оптимальным решением является создание нового поля мутации для поддержки этой функции, потому что таким образом вы можете оптимизировать то, как ваше приложение выполняет фактическую операцию записи (то есть один вызов базы данных вместо нескольких). В случае, если ваш источник данных требует, чтобы вы отправляли к нему несколько запросов для каждого продукта независимо, вы можете захотеть отменить всю работу, которая была сделана, если какая-либо отдельная операция не удалась.

Предполагая, что вы используете клиент Apollo, вы также можете использовать ссылку , которая выполняет пакетную обработку, так что даже если вы сделаете отдельные вызовы службы мутации, они будут объединены в один запрос GraphQL.

Если вам нужен какой-то способ выполнять динамические операции с генерацией кода, вы можете отправить проблему с запросом функции. Однако это кажется крайним случаем - если в схеме отсутствуют функции, необходимые клиенту, то лучше всего попытаться реализовать эту функцию в схеме, а не пытаться решить ее на стороне клиента. Если вы решите это на стороне клиента, вам придется делать это один раз для каждого клиентского приложения, которое у вас есть.

person Daniel Rearden    schedule 30.07.2020