import os from pathlib import Path from dotenv import load_dotenv _env_loaded = False def _load_env(): global _env_loaded if not _env_loaded: env_path = Path(__file__).parent.parent.parent / ".env" load_dotenv(env_path) _env_loaded = True class Config: def __init__(self): _load_env() self._db_session = None def get(self, key: str, default: str = "") -> str: _load_env() return os.getenv(key, default) def get_setting(self, key: str, default: str = "") -> str: from db.database import get_session from db.models import Setting try: with get_session() as session: row = session.query(Setting).filter_by(key=key).first() if row: return row.value except Exception: pass return default def set_setting(self, key: str, value: str) -> None: from db.database import get_session from db.models import Setting with get_session() as session: row = session.query(Setting).filter_by(key=key).first() if row: row.value = value else: session.add(Setting(key=key, value=value)) session.commit() @property def anthropic_key(self) -> str: return self.get("ANTHROPIC_API_KEY") or self.get_setting("anthropic_api_key") @property def news_api_key(self) -> str: return self.get("NEWS_API_KEY") or self.get_setting("news_api_key") @property def schwab_app_key(self) -> str: return self.get("SCHWAB_APP_KEY") or self.get_setting("schwab_app_key") @property def schwab_app_secret(self) -> str: return self.get("SCHWAB_APP_SECRET") or self.get_setting("schwab_app_secret") @property def robinhood_username(self) -> str: return self.get("ROBINHOOD_USERNAME") or self.get_setting("robinhood_username") @property def robinhood_password(self) -> str: return self.get("ROBINHOOD_PASSWORD") or self.get_setting("robinhood_password")