"""Application configuration.""" import base64 import logging import os from environs import Env from secrets_manager.flask_ext import FlaskSecretsManager from sqlalchemy.pool import QueuePool, StaticPool env = Env() # Service information SERVICE_NAME = 'ows-participant' SERVICE_VERSION = '1.0.0' # Production environment TEST_ENVIRONMENT = 'test' PROD_ENVIRONMENT = 'prod' DEV_ENVIRONMENT = 'dev' QA_ENVIRONMENT = 'qa' ENVIRONMENT = os.environ.get('Environment') or DEV_ENVIRONMENT secrets_manager_client = FlaskSecretsManager( application_context=False, environment=ENVIRONMENT, service_name=SERVICE_NAME ) # Errors and loggers SENTRY_DSN = secrets_manager_client.get_cred('SENTRY_DSN') or None LOGGER_LEVEL = logging.INFO LOGGER_NAME = 'ows1' # Generic handlers HEALTH_CHECK = '/hello/' # Swagger documentation path SWAGGER_FILE_PATH = 'spec/ows_participant-1.0.0.yaml' # neo4j settings NEO4J_URL = os.environ.get('NEO4J_URL') NEO4J_USERNAME = os.environ.get('NEO4J_USERNAME') NEO4J_PASSWORD = secrets_manager_client.get_cred('NEO4J_PASSWORD') NEO4J_DATABASE_NAME = os.environ.get('NEO4J_DATABASE_NAME', 'graph.db') NEO4J_MAX_RETRY_TIME = os.environ.get('NEO4J_MAX_RETRY_TIME') or 30 # 30s NEO4J_SETUP_READY = os.environ.get('NEO4J_SETUP_READY') or False SPOTIFY_CLIENT_ID = secrets_manager_client.get_cred('SPOTIFY_CLIENT_ID') or 'id_mock' SPOTIFY_CLIENT_SECRET = ( secrets_manager_client.get_cred('SPOTIFY_CLIENT_SECRET') or 'secret_mock' ) APPLE_MUSIC_CLIENT_ID = secrets_manager_client.get_cred('APPLE_MUSIC_CLIENT_ID') APPLE_MUSIC_TEAM_ID = secrets_manager_client.get_cred('APPLE_MUSIC_TEAM_ID') APPLE_MUSIC_PRIVATE_KEY = base64.b64decode( secrets_manager_client.get_cred('APPLE_MUSIC_PRIVATE_KEY') or '' ) SPOTIFY_SERVICE = 'spotify' APPLE_MUSIC_SERVICE = 'apple-music' BASE_EMAIL_CC = ['operations@theorchard.com', 'musicgraph@theorchard.com'] EMAIL_SENDER_ADDRESS = 'info@theorchard.com' # Switchboard OA User ID SWITCHBOARD_OA_USER_ID = 2075 PODCAST_OA_USER_ID = 9 REDIS_HOST = os.environ.get("REDIS_HOST", "") REDIS_PORT = env.int("REDIS_PORT", default=6379) REDIS_USE_SSL = env.bool("REDIS_USE_SSL", False) REDIS_ENABLED = env.bool("REDIS_ENABLED", default=False) REDIS_CACHE_TTL = env.int("REDIS_CACHE_TTL_SECONDS", default=60 * 60) def get_cred_or_none(env_var): """Wrap around FlaskSecretsManager.get_cred. It is required when requesting some AWS secrets on 'dev' environment on DEV AWS account. """ if env_var in os.environ: return os.environ.get(env_var) return secrets_manager_client.get_cred(env_var) or '' def _db_url(): user = get_cred_or_none('AR_DB_USER') password = get_cred_or_none('AR_DB_PASS') host = get_cred_or_none('AR_DB_HOST') db_name = get_cred_or_none('AR_DB_DBNAME') charset = 'utf8mb4' return 'mysql+pymysql://{}:{}@{}/{}?charset={}'.format( user, password, host, db_name, charset ) if ENVIRONMENT == TEST_ENVIRONMENT: AR_DB_URL = 'sqlite://' POOL_CLASS = StaticPool elif ENVIRONMENT == DEV_ENVIRONMENT: AR_DB_URL = _db_url() POOL_CLASS = QueuePool POOL_MAX_OVERFLOW = -1 POOL_RECYCLE_MS = 3600 POOL_SIZE = 15 else: AR_DB_URL = _db_url() POOL_CLASS = QueuePool POOL_MAX_OVERFLOW = -1 POOL_RECYCLE_MS = 3600 POOL_SIZE = 15 ONLY_LOG_ACCESS_ERRORS = True if ENVIRONMENT == PROD_ENVIRONMENT else False