4
votes

Comment obtenir des champs createdAt, updatedAt et owner à partir de documents GraphQL générés par AWS Amplify?

J'ai utilisé AWS Amplify pour créer une API GraphQL. Dans DynamoDB, les champs createdAt, updatedAt et owner sont créés automatiquement. Hors de la boîte, je n'ai aucun moyen d'obtenir les valeurs pour ces champs. Maintenant, lorsque j'ajouterai ces champs au schéma annoté, je pourrai obtenir les valeurs, mais tout le monde avec des autorisations d'écriture peut simplement les écraser, ce qui est ennuyeux pour les champs de temps et un risque de sécurité pour le champ de propriétaire.

Comment puis-je obtenir ces valeurs?

Il s'agit d'une question spécifique à AWS-Amplify. Il ne s'agit pas de savoir comment faire cela avec GraphQL générique. Il s'agit très précisément de savoir comment faire cela avec le module API d'AWS-Amplify et leurs directives (malheureusement très limitées) ( https://aws-amplify.github.io/docs/js/api#using-graphql-transformers ).


2 commentaires

Cela ne vous aiderait-il pas si vous déplaçiez votre entrée dans un type d'entrée? Être capable d'interroger ne devrait pas entraîner de modification dans graphql.


Je ne sais pas comment faire cela avec Amplify.


3 Réponses :


-1
votes

Créez deux interfaces graphql, l'une est publique et n'expose que les requêtes, mutations et abonnements que vous souhaitez exposer à l'application / aux utilisateurs. C'est là que va toute votre logique métier, écrite dans les résolveurs pour garantir que les champs tels que les horodatages ne sont pas écrasés.

Le second est plus complet et n'est exposé et utilisé que par votre interface graphql publique.

Voici comment Yoga / Prisma fonctionnent ensemble.


2 commentaires

Encore une fois, je ne sais pas comment faire cela avec amplify. Je devrais peut-être insister davantage sur ce point dans la question.


Ok, compris. Je ne connais pas vraiment Amplify, mais je vais voir si je peux demander à Nader de regarder votre question. Il travaille dans l'équipe Amplify



0
votes

Pour obtenir ces données, vous devez avoir une sorte de type et de requête correspondants dans le schéma.

Je sais que vous avez mentionné que vous ne souhaiteriez pas les avoir dans le schéma pour des raisons telles qu'un risque de sécurité, mais en réalité, tout champ dont vous disposez dans votre schéma est ouvert à la modification pour toute personne ayant accès à l'API.

Ma suggestion serait de permettre à vos développeurs travaillant sur le projet d'utiliser un nouvel environnement utilisant le nouveau support Multi Environment de la CLI Amplify afin d'avoir une API distincte qui ne soit pas exposée en production pour éviter les problèmes avec les changements de rupture de votre Schéma principal.


0 commentaires

3
votes

Vous devriez remplacer le résolveur de création comme ceci:

Au lieu de:

## Automatically set the updatedAt timestamp. **
$util.qr($context.args.input.put("updatedAt", $util.time.nowISO8601()))

Vous devriez:

## Automatically set the updatedAt timestamp. **
$util.qr($context.args.input.put("updatedAt", $util.defaultIfNull($ctx.args.input.updatedAt, $util.time.nowISO8601())))

Dans le résolveur de mise à jour

Au lieu de:

## [Start] Prepare DynamoDB PutItem Request. **
$util.qr($context.args.input.put("createdAt", $util.time.nowISO8601()))
$util.qr($context.args.input.put("updatedAt", $util.time.nowISO8601()))

Vous devriez:

## [Start] Prepare DynamoDB PutItem Request. **
$util.qr($context.args.input.put("createdAt", $util.defaultIfNull($ctx.args.input.createdAt, $util.time.nowISO8601())))
$util.qr($context.args.input.put("updatedAt", $util.defaultIfNull($ctx.args.input.updatedAt, $util.time.nowISO8601())))

aws-amplify-overriding-auto-generated p >

PS Placez les nouveaux résolveurs dans le dossier / resolvers. Pas dans / build / resolvers


0 commentaires