web-dev-qa-db-fra.com

Résultat d'une mutation d'effacement?

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
12
Jimmy Baker

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/

3
eshaiju

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.

17
bjunc