7.4 KiB
7.4 KiB
id, title, status, created
| id | title | status | created |
|---|---|---|---|
| 024 | Add TomTom address suggestion adapter and Europe routing | DONE | 2026-03-29 |
Context
Текущий flow подсказок адреса поддерживает dadata для RU, BY, KZ и yandex_geosuggest для части стран СНГ. Следующий этап требует добавить третий provider TomTom для европейских стран, сохранив текущий публичный API и routing через YAML-конфиг.
Goal
Добавить новый adapter tomtom для address suggestions на базе TomTom Search API Fuzzy Search, настроить routing европейских стран на provider id tomtom через конфиг и покрыть это config, adapter и service tests без изменения публичного API endpoint.
Constraints
- Scope задачи ограничен flow подсказок адреса: YAML-конфиг, wiring зависимостей, service routing, новый adapter и тесты.
- Controller path и публичный контракт
POST /api/v1/delivery/suggest-addressне изменять. - Service остаётся orchestration layer: выбирает provider по injected config mapping и вызывает ровно один adapter без provider-specific HTTP-логики.
- Внешний IO должен оставаться только внутри нового adapter
app/adapters/address_suggestions/tomtom/. - Новый adapter должен следовать официальному HTTP-контракту TomTom Search API Fuzzy Search:
GET https://api.tomtom.com/search/2/search/{query}.json. - TomTom adapter должен формировать
queryизrequest.cityиrequest.query, передаватьcountrySet=request.country_code,typeahead=true, аrequest.limitпри наличии маппить в query-параметрlimit. - Для исключения POI из address suggestion flow adapter должен отправлять address-oriented
idxSet=PAD,Addr,Str,EPP. - Routing европейских стран должен определяться только YAML-маппингом
country_code -> provider_id; запрещено добавлять в Service hardcoded классификацию Европы. - Unified mapping наружу должен возвращать только
AddressSuggestionбез утечки provider-specific payload. - Для TomTom Search поля должны маппиться детерминированно:
address.freeformAddress -> address,address.streetName -> street,address.streetNumber -> house,address.postalCode -> postal_code,flat=None. - Ошибки TomTom
400должны маппиться в deterministic provider request error;403,429, transport errors и5xxдолжны маппиться в adapter client error/unavailable path. - Scope задачи не включает изменение order flow, price flow, новых endpoint'ов, расширение internal model
AddressSuggestionи изменение контрактов существующих adaptersdadataиyandex_geosuggest. - Не изменять файлы в
spec/.
Acceptance criteria
- В конфиге address suggestion providers добавлен provider id
tomtomс параметрами, необходимыми для вызова TomTom Search API Fuzzy Search. - Country mapping в конфиге маршрутизирует на
tomtomевропейские страны, явно перечисленные в YAML, при этом routing дляRU,BY,KZнаdadataи дляAM,AZ,KG,MD,TJ,TM,UZнаyandex_geosuggestсохраняется без изменений. - Реализован adapter
app/adapters/address_suggestions/tomtom/client.py, который отправляет запрос в TomTom Search API Fuzzy Search по официальному контракту и возвращаетlist[AddressSuggestion]. - Adapter объединяет
request.cityиrequest.queryв search query, передаётcountrySet=request.country_code,typeahead=true,idxSet=PAD,Addr,Str,EPPи при наличииrequest.limitмаппит его вlimit. - Поля
address,street,houseиpostal_codeдетерминированно извлекаются из ответа TomTom (freeformAddress,streetName,streetNumber,postalCode), аflatвозвращается какNone. AggregatorService.suggest_addresses()поcountry_codeвыбираетtomtomдля европейских стран, явно сопоставленных в YAML-конфиге, и сохраняет существующий routing наdadataиyandex_geosuggestдля уже поддержанных стран.- При ответе TomTom с
400service flow возвращает deterministic bad-request path, а при403,429,5xxи transport failure — deterministic unavailable path.
Definition of Done
- Добавлена конфигурация
tomtomи обновлён country mapping для европейских стран. - Реализован новый TomTom adapter без утечки HTTP-деталей в Service.
- Обновлён wiring address suggestion providers без изменения публичного endpoint контракта.
- Добавлены tests для config, adapter mapping/error handling и service routing на
tomtomс сохранением существующего routing наdadataиyandex_geosuggest. - Пройдены все команды из раздела Commands.
Tests
- Обновить
tests/config/test_config_sections.pyдля проверки секцииtomtomи country mapping, в котором европейские страны маршрутизируются наtomtom, а существующие маппингиRU,BY,KZ->dadataиAM,AZ,KG,MD,TJ,TM,UZ->yandex_geosuggestсохраняются. - Добавить
tests/adapters/address_suggestions/tomtom/test_client.pyдля success case, mappinglimit, формирования search query изcityиquery, передачиtypeahead=trueиidxSet=PAD,Addr,Str,EPP, возвратаflat=None, извлеченияaddress/street/house/postal_codeи error scenarios400,403,429,5xx. - Обновить
tests/services/test_address_suggestions.pyдля проверки routing наtomtomпо европейским странам из YAML-конфига и сохранения routing наdadataиyandex_geosuggestдля уже поддержанных стран. - При необходимости обновить
tests/controllers/v1/test_address_suggestions.pyтолько для совместимости существующего endpoint с новым provider routing без изменения публичного API.
Commands
poetry run pytest tests/config/test_config_sections.py -qpoetry run pytest tests/adapters/address_suggestions/tomtom/test_client.py -qpoetry run pytest tests/services/test_address_suggestions.py -qpoetry run pytest tests/controllers/v1/test_address_suggestions.py -qpython3 spec/gen_spec_index.py --check