from typing import Any, Self from fansifter_common.constants import PROD_ENVIRONMENT, QA_ENVIRONMENT from fansifter_common.logging import LogFormat from fansifter_common.logging.utils import update_logging_config from pydantic import Field, model_validator from pydantic_settings import BaseSettings, SettingsConfigDict class Settings(BaseSettings): environment: str debug: bool = Field(validation_alias="APP_DEBUG", default=False) service_name: str = "lambda-audience-refresh-m2m-token" service_version: str = "1.0.0" # AWS region configuration aws_region_name: str = "us-east-1" # M2M Token Secret names @property def m2m_token_secret_name(self) -> str: return f"{self.environment}/lambda-audience-refresh-m2m-token/m2m_token" @property def m2m_token_expiration_secret_name(self) -> str: return ( f"{self.environment}/lambda-audience-refresh-m2m-token/m2m_token_expiration" ) # Auth0 @property def auth0_domain(self) -> str: if self.environment in [PROD_ENVIRONMENT]: return "workstation.auth0.com" return f"{self.environment}-orchard.auth0.com" @property def auth0_audience(self) -> str: return f"https://{self.environment}-ows.theorchard.io" auth0_m2m_client_id: str = Field("", validation_alias="AUTH0_M2M_CLIENT_ID") @property def auth0_m2m_client_secret_secret_name(self) -> str: return ( f"{self.environment}/lambda-audience-refresh-m2m-token" "/auth0_m2m_client_secret" ) # Logging log_format: LogFormat = "json" logging_config: dict[str, Any] = { "version": 1, "disable_existing_loggers": True, "handlers": { "stream": { "level": "INFO", "class": "fansifter_common.logging.OwsStreamHandler", }, }, "loggers": { "app": { "handlers": ["stream"], "level": "INFO", "propagate": False, }, "owsclient": { "handlers": ["stream"], "level": "INFO", "propagate": False, }, }, } @model_validator(mode="after") def _setup_logging_config(self) -> Self: self.logging_config = update_logging_config( logging_config=self.logging_config, environment=self.environment, service_name=self.service_name, service_version=self.service_version, log_format=self.log_format, debug=self.debug, ) return self # Sentry sentry_dsn: str | None = None @model_validator(mode="after") def _setup_sentry_dsn(self) -> Self: if not self.sentry_dsn and self.environment in [ QA_ENVIRONMENT, PROD_ENVIRONMENT, ]: raise ValueError(f"Sentry is not configured in {self.environment}.") return self model_config = SettingsConfigDict( env_file=".env", env_file_encoding="utf-8", case_sensitive=False, extra="allow", )