"""Application configuration powered by Pydantic settings.""" from typing import Any from typing import Optional from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import serialization from pydantic import BaseModel from pydantic import Field from pydantic_settings import BaseSettings from secrets_manager.python_ext import PythonSecretsManager class SnowflakeConfig(BaseModel): """Snowflake connection details.""" account: str user: str db: str schema: str warehouse: str role: str private_key: Any class AppSettings(BaseSettings): """Top-level application configuration.""" application_name: str = Field('lambda-fan-subscription-preference-sforce-updates', env='APPLICATION_NAME') aws_region: str = Field('us-east-1', env='AWS_REGION') environment: str = Field('test', env='ENVIRONMENT') log_level: str = Field('INFO', env='LOG_LEVEL') sentry_dsn: Optional[str] = Field(None, env='SENTRY_DSN') snowflake_account: Optional[str] = Field(None, env='SNOWFLAKE_ACCOUNT') snowflake_user: Optional[str] = Field(None, env='SNOWFLAKE_USER') snowflake_database: Optional[str] = Field(None, env='SNOWFLAKE_DATABASE') snowflake_schema: Optional[str] = Field(None, env='SNOWFLAKE_SCHEMA') snowflake_warehouse: Optional[str] = Field(None, env='SNOWFLAKE_WAREHOUSE') snowflake_role: Optional[str] = Field(None, env='SNOWFLAKE_ROLE') snowflake_private_key: Optional[str] = Field('', env='SNOWFLAKE_PRIVATE_KEY') snowflake_private_key_passphrase: Optional[str] = Field('', env='SNOWFLAKE_PRIVATE_KEY_PASSPHRASE') snowflake_config: Optional[SnowflakeConfig] = None kafka_target_topic: str = Field('', env='KAFKA_TARGET_TOPIC') kafka_bootstrap_servers: Optional[str] = Field(None, env='KAFKA_BOOTSTRAP_SERVERS') kafka_security_protocol: str = Field('SSL', env='KAFKA_SECURITY_PROTOCOL') kafka_message_header_key: str = Field('CamelHeader.sObjectIdValue', env='KAFKA_MESSAGE_HEADER_KEY') kafka_dlq_topic: Optional[str] = Field(None, env='KAFKA_DLQ_TOPIC') class Config: """Pydantic configuration settings.""" env_file = '.env' case_sensitive = False def model_post_init(self, __context) -> None: """Initialize additional attributes after model creation.""" if self.environment.lower() in ['dev', 'qa', 'prod']: secrets_manager_client = PythonSecretsManager( environment=self.environment, service_name=self.application_name ) snowflake_private_key = secrets_manager_client.get_cred('SNOWFLAKE_PRIVATE_KEY') snowflake_private_key_passphrase = secrets_manager_client.get_cred('SNOWFLAKE_PRIVATE_KEY_PASSPHRASE') private_key = serialization.load_pem_private_key( snowflake_private_key.encode('utf-8'), password=snowflake_private_key_passphrase.encode('utf-8'), backend=default_backend() ) self.snowflake_config = SnowflakeConfig( account=self.snowflake_account, user=self.snowflake_user, db=self.snowflake_database, schema=self.snowflake_schema, warehouse=self.snowflake_warehouse, role=self.snowflake_role, private_key=private_key ) settings = AppSettings()