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)


Привет, спасибо за вопрос. По умолчанию это невозможно сделать с помощью ampify-cli, но вы можете сделать это самостоятельно, используя конвейерные преобразователи и дополнительный индекс в вашей таблице DynamoDB. Для этого необходимо выполнить следующие действия:
Mutation.createTag в вашей схеме. Вы можете отключить автоматически сгенерированную мутацию Mutation.createTag, изменив определение @model на @model(mutations: { update: "updateTag", delete: "deleteTag" }).LookupLabel, которая выдает Query против нового GSI, где label = $ctx.args.input.label. Если это возвращает значение, выдает ошибку с $util.error("Label is not unique"). Если он не возвращает значений, продолжайте.CreateTag, которая выдает PutItem для таблицы тегов.Вы можете узнать больше о конвейерных преобразователях здесь 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, но это необходимо запланировать.
Спасибо
Сожалеем, что вам было трудно начать работу. Мы постоянно работаем над улучшением опыта разработчиков, и я хотел бы больше узнать об основных проблемах, которые вы обнаружили, и о том, решат ли эти новые проекты их. Если вы открыты для этого, я хотел бы выделить время для нашего разговора, чтобы мы могли услышать все ваши отзывы, чтобы помочь улучшить обслуживание. Пожалуйста, дайте мне знать, если вы заинтересованы. Спасибо.
Да, конечно. Как я уже сказал, мне нравится эта идея, и я хотел бы, чтобы она превратилась во что-то более легкое и интуитивно понятное в использовании. Я перечислил большинство своих баллов @ jaypad.io/ok11k7rhp4ujuj54
Спасибо за более подробные примечания, они очень полезны. Я потрачу некоторое время, чтобы просмотреть и обдумать эти комментарии, и, возможно, задам новые вопросы. Спасибо за ваш отзыв.
Видео об этом тоже было бы здорово. ?
Прошло больше года, а прогресса нет?
Я считаю, что процесс добавления настраиваемых преобразователей теперь упростился с помощью GraphQL Transformer, но было бы очень полезно более четкое объяснение того, как добавить один, чтобы обеспечить уникальное поле.
В конечном итоге я буду тестировать это, чтобы увидеть, работает ли это, но вы могли бы сделать что-то вроде переименования идентификатора в строку! так...
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
Документы были обновлены недавно, поэтому, надеюсь, их будет легче понять.
Это работает только для первичного ключа. Таким образом нельзя добавить дополнительные уникальные индексы.
Спасибо за детальную проработку! Я считаю, что Amplify и сервисы AWS очень мощные, но опыт разработчиков ужасен. Каждый модуль имеет сложную конфигурацию и / или обработку, и я никогда не чувствовал такой боли при разработке. Мне очень нравится концепция и идея, лежащая в ее основе, но это была последняя капля. Я удалю Amplify и все модули (кроме хостинга) и выберу более «традиционный» подход. Я не справляюсь с этим.