This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user