Получение только изменившихся данных
Вебхуки не заменяют полную сверку: доставка не гарантируется, а часть списков вебхуками не покрыта. Листание через page тоже теряет записи. Пока обрабатывается первая страница, объект с неё могут удалить или обновить, и он уедет на уже прочитанную страницу. Следующая страница этого объекта уже не содержит.
Для сверки есть updated_since и from_id. В справочнике оба параметра указаны у списков:
GET /admin/products.jsonGET /admin/orders.jsonGET /admin/clients.jsonGET /admin/collections.jsonGET /admin/discount_codes.jsonGET /admin/bonus_system_transactions.json
updated_since — время в UTC или со смещением. Отдаются объекты с updated_at больше либо равным этому времени. Пробелы и + в смещении нужно кодировать. Для полуночи 4 сентября 2017 по Москве строка такая:
2017-09-04 00:00:00 +03:00
в запросе:
updated_since=2017-09-04+00%3A00%3A00+%2B03%3A00
При заданном updated_since выдача идёт по возрастанию updated_at, затем по id. Каждый следующий запрос — снова первая страница, меняется только фильтр.
Товары
Для товаров правило проверено на списке.
from_id без updated_since не фильтрует: в ответе остаётся весь список, включая объект с этим id.
Вместе с updated_since из выдачи уходит сам опорный объект и всё, что раньше него. Берутся записи, у которых updated_at больше опоры, и записи с тем же updated_at и большим id. Так обходятся массовые обновления, где у тысяч товаров одно и то же время.
Алгоритм:
- Запросить пачку с сохранённым
updated_sinceиfrom_id. Размер пачки —per_page. - Пустая пачка — запомнить
updated_sinceи остановиться до следующего запуска. - У последнего объекта пачки взять
updated_atвupdated_sinceиidвfrom_id. - Запросить следующую пачку.
Значение per_page меньше 10 для товаров поднимается до 10.
Удалённые товары помечаются archived: true.
deleted=true— только такие товары.with_deleted=true— и текущие, и удалённые. В этом режимеdeletedне действует.
Коллекции
У GET /admin/collections.json параметр updated_since ограничивает список по времени изменения. from_id на том же списке запись с переданным id не отсекает: при одинаковом updated_at она остаётся в ответе. Для коллекций страницу двигайте только временем updated_since и учитывайте, что пачка с одним и тем же временем может прийти снова.