# pylint: disable=no-self-argument from typing import Any, Optional import boto3 import orjson from pydantic import BaseSettings, Field, StrictBool, validator class Config(BaseSettings): class Config: env_file = ".env" env_file_encoding = "utf-8" env: str = Field(env="ENVIRONMENT") debug: bool = Field(False, env="DEBUG") is_local: bool = Field(False, env="IS_LOCAL") sentry_dsn: Optional[str] = Field(env="SENTRY_SECRET_KEY") datadog_host: str = Field("127.0.0.1", env="DATADOG_HOST") datadog_port: int = Field(8125, env="DATADOG_PORT") workflowdb_secret_name: str = Field(env="WORKFLOWDB_SECRET_NAME") etldb_secret_name: str = Field(env="ETLDB_SECRET_NAME") spotify_credentials_secret_name: str = Field(env="SPOTIFY_CREDENTIALS") apple_music_credentials_secret_name: str = Field(env="APPLE_MUSIC_CREDENTIALS") raw_bucket: str = Field(env="RAW_BUCKET") store_raw: StrictBool = Field(False, env="STORE_RAW") aws_region: str = Field("us-east-1", env="AWS_DEFAULT_REGION") aws_credentials_host: str = "http://169.254.170.2" aws_credentials_path: Optional[str] = Field(env="AWS_CONTAINER_CREDENTIALS_RELATIVE_URI") entities_list: Any = Field(None, env="ENTITIES") @validator("store_raw", "is_local", "debug", pre=True) def bool_type_casting(cls, bool_param: str) -> bool: return bool_param in ("True", "true", "TRUE", "1") @validator("entities_list", pre=True) def str_to_list_casting(cls, param): if isinstance(param, str): return param.split(",") return param @property def workflowdb_uri(self) -> str: db_uri_template: str = ( "postgresql+asyncpg://{username}:{password}@{active_endpoint}:{port}/{database}" ) return db_uri_template.format(**self.get_secret(self.workflowdb_secret_name)) @property def etldb_uri(self) -> str: db_uri_template: str = ( "postgresql+asyncpg://{username}:{password}@{active_endpoint}:{port}/{database}" ) return db_uri_template.format(**self.get_secret(self.etldb_secret_name)) @property def spotify_credentials(self) -> dict[str, Any]: return self.get_secret(self.spotify_credentials_secret_name) @property def apple_music_credentials(self) -> dict[str, Any]: return self.get_secret(self.apple_music_credentials_secret_name) @property def aws_credentials_url(self) -> str: if self.is_local: return "" return f"{self.aws_credentials_host}{self.aws_credentials_path}" def get_secret(self, secret_name: str) -> dict[str, Any]: secrets_manager = boto3.client("secretsmanager") secret_value: dict[str, str] = secrets_manager.get_secret_value(SecretId=secret_name) secret_string = secret_value["SecretString"] secret: dict[str, Any] = orjson.loads(secret_string) return secret