Skip to content

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

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

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

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

  • updated_since - время в UTC, будут отдаваться объекты у которых updated_at больше либо равен updated_since . Важно правильно ескейпить значение, допустим нужно получить все объекты измененные после 00:00 часов по Москве, время должно быть "2017-09-04 000000 +03:00" ,в урл надо передавать updated_since=2017-09-04+00%3A00%3A00+%2B03%3A00
  • from_id - id последнего принятого вами объекта. Объекты у которых updated_at равен updated_since и id меньше либо равен from_id не передаются. Это сделано для листания в случае если у большого количества товаров одинаковый updated_at (такое бывает из-за обновления товаров массовыми операциями). from_id работает только вместе с updated_since. Если updated_since не задан, то from_id игнорируется.
  • with_deleted - если этот параметр передан, то на равне с существующими товарами передаются товары из корзины. Их можно отличить по наличию флага archived.
  • deleted - если этот флаг передан, то передаются только товары из корзины. Этот флаг игнорируется, если переда флаг with_deleted.

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

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

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