"""Application configuration.""" import logging import os from os.path import abspath, dirname, join, pardir from urllib.parse import quote as url_quote from urllib.parse import urlparse from dotenv import load_dotenv from snowflake.sqlalchemy import URL import sqlalchemy # Load environment variables from a .env file if present dotenv_path = abspath(join(dirname(__file__), pardir, ".env")) load_dotenv(dotenv_path) # Service information SERVICE_NAME = "ows-collaborator" SERVICE_VERSION = "1.0.0" # Production environment PROD_ENVIRONMENT = "prod" DEV_ENVIRONMENT = "dev" QA_ENVIRONMENT = "qa" TEST_ENVIRONMENT = "test" ENVIRONMENT = os.environ.get("Environment") or DEV_ENVIRONMENT # Errors and loggers SENTRY = os.environ.get("SENTRY_DSN") or None LOGGER_DSN = os.environ.get("LOGGER_DSN") LOGGER_LEVEL = os.environ.get("LOGGER_LEVEL", logging.INFO) LOGGER_NAME = "ows1" ENABLE_PROFILER = os.environ.get("ENABLE_PROFILER") == "true" SQLALCHEMY_LOGGER_LEVEL = os.environ.get("SQLALCHEMY_LOGGER_LEVEL") ONLY_LOG_ACCESS_ERRORS = False AWS_REGION = os.environ.get("AWS_DEFAULT_REGION", "us-east-1") WEBHOOK_DELIVERY_URL = ( f"https://{ENVIRONMENT}-ows-collaborator-proxy.theorchard.io/transferwise/webhook" ) # Audit logger AUDIT_LOGGER_HOSTS = None # defaults to just outputting the logs AUDIT_LOGGER_HOST_URL = os.environ.get("AUDIT_LOG_ES") AUDIT_LOGGER_USER = os.environ.get("AUDIT_LOG_USER", "") AUDIT_LOGGER_PASS = os.environ.get("AUDIT_LOG_PASS", "") if AUDIT_LOGGER_HOST_URL: parsed_url = urlparse(AUDIT_LOGGER_HOST_URL) scheme = f"{parsed_url.scheme}://" audit_logger_host = parsed_url.geturl().replace(scheme, "", 1) AUDIT_LOGGER_HOSTS = [ { "host": audit_logger_host, "port": 443, "username": AUDIT_LOGGER_USER, "password": AUDIT_LOGGER_PASS, } ] # General database config POOL_CLASS = ( sqlalchemy.pool.StaticPool if ENVIRONMENT == TEST_ENVIRONMENT else sqlalchemy.pool.QueuePool ) POOL_SIZE = 15 POOL_RECYCLE_MS = 3600 # Avoids connections going stale POOL_MAX_OVERFLOW = 10 POOL_PRE_PING = False # Collaborator database config # Note: We must explicitly set UTF-8 encoding for MySQL connections if ENVIRONMENT == TEST_ENVIRONMENT: COLLABORATOR_DB_URL = "sqlite:///?check_same_thread=False" SNOWFLAKE_DB_URL = "sqlite://" SNOWFLAKE_DB_WRITER_URL = "sqlite://" TRANSFERWISE_CLIENT_ID = "TRANSFERWISE_CLIENT_ID" TRANSFERWISE_CLIENT_SECRET = "TRANSFERWISE_CLIENT_SECRET" DATADOG_API_KEY = "DATADOG_API_KEY" DATADOG_APP_KEY = "DATADOG_APP_KEY" else: SNOWFLAKE_DB_URL = URL( account=os.environ.get("SNOWFLAKE_ACCOUNT", ""), user=os.environ.get("SNOWFLAKE_USER", ""), warehouse=os.environ.get("SNOWFLAKE_WAREHOUSE", ""), role=os.environ.get("SNOWFLAKE_ROLE", ""), ) SNOWFLAKE_DB_WRITER_URL = URL( account=os.environ.get("SNOWFLAKE_ACCOUNT", ""), user=os.environ.get("SNOWFLAKE_USER", ""), warehouse=os.environ.get("SNOWFLAKE_WRITER_WAREHOUSE", ""), role=os.environ.get("SNOWFLAKE_ROLE", ""), ) db_url_params = { "user": url_quote(os.environ.get("COLLAB_DB_USER", "")), "password": url_quote(os.environ.get("COLLAB_DB_PASS", "")), "host": url_quote(os.environ.get("COLLAB_DB_HOST", "")), "db_name": url_quote(os.environ.get("COLLAB_DB_DBNAME", "")), "charset": "utf8mb4", } TRANSFERWISE_CLIENT_ID = os.environ.get("TRANSFERWISE_CLIENT_ID", "") TRANSFERWISE_CLIENT_SECRET = os.environ.get("TRANSFERWISE_CLIENT_SECRET", "") COLLABORATOR_DB_URL = ( "mysql+pymysql://{user}:{password}@{host}/{db_name}?charset={charset}".format( **db_url_params ) ) if ENVIRONMENT in [PROD_ENVIRONMENT, QA_ENVIRONMENT]: DATADOG_API_KEY = os.environ.get("DD_API_KEY", "") DATADOG_APP_KEY = os.environ.get("DD_APP_KEY", "") else: DATADOG_API_KEY = os.environ.get("DATADOG_API_KEY", "") DATADOG_APP_KEY = os.environ.get("DATADOG_APP_KEY", "") APP_SUPPORT_TYPES = ["orchard_ws", "orchard_suite"] COLLABORATORS_ORCHARD_URL_PROD = "https://collaborators.theorchard.com/" COLLABORATORS_ORCHARD_URL_QA = "https://collaborators.qaorch.com/" COLLABORATORS_AWAL_URL_PROD = "https://collaborators.awal.com/" COLLABORATORS_AWAL_URL_QA = "https://collaborators.qaawal.com/" TRANSFERWISE_POST_AUTHORIZATION_REDIRECT_ENV_URLS = { "prod": { "theorchard": COLLABORATORS_ORCHARD_URL_PROD, "awal": COLLABORATORS_AWAL_URL_PROD, }, "qa": { "theorchard": COLLABORATORS_ORCHARD_URL_QA, "awal": COLLABORATORS_AWAL_URL_QA, }, "dev": { "theorchard": COLLABORATORS_ORCHARD_URL_QA, "awal": COLLABORATORS_AWAL_URL_QA, }, "test": { "theorchard": COLLABORATORS_ORCHARD_URL_QA, "awal": COLLABORATORS_AWAL_URL_QA, }, } WISE_API_BASE_URL_PROD = "https://api.transferwise.com/" WISE_API_BASE_URL_QA = "https://api.wise-sandbox.com/" TRANSFERWISE_BASE_URLS = { "prod": WISE_API_BASE_URL_PROD, "qa": WISE_API_BASE_URL_QA, "dev": WISE_API_BASE_URL_QA, "test": WISE_API_BASE_URL_QA, } WISE_REDIRECT_URL_PROD = "https://transferwise.com/oauth/authorize/" WISE_REDIRECT_URL_QA = "https://wise-sandbox.com/oauth/authorize/" TRANSFERWISE_AUTHORIZATION_REDIRECT_URLS = { "prod": WISE_REDIRECT_URL_PROD, "qa": WISE_REDIRECT_URL_QA, "dev": WISE_REDIRECT_URL_QA, "test": WISE_REDIRECT_URL_QA, } TRANSFERWISE_BASE_URL = TRANSFERWISE_BASE_URLS[ENVIRONMENT] TRANSFERWISE_POST_AUTHORIZATION_REDIRECT_URLS = ( TRANSFERWISE_POST_AUTHORIZATION_REDIRECT_ENV_URLS[ENVIRONMENT] ) TRANSFERWISE_AUTHORIZATION_REDIRECT_URL = TRANSFERWISE_AUTHORIZATION_REDIRECT_URLS[ ENVIRONMENT ] if ENVIRONMENT == PROD_ENVIRONMENT: TRANSFERWISE_PUBLIC_KEY = b"""-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvO8vXV+JksBzZAY6GhSO XdoTCfhXaaiZ+qAbtaDBiu2AGkGVpmEygFmWP4Li9m5+Ni85BhVvZOodM9epgW3F bA5Q1SexvAF1PPjX4JpMstak/QhAgl1qMSqEevL8cmUeTgcMuVWCJmlge9h7B1CS D4rtlimGZozG39rUBDg6Qt2K+P4wBfLblL0k4C4YUdLnpGYEDIth+i8XsRpFlogx CAFyH9+knYsDbR43UJ9shtc42Ybd40Afihj8KnYKXzchyQ42aC8aZ/h5hyZ28yVy Oj3Vos0VdBIs/gAyJ/4yyQFCXYte64I7ssrlbGRaco4nKF3HmaNhxwyKyJafz19e HwIDAQAB -----END PUBLIC KEY----- """ elif ENVIRONMENT == QA_ENVIRONMENT: TRANSFERWISE_PUBLIC_KEY = b"""-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwpb91cEYuyJNQepZAVfP ZIlPZfNUefH+n6w9SW3fykqKu938cR7WadQv87oF2VuT+fDt7kqeRziTmPSUhqPU ys/V2Q1rlfJuXbE+Gga37t7zwd0egQ+KyOEHQOpcTwKmtZ81ieGHynAQzsn1We3j wt760MsCPJ7GMT141ByQM+yW1Bx+4SG3IGjXWyqOWrcXsxAvIXkpUD/jK/L958Cg nZEgz0BSEh0QxYLITnW1lLokSx/dTianWPFEhMC9BgijempgNXHNfcVirg1lPSyg z7KqoKUN0oHqWLr2U1A+7kqrl6O2nx3CKs1bj1hToT1+p4kcMoHXA7kA+VBLUpEs VwIDAQAB -----END PUBLIC KEY----- """ else: TRANSFERWISE_PUBLIC_KEY = b"" # Generic handlers HEALTH_CHECK = "/hello/" # Swagger documentation path SWAGGER_FILE_PATH = "spec/ows_collaborator-1.0.0.yaml" PRESIGNED_URL_EXPIRES = 500 # SQS config SQS_BULK_REPORT_TRIGGER_QUEUE_NAME = "{}-collaborator-report-trigger-queue".format( ENVIRONMENT ) REPORT_BATCH_SIZE = int(os.environ.get("REPORT_BATCH_SIZE", 50)) REPORT_TIMEOUT = int(os.environ.get("REPORT_TIMEOUT", 5)) EMAIL_SENDER = ( "donotreply@theorchard.com" if ENVIRONMENT == PROD_ENVIRONMENT else "donotreply@dev.theorchard.io" ) MAX_NETWORK_REQUEST_RETRIES = 5 if ENVIRONMENT != TEST_ENVIRONMENT else 1 SNOWFLAKE_PRIVATE_KEY = os.environ.get("SNOWFLAKE_PRIVATE_KEY") SNOWFLAKE_PRIVATE_KEY_PATH = os.environ.get("SNOWFLAKE_PRIVATE_KEY_PATH") SNOWFLAKE_KEY_PASSPHRASE = os.environ.get("SNOWFLAKE_KEY_PASSPHRASE", "") SNOWFLAKE_SCHEMAS = { "facts": os.environ.get("SNOWFLAKE_SCHEMA_FACTS", ""), "royalty_accounting": os.environ.get("SNOWFLAKE_SCHEMA_ROYALTY_ACCOUNTING", ""), "ows_collaborator": os.environ.get("SNOWFLAKE_SCHEMA_OWS_COLLABORATOR", ""), } LAMBDA_FUNCTION_AUTO_REPORT_RUN = ( "prod-lambda-collaborator-auto-report-run" if ENVIRONMENT == PROD_ENVIRONMENT else "qa-lambda-collaborator-auto-report-run" )