4.6 KiB
4.6 KiB
id, title, status, created
| id | title | status | created |
|---|---|---|---|
| 022 | Add address suggestion endpoint | DONE | 2026-03-25 |
Context
Перед реализацией order flow клиенту нужен отдельный endpoint, который возвращает подсказки адреса и позволяет выбрать точное значение для from_location.address и to_location.address. Выбор provider должен происходить по country_code через конфигурационный маппинг стран.
Goal
Добавить POST /api/v1/delivery/suggest-address в существующий controller и существующий service с request/response schemas, routing на address suggestion provider по country_code и детерминированным HTTP error mapping.
Constraints
- Controller отвечает только за DTO validation, routing и mapping service exceptions в HTTP responses.
- Endpoint должен вызывать ровно один метод Service:
AggregatorService.suggest_addresses(). - Новый endpoint должен быть добавлен в существующий controller модуль
app/controllers/v1/delivery.py; не создавать отдельный controller модуль. - Логика provider selection должна быть добавлена в существующий service модуль
app/services/aggregator.py; не создавать отдельный service модуль. - Service выбирает provider по
country_codeчерез injected config mapping и вызывает ровно один address suggestion adapter; provider HTTP-детали в Service запрещены. - Scope задачи не включает создание заказа CDEK, изменение
POST /api/v1/delivery/order, расчёт стоимости доставки, cache behavior и concrete HTTP integration европейского provider. - Не изменять файлы в
spec/.
Acceptance criteria
- Существует endpoint
POST /api/v1/delivery/suggest-address, принимающийAddressSuggestRequestи возвращающийlist[AddressSuggestion]. - Реализованы request/response schemas
AddressSuggestRequestиAddressSuggestion. - Endpoint реализован в существующем controller
app/controllers/v1/delivery.py. - Controller делегирует обработку только в
AggregatorService.suggest_addresses(). - Service определяет provider по
country_codeчерез конфигурационный маппинг и вызывает только соответствующий registered adapter. - Если
country_codeотсутствует в маппинге или сопоставлен с незарегистрированным provider, endpoint возвращает детерминированный 400 response. - Provider request errors маппятся в 400, недоступность внешнего сервиса и transport failures — в 503.
- Service и controller/API tests покрывают как минимум сценарии: route в
dadata, route в второй provider через test double, unsupported country и provider failure.
Definition of Done
- Добавлены address suggestion request/response schemas.
- Реализован метод
AggregatorService.suggest_addresses()для provider routing и orchestration. - Реализован endpoint
POST /api/v1/delivery/suggest-addressв существующем controller. - Добавлены service и controller/API tests для address suggestion flow.
Tests
- Добавить
tests/services/test_address_suggestions.pyдля проверки routing поcountry_code, unsupported country, незарегистрированного provider и provider failures. - Добавить
tests/controllers/v1/test_address_suggestions.pyдля success case, schema validation и HTTP mapping ошибок. - При необходимости обновить
tests/smoke/test_app_import.pyдля проверки подключения нового endpoint и service wiring без новых controller/service модулей. - Использовать test doubles для address suggestion adapters.
Commands
poetry run pytest tests/services/test_address_suggestions.py -qpoetry run pytest tests/controllers/v1/test_address_suggestions.py -qpoetry run pytest tests/smoke/test_app_import.py -qpython3 spec/gen_spec_index.py --check