Модуль API AWS-Amplify: как сделать поля GraphQL уникальными?

AWS-Amplify предоставляет пару директив для создания GraphQL-API. Но я не понял, как обеспечить уникальность полей.

Я хочу сделать что-то вроде GraphCool:

type Tag @model @searchable {
  id: ID!
  label: String! @isUnique
}

Это конкретный вопрос AWS-Amplify. Дело не в том, как это сделать с помощью универсального GraphQL. Это очень конкретно о том, как это сделать с помощью модуля API AWS-Amplify. (https://aws-amplify.github.io/docs/js/api)

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
13
0
4 033
2

Ответы 2

Привет, спасибо за вопрос. По умолчанию это невозможно сделать с помощью ampify-cli, но вы можете сделать это самостоятельно, используя конвейерные преобразователи и дополнительный индекс в вашей таблице DynamoDB. Для этого необходимо выполнить следующие действия:

  1. Создайте GSI в таблице, где меткой является HASH KEY.
  2. Создайте преобразователь конвейера в поле Mutation.createTag в вашей схеме. Вы можете отключить автоматически сгенерированную мутацию Mutation.createTag, изменив определение @model на @model(mutations: { update: "updateTag", delete: "deleteTag" }).
  3. Создайте функцию с именем LookupLabel, которая выдает Query против нового GSI, где label = $ctx.args.input.label. Если это возвращает значение, выдает ошибку с $util.error("Label is not unique"). Если он не возвращает значений, продолжайте.
  4. Создайте функцию с именем CreateTag, которая выдает PutItem для таблицы тегов.
  5. Добавьте эти две функции в свой преобразователь конвейера.

Вы можете узнать больше о конвейерных преобразователях здесь https://docs.aws.amazon.com/appsync/latest/devguide/pipeline-resolvers.html.

На момент написания статьи ampify еще не поддерживает настраиваемые преобразователи и преобразователи конвейеров, но вы можете узнать больше об этой функции здесь https://github.com/aws-amplify/amplify-cli/issues/574, поскольку она будет поддерживаться в будущем. На данный момент вы можете добавить преобразователь вручную в консоль AWS AppSync или с помощью собственного шаблона CloudFormation, который нацелен на идентификатор API, созданный Amplify. Также было бы полезно создать здесь проблему (https://github.com/aws-amplify/amplify-cli/issues) и пометить это как запрос функции, потому что это можно было бы автоматизировать с помощью директивы @unique, но это необходимо запланировать.

Спасибо

Спасибо за детальную проработку! Я считаю, что Amplify и сервисы AWS очень мощные, но опыт разработчиков ужасен. Каждый модуль имеет сложную конфигурацию и / или обработку, и я никогда не чувствовал такой боли при разработке. Мне очень нравится концепция и идея, лежащая в ее основе, но это была последняя капля. Я удалю Amplify и все модули (кроме хостинга) и выберу более «традиционный» подход. Я не справляюсь с этим.

Philip Claren 04.01.2019 21:33

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

mparis 04.01.2019 21:59

Да, конечно. Как я уже сказал, мне нравится эта идея, и я хотел бы, чтобы она превратилась во что-то более легкое и интуитивно понятное в использовании. Я перечислил большинство своих баллов @ jaypad.io/ok11k7rhp4ujuj54

Philip Claren 04.01.2019 22:40

Спасибо за более подробные примечания, они очень полезны. Я потрачу некоторое время, чтобы просмотреть и обдумать эти комментарии, и, возможно, задам новые вопросы. Спасибо за ваш отзыв.

mparis 07.01.2019 20:19

Видео об этом тоже было бы здорово. ?

Chance Smith 15.03.2019 19:46

Прошло больше года, а прогресса нет?

Cihad Turhan 18.07.2020 02:52

Я считаю, что процесс добавления настраиваемых преобразователей теперь упростился с помощью GraphQL Transformer, но было бы очень полезно более четкое объяснение того, как добавить один, чтобы обеспечить уникальное поле.

ianmartorell 06.08.2020 12:51

В конечном итоге я буду тестировать это, чтобы увидеть, работает ли это, но вы могли бы сделать что-то вроде переименования идентификатора в строку! так...

type Tag @model @key["id"] {
id: String!
}

или:

type Customer @model @key(fields: ["email"]) {
email: String!
username: String
}

этот второй взят непосредственно из документации: https://docs.amplify.aws/cli/graphql-transformer/key#designing-data-models-using-key
Документы были обновлены недавно, поэтому, надеюсь, их будет легче понять.

Это работает только для первичного ключа. Таким образом нельзя добавить дополнительные уникальные индексы.

ataravati 21.10.2021 22:54

Другие вопросы по теме