Перевел /suggest-address на id города и убрал country_code
Deploy / deploy (push) Successful in 59s

This commit is contained in:
Раис Юсупалиев
2026-05-29 04:01:09 +03:00
parent 6caea9e111
commit 6a2bf05ba5
5 changed files with 128 additions and 52 deletions
+2 -3
View File
@@ -22,7 +22,7 @@ from app.schemas.payment import (
InitPaymentResponse,
TBankPaymentNotification,
)
from app.schemas.request import AddressSuggestRequest, DeliveryCalculationRequest
from app.schemas.request import DeliveryCalculationRequest, SuggestAddressRequest
from app.schemas.response import AddressSuggestion, DeliveryPrice
from app.services.aggregator import (
AddressSuggestionsUnavailableError,
@@ -149,12 +149,11 @@ async def get_delivery_price(
response_model=list[AddressSuggestion],
)
async def suggest_addresses(
address_request: AddressSuggestRequest,
address_request: SuggestAddressRequest,
service: AggregatorService = Depends(get_aggregator_service),
) -> list[AddressSuggestion]:
logger.info(
"suggest_address_requested",
country_code=address_request.country_code,
city=address_request.city,
query=address_request.query,
limit=address_request.limit,
+14
View File
@@ -26,7 +26,21 @@ class DeliveryCalculationRequest(BaseModel):
parcel_type: ParcelType | None = None
class SuggestAddressRequest(BaseModel):
"""API request for the /suggest-address endpoint.
``city`` is a city identifier (key in ``cities_map``); the city name and
country code are resolved from it by the service layer.
"""
city: str = Field(min_length=1)
query: str = Field(min_length=1)
limit: int | None = Field(default=None, gt=0)
class AddressSuggestRequest(BaseModel):
"""Provider-facing address suggestion request."""
country_code: str = Field(min_length=2, max_length=2)
city: str = Field(min_length=1)
query: str = Field(min_length=1)
+36 -4
View File
@@ -49,7 +49,12 @@ from app.schemas.payment import (
InitPaymentResponse,
TBankPaymentNotification,
)
from app.schemas.request import AddressSuggestRequest, DeliveryCalculationRequest
from app.cities import cities_map
from app.schemas.request import (
AddressSuggestRequest,
DeliveryCalculationRequest,
SuggestAddressRequest,
)
from app.schemas.response import AddressSuggestion, DeliveryPrice
logger = structlog.get_logger(__name__)
@@ -254,12 +259,15 @@ class AggregatorService:
return [self._coerce_delivery_price(price) for price in filtered_and_sorted]
async def suggest_addresses(
self, request: AddressSuggestRequest
self, request: SuggestAddressRequest
) -> list[AddressSuggestion]:
provider = self._resolve_address_suggestion_provider(request.country_code)
provider_request = self._build_address_suggest_request(request)
provider = self._resolve_address_suggestion_provider(
provider_request.country_code
)
try:
suggestions = await provider.suggest(request)
suggestions = await provider.suggest(provider_request)
except AddressSuggestionRequestError as exc:
raise InvalidAddressSuggestRequestError(
"Address suggestion request is invalid for the configured provider."
@@ -739,6 +747,30 @@ class AggregatorService:
def _coerce_address_suggestion(value: object) -> AddressSuggestion:
return AddressSuggestion.model_validate(value, from_attributes=True)
@staticmethod
def _build_address_suggest_request(
request: SuggestAddressRequest,
) -> AddressSuggestRequest:
city_entry = cities_map.get(request.city)
if not isinstance(city_entry, dict):
raise InvalidAddressSuggestRequestError(
f"City is not configured for id {request.city}."
)
city_name = city_entry.get("city")
country_code = city_entry.get("country")
if not isinstance(city_name, str) or not isinstance(country_code, str):
raise InvalidAddressSuggestRequestError(
f"City mapping is invalid for id {request.city}."
)
return AddressSuggestRequest(
country_code=country_code,
city=city_name,
query=request.query,
limit=request.limit,
)
def _resolve_address_suggestion_provider(
self, country_code: str
) -> AddressSuggestionProvider: