--- id: 003 title: Add CDEK provider adapter status: TODO created: 2026-03-07 --- ## Context Phase 1 в `spec/overview.md` требует поддержку provider CDEK с OAuth2 authentication и маппингом расчёта тарифа. ## Goal Реализовать adapter interfaces и модули CDEK adapter: provider contract, OAuth2 token handling, HTTP client behavior и преобразование ответа в `DeliveryPrice`. ## Constraints - Только Adapter layer; без business decisions и sorting logic. - Внешний IO должен оставаться внутри adapter modules. - Timeout для CDEK должен быть 10 секунд согласно specification. - Не изменять файлы в `spec/`. ## Acceptance criteria - Существует интерфейс `DeliveryProvider` со стабильным контрактом `get_price()`. - Модуль CDEK auth получает OAuth2 token через client credentials и переиспользует валидный token до истечения. - CDEK client выполняет tariff request с timeout и retry behavior. - CDEK mapper преобразует provider response в унифицированную schema `DeliveryPrice`. - Adapter наружу предоставляет только provider-facing API, необходимый Service. ## Definition of Done - [ ] Реализован base provider interface. - [ ] Реализованы модули CDEK auth/client/mapper. - [ ] CDEK adapter возвращает унифицированную price model при успешном ответе. - [ ] Adapter tests покрывают auth refresh, timeout/retry и mapping cases. ## Tests - Добавить adapter unit tests для token lifecycle behavior. - Добавить adapter tests для response mapping и HTTP error handling. - Для внешних HTTP взаимодействий использовать stubs/mocks. ## Commands - `poetry run pytest tests/adapters/delivery_providers/cdek -q`