用于来自API

时间:2018-12-10 17:08:12

标签: ruby-on-rails rest design-patterns api-design

为我们的模型提供一些背景信息:一个组织拥有用户(具有不同的角色),而用户拥有博客文章。

我有一个用例,我需要使用组织中用户的帖子使用情况数据(即帖子,如博客帖子)在UI中填充两个表。一张表格汇总了按用户角色(例如管理员,编辑者和作家)分组的整个组织的总职位数。不过,另一张表将显示所有用户以及每个用户的帖子计数,而不论其角色是什么。

但是,此API端点也将公开,并由组织管理员用来确定帖子的用法,因此我们希望它尽可能直观。

我们已经有一个端点,可以返回有关用户的数据(电子邮件,姓名等)

格式类似于:

{
  current_page: 1,
  per_page: 50,
  next_page: 2,
  previous_page: null,
  total_pages: 3,
  total_count: 150,
  users: [
    {
      id: 1,
      name: "John Doe",
      email: "email@example.com",
      ...
    },
  ...
  ]
}

我们需要的汇总数据只是按用户角色分组的组织的职位数,以及每个用户的职位数(对于所有用户)。也就是说,用户在一段时间内发布的帖子数(将在URL参数中提供)。

我们已经将此想法反弹了一秒钟,并提出了一些替代方案,到目前为止,更有意义的选择是通过一个端点提供数据,该端点允许基于定义的聚合模式对数据进行聚合。

例如,我们可以执行以下操作来获取第一个表的信息,该表需要整个组织的汇总数据:

# /usage/posts?from=&to=&aggregation=user_role

{
  usage: {
    admin: {
      post_count:            admin_posts.count,
      published_post_count:  admin_posts.published.count
    },
    editor: {
      post_count:            editor_posts.count,
      published_post_count:  editor_posts.published.count,
    },
    writer: {
      ...
    }
  }
}

然后对于第二张表,该表需要包括组织中的所有用户及其职位数,我们可以按照以下方式进行操作:

# /usage/posts?from=&to=&aggregation=user(default)

{
  current_page: 1,
  per_page: 50,
  next_page: 2,
  previous_page: null,
  total_pages: 3,
  total_count: 150,
  usage: [
    {
      id:         user.id,
      post_count: user.posts.count,
      email:      user.email,
      name:       user.name,
      role:       user.role,
      ...
    },
    {
      id:         user.id,
      post_count: user.posts.count,
      email:      user.email,
      name:       user.name,
      role:       user.role,
      ...
    },
    ...
  ]
}

这种有效载荷结构看起来直观吗?不仅是为了我们自己的使用并能够填充我们的UI,而且是为了让我们的用户从他们可以使用的数据中获取数据,只要他们认为合适即可。

感谢您的反馈和想法!

0 个答案:

没有答案