68 lines
2.2 KiB
Python
68 lines
2.2 KiB
Python
"""Delivery provider registry and wiring."""
|
|
|
|
from dataclasses import dataclass
|
|
from typing import Mapping, Sequence
|
|
|
|
import httpx
|
|
|
|
from app.adapters.delivery_providers.base import (
|
|
DeliveryProvider,
|
|
OrderRegistrationProvider,
|
|
PaymentPriceValidationProvider,
|
|
)
|
|
from app.adapters.delivery_providers.cdek import CDEKProvider
|
|
from app.adapters.delivery_providers.cse import CSEProvider
|
|
from app.config import DeliveryProvidersConfig
|
|
|
|
|
|
@dataclass(frozen=True, slots=True)
|
|
class DeliveryProviderRegistry:
|
|
providers: Sequence[DeliveryProvider]
|
|
payment_price_validation_adapters: Mapping[str, PaymentPriceValidationProvider]
|
|
order_registration_adapters: Mapping[str, OrderRegistrationProvider]
|
|
|
|
|
|
def resolve_delivery_provider_timeout_seconds(
|
|
config: DeliveryProvidersConfig,
|
|
) -> float:
|
|
timeouts = [
|
|
provider_config.timeout_seconds
|
|
for provider_config in (config.cdek, config.cse)
|
|
if provider_config.enabled
|
|
]
|
|
return max(timeouts, default=10.0)
|
|
|
|
|
|
def build_delivery_provider_registry(
|
|
*,
|
|
http_client: httpx.AsyncClient,
|
|
config: DeliveryProvidersConfig,
|
|
) -> DeliveryProviderRegistry:
|
|
providers: list[DeliveryProvider] = []
|
|
payment_price_validation_adapters: dict[str, PaymentPriceValidationProvider] = {}
|
|
order_registration_adapters: dict[str, OrderRegistrationProvider] = {}
|
|
|
|
if config.cdek.enabled:
|
|
cdek_provider = CDEKProvider.from_config(
|
|
http_client=http_client,
|
|
config=config.cdek,
|
|
)
|
|
providers.append(cdek_provider)
|
|
payment_price_validation_adapters[cdek_provider.name] = cdek_provider
|
|
order_registration_adapters[cdek_provider.name] = cdek_provider
|
|
|
|
if config.cse.enabled:
|
|
cse_provider = CSEProvider.from_config(
|
|
http_client=http_client,
|
|
config=config.cse,
|
|
)
|
|
providers.append(cse_provider)
|
|
payment_price_validation_adapters[cse_provider.name] = cse_provider
|
|
order_registration_adapters[cse_provider.name] = cse_provider
|
|
|
|
return DeliveryProviderRegistry(
|
|
providers=tuple(providers),
|
|
payment_price_validation_adapters=payment_price_validation_adapters,
|
|
order_registration_adapters=order_registration_adapters,
|
|
)
|