首页 > 解决方案 > JSON API 资源是否可以具有作为关系简写的属性?

问题描述

我有一个用于检索用户的 JSON API 端点。该资源还将用于获取用户的权限,用于在我们的前端应用程序中显示或隐藏特定元素。

资源如下所示:

HTTP/1.1 200 OK
Content-Type: application/vnd.api+json

{
  "jsonapi": {
    "version": "1.0"
  },
  "meta": {
    "content-type": "application/vnd.api+json"
  },
  "links": {
    "self": "/users/some-uuid"
  },
  "data": {
    "type": "users",
    "id": "some-uuid",
    "attributes": {
      "email": "some-email@example.com",
      "permissions": [
        "view-all-users",
        "view-all-shifts"
      ]
    },
    "relationships": {
      "roles": {
        "data": [
          {
            "type": "role",
            "id": "some-role-uuid"
          }
        ]
      }
    }
  }
}

权限属性保存用户拥有的权限的 slug。

如果此属性不存在,则前端应用程序必须包含资源rolesroles.permissions能够获得用户的权限。该响应如下所示:

HTTP/1.1 200 OK
Content-Type: application/vnd.api+json

{
  "jsonapi": {
    "version": "1.0"
  },
  "meta": {
    "content-type": "application/vnd.api+json"
  },
  "links": {
    "self": "/users/some-uuid"
  },
  "data": {
    "type": "users",
    "id": "some-uuid",
    "attributes": {
      "email": "some-email@example.com",
      "permissions": [
        "view-all-posts",
        "edit-all-posts"
      ]
    },
    "relationships": {
      "roles": {
        "data": [
          {
            "type": "role",
            "id": "some-role-uuid"
          }
        ]
      }
    },
    "included": [
      {
        "type": "roles",
        "id": "some-role-uuid",
        "attributes": {
          "name": "Editor"
        },
        "relationships": {
          "permissions": {
            "data": [
              {
                "type": "permission",
                "id": "some-permission-uuid"
              },
              {
                "type": "permission",
                "id": "some-permission-uuid-2"
              }
            ]
          }
        }
      },
      {
        "type": "permissions",
        "id": "some-permission-uuid",
        "attributes": {
          "slug": "view-all-posts"
        }
      },
      {
        "type": "permissions",
        "id": "some-permission-uuid",
        "attributes": {
          "slug": "edit-all-posts"
        }
      }
    ]
  }
}

在这种情况下,前端必须进行大量处理才能获得权限 slug。我的问题是:像上面的例子那样在用户资源上有一个速记属性是不是很糟糕permissions,或者前端应该总是通过关系来获取信息?

注意:将来我们将有一个管理界面,用户可以在其中管理用户、角色和权限。这就是角色和权限可作为单独实体使用的原因。

标签: jsonsemanticssemantic-markupjson-apijsonapi-resources

解决方案


客户端应用程序可以轻松地将角色的所有权限合并到一个键/数组中,然后从那里开始工作。通过这种方式,您将保持 JSON API 的原则,并让客户端应用程序可以自由地使用他们喜欢的权限。


推荐阅读