Получение только изменившихся данных

Материал из Insales Wiki
Перейти к: навигация, поиск

Часто встает задача синхронизации списков товаров, заказов и покупателей. Для заказов есть Webhooks, но они не гарантируют доставку.

Обычно мы начинаем листать страницы при помощи pre_page и page. Но это не работает. Почему-то иногда мы не узнаем об изменениях. Так получается из-за того, что пока мы обрабатываем первую страницу (и готовимся забрать вторую), объект с первой страницы удалили. Или обновили и он поменял свое положение в списке. Список обновился и первый объект второй страницы оказался на первой, которую мы уже получили. То есть о его изменениях мы не узнаем.

Для того чтобы гарантировано забрать изменения в InSales используются для параметра:

  • updated_since - время в UTC, будут отдаваться объекты у которых updated_at больше либо равен updated_since
  • from_id - id последнего принятого вами объекта. Объекты у которых updated_at равен updated_since и id меньше либо равен from_id не передаются. Это сделано для листания в случае если у большого количества товаров одинаковый updated_at (такое бывает из-за обновления товаров массовыми операциями). from_id работает только вместе с updated_since. Если updated_since не задан, то from_id игнорируется.

В случае если переда параметр updated_since, объекты упорядочиваются по возрастанию updated_since и возрастанию ID. И мы всегда забираем первую страницу, у нас просто меняется фильтр. Это гарантирует что мы не потеряем данные. Количество запрашиваемых объектов передается в per_page.


Алгоритм работы такой:

  • получили пачку товаров,
  • если пачка пуста, сохранили updated_since в базу до следующего раза и завершились,
  • взяли последний товар из пачки и подставили его updated_at в updated_since, а id во from_id,
  • запросили следующую пачку,
  • ....