Source code for fastapi_payments.config.config_schema

from typing import Dict, Any, Optional, List
from pydantic import BaseModel, Field, field_validator


[docs] class TaxConfig(BaseModel): """Tax configuration.""" default_rate: float = 0.0 included_in_price: bool = False use_tax_service: bool = False tax_service_url: Optional[str] = None
[docs] class PricingConfig(BaseModel): """Pricing configuration.""" default_currency: str = "USD" default_pricing_model: str = "subscription" round_to_decimal_places: int = 2 allow_custom_pricing: bool = True tax: TaxConfig = TaxConfig() additional_settings: Dict[str, Any] = Field(default_factory=dict)
[docs] class DatabaseConfig(BaseModel): """Database configuration.""" url: str echo: bool = False pool_size: int = 5 max_overflow: int = 10
class MessagingConfig(BaseModel): """Configuration for messaging system.""" broker_type: str = "redis" url: Optional[str] = None exchange_name: Optional[str] = None queue_prefix: Optional[str] = "payment_" topic_prefix: Optional[str] = "payments." group_id: Optional[str] = "payment-service" @field_validator("broker_type") @classmethod def validate_broker_type(cls, v): """Validate broker type.""" allowed_types = ["redis", "rabbitmq", "kafka", "nats", "memory"] if v not in allowed_types: raise ValueError(f"broker_type must be one of {allowed_types}") return v
[docs] class ProviderConfig(BaseModel): """Payment provider configuration.""" api_key: str api_secret: Optional[str] = None webhook_secret: Optional[str] = None sandbox_mode: bool = True additional_settings: Dict[str, Any] = Field(default_factory=dict)
[docs] class PaymentConfig(BaseModel): """Configuration for payment module.""" providers: Dict[str, Any] database: DatabaseConfig messaging: MessagingConfig = Field(default_factory=MessagingConfig) pricing: PricingConfig = PricingConfig() default_provider: str = "stripe" retry_attempts: int = 3 retry_delay: int = 5 logging_level: str = "INFO" debug: bool = False allowed_currencies: List[str] = ["USD", "EUR", "GBP"] additional_settings: Dict[str, Any] = Field(default_factory=dict)
[docs] @field_validator("default_provider") @classmethod def validate_default_provider(cls, v, info): """Validate default provider exists in providers.""" if v not in info.data.get("providers", {}): raise ValueError(f"default_provider '{v}' must exist in providers") return v
[docs] @field_validator("logging_level") @classmethod def validate_logging_level(cls, v): """Validate logging level.""" allowed_levels = ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"] if v not in allowed_levels: raise ValueError(f"logging_level must be one of {allowed_levels}") return v