Quel devrait être le résultat d'une mutation de suppression dans Graphql? J'utilise la gemme graphql-Ruby. Voici un exemple de ma mutation, mais je ne suis tout simplement pas sûr de ce que je devrais retourner comme réponse.
Mutations::Brands::Delete = GraphQL::Relay::Mutation.define do
name "DeleteBrand"
description "Delete a brand"
input_field :id, types.ID
# return_field ??
resolve ->(object, inputs, ctx) {
brand = Brand.find(inputs[:id])
brand.destroy
}
end
Vous pouvez renvoyer supprimé_id ou message. S'il s'agit d'un objet associé, vous pouvez renvoyer un objet mis à jour comme dans l'exemple ci-dessous.
Destroy = GraphQL::Relay::Mutation.define do
name 'DestroyComment'
description 'Delete a comment and return post and deleted comment ID'
# Define input parameters
input_field :id, !types.ID
# Define return parameters
return_field :deletedId, !types.ID
return_field :article, ArticleType
return_field :errors, types.String
resolve ->(_obj, inputs, ctx) {
comment = Comment.find_by_id(inputs[:id])
return { errors: 'Comment not found' } if comment.nil?
article = comment.article
comment.destroy
{ article: article.reload, deletedId: inputs[:id] }
}
http://tech.eshaiju.in/blog/2017/05/15/graphql-mutation-query-implementation-Ruby-on-Rails/
Je ne pense pas qu'une norme de facto claire existe en date de juillet 2017 et je vois beaucoup de différences entre les implémentations (GitHub, Yelp, GraphCool, Shopify).
Cependant, si vous regardez certaines des API GraphQL récentes à sortir, il semble y avoir une tendance commune. En grande partie, le type d'entrée et le type de réponse sont spécifiques à la mutation. Ainsi, par exemple, pour une mutation updateBrand
, vous pouvez vous attendre à une UpdateBrandInput
et renvoyer une réponse UpdateBrandPayload
. Notez que l'entrée n'est pas BrandInput
et répond avec Brand
. Vous ne répondriez pas non plus avec un booléen scalaire (par exemple. true
en cas de succès) ou le id
de l'entité supprimée (dans le cas d'une mutation de suppression). Selon cette convention, vous pouvez avoir une mutation createBrand
, avec une réponse CreateBrandInput
et CreateBrandPayload
.
En créant des types input
et payload
spécifiques aux mutations, vous disposez d'une grande flexibilité dans les champs que vous attendez et auxquels vous répondez. Par suppression, vous pourriez avoir une réponse DeleteBrandPayload
qui inclut non seulement des champs superficiels (par exemple uniquement scalaires) de la marque, mais également d'autres données connexes (par exemple, clientMutationId
), etc.
Pour être honnête, je pense que la spécification GraphQL donne juste assez de corde pour vous accrocher, il est donc intelligent de voir comment certains des gros gars déploient cela.