Автоматические обратные ссылки JSON API

Является ли нарушением спецификации JSON-API автоматическое создание отношений reverse?

Мне нужно создать ресурсы, которые, когда я связываю A с B в отношениях, автоматически связывают B с A. Таким образом, я могу пройти через A, чтобы найти все его B, и могу найти родителя A из B. Однако я не не хочу POST/PATCH для 2 отношений, чтобы получить это право. Я хочу установить отношения один раз.

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

Предполагая, что у меня есть ресурсы Книги и Авторы. У книг есть авторы, а у авторов есть книги. Вопрос в том, что как только я свяжу Автора с Книгой, мне также нужно создать обратную связь. Нарушает ли спецификация каким-либо образом предположение, что эта обратная связь может быть автоматически создана простым выполнением одной операции POST для связи ресурса Книги?

Например, начиная с книги.

{
    "data": {
        "type": "books", "id": 123, "attributes": ...,
        "links": { "self": "/books/123" },
        "relationships": {
            "self": "/books/123/relationships/authors",
            "related": "/books/123/authors"
        }
     }
}        

И автор

{
    "data": {
        "type": "authors", "id": 456, "attributes": ...,
        "links": { "self": "/authors/456" },
        "relationships": {
            "self": "/authors/456/relationships/books",
            "related": "/authors/456/books"
        }
     }
}        

Если я установлю ссылку из книги на автора с POST на /books/123/relationships/authors

{
    "data": [{ "data": "authors", "id": "456" }]
}

Нужно ли явно делать то же самое для автора 456 в качестве POST для /authors/456/relationships/books?

{
    "data": [{ "data": "books", "id": "123" }]
}

Или я могу позволить серверу построить отношения для меня, чтобы я мог избежать второго POST и просто увидеть автоматические обратные отношения в GET /authors/456/relationships/books?


person Will    schedule 27.05.2019    source источник


Ответы (1)


С точки зрения спецификации это только одна связь, представленная с двух разных сторон. author и book имеют отношения "многие ко многим". Эта связь может быть представлена ​​в объекте ресурса author, а также в объекте ресурса book и, конечно же, через ссылки на отношения. На самом деле было бы нарушением духа спецификации, если бы представления не совпадали. Наличие односторонних отношений — это другая история, но в этом случае одна сторона вообще не знала бы об отношениях (например, book связана с author, но модель author не знает, какие книги с ней связаны).

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

Может быть, пример сделал бы это еще более ясным. Предположим, что книга создана с POST по /books?include=author со следующими полезными данными:

{
  "data": {
    "type": "books",
    "relationships": {
      "author": {
        "data": {
          "type": "authors",
          "id": "1"
        }
      }
    }
  }
}

Ответ может выглядеть так:

{
  "data": {
    "type": "books",
    "id": "7",
    "relationships": {
      "author": {
        "data": { "type": "authors", "id": "1" }
      }
    }
  },
  "included": [
    {
      "type": "authors",
      "id": "1",
      "relationships": {
        "books": {
          "data": [
            { "type": "books", "id": "7" }
          ]
        }
      }
    }
  ]
}
person jelhan    schedule 28.05.2019
comment
Верно. Я понимаю, что отношения должны быть представлены со сторон, которые вы хотите их пересечь, однако вопрос в том, могу ли я установить отношения MM, используя один POSt с одной стороны, и автоматически позволить другой стороне произойти, или я должен POST для обеих сторон явно? - person Will; 28.05.2019
comment
Я расширил ответ, чтобы прямо указать, что также не имеет значения, какая сторона используется для создания и удаления этих отношений. - person jelhan; 28.05.2019