在GraphQL中编写突变字段的最佳做法

时间:2019-07-04 10:30:37

标签: graphql

让我们假设我具有以下模型结构:

User {
  id: int
  group: UserGroup
}

UserGroup {
  id: int
  name: string
  users: User[]
}

我希望可以执行以下操作:

  • 创建用户组
  • 修改组数据
  • 将用户添加到组
  • 从群组中删除用户
  • 从群组中删除所有用户

我想问的是:在GraphQL中为此类操作创建字段的最佳实践是什么?我正在考虑一些可能的选项(也许还有其他选择):

1。许多简单的字段

在这里,将添加许多字段。一个字段引用了上述单个动作。因此,这相对简单。

createGroup(groupId: Int!, name: String!, users: Array<User>): Group
editGroup(groupId: Int!, name: String, users: Array<User>): Group
addUserToGroup(groupId: Int!, user: User!): Group
removeUserFromGroup(groupId: Int!, userId: Int!): Group
removeAllUsersFromGroup(groupId: Int!): Group

2。资源字段

在这里,字段引用模型资源。因此,对于我们的示例,应该只有两个:

createGroup(groupId: Int!, name: String!, users: Array<User>): Group
editGroup(groupId: Int!, name: String, users: Array<User>): Group

但是在editGroup节点的情况下,用户列表始终被覆盖。因此,在前端代码中,始终必须“拥有”完整的用户列表。大家都应该知道,要实现这一目标可能会有些不堪重负。尤其是当列表中包含很多项目或在整个系统的特定部分中没有整个列表时。

3。资源字段和操作自定义类型

UsersMutationType {
  operation: (ADD|DELETE|DELETE_ALL)!,
  users: Array<int>!
}

createGroup(groupId: Int!, name: String!, users: Array<User>): Group
editGroup(groupId: Int!, name: String, users: UsersMutationType): Group

因此在这里,将创建一个单独的类型。该类型将告诉用户应该执行哪些操作(即使应该执行)。在这里,我们消除了为特定组加载整个用户列表的问题。因此,如果要删除单个用户,只需将operation定义为DELETE并将用户ID添加到users。如果要删除所有用户,我们将users留空,并将DELETE_ALL设置为操作值。

所以...回到问题所在。关于上述主题的最佳实践是什么?我们应该创建许多更简单的字段,还是用其他介绍的方法更好地做到这一点?

0 个答案:

没有答案