删除突变的结果?

Result of a delete mutation?

Graphql 中删除突变的结果应该是什么?我正在使用 graphql-ruby gem。这是我的突变示例,但我不确定应该返回什么作为响应。

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

您可以returndeleted_id或留言。如果它是关联对象,您可以 return 更新对象,如下例所示。

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/

我认为截至 2017 年 7 月不存在明确的事实标准,而且我发现实现之间存在很多差异(GitHub、Yelp、GraphCool、Shopify)。

但是,如果你看一下最近出现的一些 GraphQL API,似乎有一个共同的趋势。很大程度上,输入类型和响应类型特定于突变。因此,例如,对于 updateBrand 突变,您可能期望 UpdateBrandInput 和 return 响应 UpdateBrandPayload。注意,输入不是 BrandInput,而响应是 Brand。您也不会使用标量布尔值(例如 true 如果成功)或已删除实体的 id 进行响应(在删除突变的情况下)。根据这个约定,你可以有一个 createBrand 突变,一个 CreateBrandInput 和一个 CreateBrandPayload 响应。

通过创建特定于突变的 inputpayload 类型,您可以在期望和响应的字段中拥有很大的灵活性。每次删除,您可能会有一个 DeleteBrandPayload 响应,其中不仅包括品牌的浅层(例如,仅标量)字段,还包括其他相关数据(例如,clientMutationId)等。

老实说,我认为 GraphQL 规范给了你足够的绳索,所以看看一些大人物是如何推出它的是明智的。