Как контролировать целостность и достаточность данных на клиенте?

Пример для вопроса я возьму из документации JSON API, но это не важно т.к. те же вопросы возникнут и при работе по другим соглашениям, например GraphQL.

Предположим, мне нужно получить список статей с данными об их авторах.
Делаю запрос согласно документации JSON API с запросом полей:
GET /articles?include=author&fields[articles]=title,body,author&fields[people]=name HTTP/1.1

Получаю ответ:
HTTP/1.1 200 OK
Content-Type: application/vnd.api+json

{
  "data": [{
    "type": "articles",
    "id": "1",
    "attributes": {
      "title": "JSON API paints my bikeshed!",
      "body": "The shortest article. Ever."
    },
    "relationships": {
      "author": {
        "data": {"id": "42", "type": "people"}
      }
    }
  }],
  "included": [
    {
      "type": "people",
      "id": "42",
      "attributes": {
        "name": "John"
      }
    }
  ]
}


Сохраняю данные в Store на клиенте в нормализованном виде:
{
    articles: {
        "1": {
            id: "1",
            title: "JSON API paints my bikeshed!",
            body: "The shortest article. Ever",
            author: "42"
        }
    },
   people: {
      "42": {
         name: "John"
      }
   }
}

Теперь я легко могу получить данные об авторе по ID и отобразить их.

Теперь, предположим, мне надо отобразить ту же статью не в списке, а детально.
Что следует сделать? Проверить, а нет ли этой статьи в Store и если нет, то запросить данные с сервера.

Статья есть - отображаем!
Но тут проблеме: на странице с детальный отображением мне нужно еще поле image, которое содержит ссылку на иллюстрирующее статью изображение и список комментариев к статье!
Это фиаско, братан! (с)
По сути само наличие в store какого-то объекта не гарантирует полноты данных в нем и тем более не гарантирует наличия связанных объектов и полноты данных в них.

Вот с этого момента вопрос: как правильно?
Самый просто вариант: не проверять данные в store и всегда запрашивать их снова, при любом обращении.
Плюсы и минусы такого подхода очевидны: плюс - можно не накапливать данные в сторе как в кэше, не занимать ими оперативку пользователя и не рисковать ее переполнением (что характерно для SPA); минус - мы постоянно делаем запросы на сервер, часто одинаковые за одними и теми же данными.

Другой вариант: проверять наличие всех полей у объекта в store, и если чего то не хватает то... тут опять есть варианты - запросить повторно все данные или запросить только недостающие. А надо еще проверить так же наличие и полноту данные в связанных (relationships) ресурсах...

В общем вариантов много, и все уже пришедшие на ум, мне не нравятся по тем или иным причинам.
Поделитесь пожалуйста лучшими практиками решения таких вопросов, своим опытом или ссылкой на чужой.
  • Вопрос задан
  • 111 просмотров
Пригласить эксперта
Ответы на вопрос 1
@f-end Автор вопроса
Вот мой вариант пока:
1. Создаем единый экшен (redux) для всех запросов данных по API
2. Каждый компонент, который запускает экшен, запускает его всегда при вставке компонента в DOM и обязательно передает в него схему, которая описывает структуру данных, необходимых компоненту
3. Экшен (имеет доступ к store) проверяет все поля всех необходимых ресурсов на соответствие схеме, если все поля существуют - ок, значит компонент отрисован, если нет, значит компоненту не хватает всех или части данных, формируется GET-запрос для необходимых полей и отсылается на сервер
...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы