Может ли ресурс JSON API иметь атрибут, который является сокращением для отношений? - PullRequest
0 голосов
/ 07 марта 2019

У меня есть конечная точка 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"
          }
        ]
      }
    }
  }
}

Атрибут permissionsсодержит слагы для разрешений, которые есть у пользователя.

Если бы этот атрибут не присутствовал, внешнее приложение должно было бы включить ресурсы roles и roles.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"
        }
      }
    ]
  }
}

В этом случае внешний интерфейс должен выполнить большую обработку, чтобы добраться до слагов разрешений.У меня такой вопрос: плохо ли иметь атрибут короткой руки permissions на пользовательском ресурсе, как в предыдущем примере, или же передний конец всегда должен добираться до слагов через отношения?

ПримечаниеВ будущем у нас будет интерфейс администратора, где пользователь может управлять пользователями, ролями и разрешениями.Вот почему роли и разрешения доступны как отдельные объекты.

1 Ответ

0 голосов
/ 11 марта 2019

Клиентские приложения могут легко объединить все разрешения ролей в один ключ / массив и работать оттуда. Таким образом вы будете придерживаться принципов JSON API и предоставите клиентским приложениям свободу работать с разрешениями, которые они предпочитают.

...