Skip to content

Core: persist shipment webhook event id history #606

Description

@Ibochkarev

Описание функции

Хранить все обработанные providerEventId отгрузки, а не только последнее значение в ms3_shipments.last_event_id.

Проблема, которую решает

В v1 (#591, PR #605) идемпотентность webhook завязана на одно поле last_event_id. После событий A и B повтор A уже не replay. Перевозчики часто шлют старые callback повторно. Сейчас это может дать 409 или повторный transition вместо тихого 200.

Предлагаемое решение

Таблица вроде ms3_shipment_events (уникальность по shipment_id + provider_event_id). applyProviderEvent сначала ищет id в истории. При попадании возвращает текущую строку без записи. last_event_id можно оставить как кэш последнего id.

Сверяться с payment lifecycle (#590), если там появится такая же таблица событий.

Альтернативные варианты

Оставить last_event_id и требовать от провайдера монотонные id. Это ломает реальные CDEK/DPD retry.

Считать replay по (status, tracking_number, external_id). Ложные совпадения при легитимном повторном shipped с тем же треком.

Примеры использования

POST /api/v1/delivery/webhook/{delivery_id}
event id=evt-shipped → 200, shipment shipped
event id=evt-transit → 200, shipment in_transit
event id=evt-shipped (retry) → 200, без второй смены статуса и без 409

Дополнительный контекст

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions