"""Application configuration.""" import base64 from audience_common.logger import LogFormat, configure_logging from environs import Env from secrets_manager.python_ext import PythonSecretsManager from sqlalchemy.pool import QueuePool, StaticPool PROD_ENVIRONMENT = "prod" QA_ENVIRONMENT = "qa" DEV_ENVIRONMENT = "dev" TEST_ENVIRONMENT = "test" env = Env() ENVIRONMENT = env.str("Environment", default=DEV_ENVIRONMENT) APP_DEBUG: bool = env.bool("APP_DEBUG", default=False) SERVICE_NAME = "ows-contributor" SERVICE_VERSION = "1.0.0" _secrets = PythonSecretsManager( application_context=False, environment=ENVIRONMENT, service_name=SERVICE_NAME, force_remote=ENVIRONMENT not in (DEV_ENVIRONMENT, TEST_ENVIRONMENT), ) SENTRY_DSN = env.str("SENTRY_DSN", default=None) # Neo4j NEO4J_URL = env.str("NEO4J_URL", default=None) NEO4J_USERNAME = env.str("NEO4J_USERNAME", default=SERVICE_NAME) NEO4J_PASSWORD = _secrets.get_cred("NEO4J_PASSWORD") # art_relations MySQL AR_DB_HOST = env.str("AR_DB_HOST", default=None) AR_DB_NAME = env.str("AR_DB_NAME", default="art_relations") AR_DB_USER = env.str("AR_DB_USER", default=SERVICE_NAME) AR_DB_PASS = _secrets.get_cred("AR_DB_PASS") if AR_DB_HOST: AR_DB_URL = f"mysql+pymysql://{AR_DB_USER}:{AR_DB_PASS}@{AR_DB_HOST}/{AR_DB_NAME}?charset=utf8mb4" AR_DB_POOL_CLASS = QueuePool else: AR_DB_URL = "sqlite://" AR_DB_POOL_CLASS = StaticPool AR_DB_POOL_SIZE = 15 AR_DB_POOL_MAX_OVERFLOW = 0 AR_DB_POOL_RECYCLE = 3600 REDIS_HOST = env.str("REDIS_HOST", default="127.0.0.1") REDIS_PORT = env.int("REDIS_PORT", default=6379) REDIS_SSL = env.bool("REDIS_SSL", default=False) CACHE_USE_REDIS = env.bool("CACHE_USE_REDIS", default=False) REDIS_CACHE_TTL = env.int("REDIS_CACHE_TTL_SECONDS", default=60 * 5) REDIS_SOCKET_TIMEOUT = env.float("REDIS_SOCKET_TIMEOUT", default=1.0) REDIS_SOCKET_CONNECT_TIMEOUT = env.float("REDIS_SOCKET_CONNECT_TIMEOUT", default=10.0) SPOTIFY_CLIENT_ID = env.str("SPOTIFY_CLIENT_ID", default=None) SPOTIFY_CLIENT_SECRET = _secrets.get_cred("SPOTIFY_CLIENT_SECRET") APPLE_MUSIC_CLIENT_ID = env.str("APPLE_MUSIC_CLIENT_ID", default=None) APPLE_MUSIC_TEAM_ID = env.str("APPLE_MUSIC_TEAM_ID", default=None) APPLE_MUSIC_PRIVATE_KEY = base64.b64decode( _secrets.get_cred("APPLE_MUSIC_PRIVATE_KEY") or "" ) # Split.io configuration SPLITIO_LOCALHOST_ENV = "localhost" DEFAULT_SPLIT_FILE_PATH = "tests/.split" SPLIT_FILE_PATH = env.str("SPLIT_FILE_PATH", default=DEFAULT_SPLIT_FILE_PATH) SPLITIO_API_KEY = env.str("SPLITIO_API_KEY", default=None) SPLITIO_IMPRESSIONS_MODE = env.str("SPLITIO_IMPRESSIONS_MODE", default="optimized") SPLITIO_PREFORKED_INIT = env.bool("SPLITIO_PREFORKED_INIT", default=False) LOGGING_CONFIG = { "version": 1, "disable_existing_loggers": False, "handlers": { "stream": { "level": "INFO", "class": "audience_common.logger.OwsStreamHandler", }, "null": { "level": "INFO", "class": "logging.NullHandler", }, }, "loggers": { "contributor": { "handlers": ["stream"], "level": "INFO", }, "audience_common.logger.asgi.middleware": { "handlers": ["stream"], "level": "INFO", }, "uvicorn": { "handlers": ["stream"], "level": "INFO", }, "uvicorn.access": { "handlers": ["null"], "level": "INFO", }, "splitio": { "handlers": ["null"], "level": "INFO", }, }, } # Prevent third-party modules from generating sentry alerts. # This config will ignore ALL ERRORs for modules listed in IGNORED_SENTRY_LOGGERS. IGNORED_SENTRY_LOGGERS = {"splitio"} configure_logging( LOGGING_CONFIG, environment=ENVIRONMENT, service_name="ows-contributor", service_version="1.0.0", log_format=LogFormat.DEBUG if ENVIRONMENT == DEV_ENVIRONMENT else LogFormat.JSON, logger_name="ows1", debug=APP_DEBUG, )