refactor: update ConfigurationService to avoid circular imports and streamline repository usage

This commit is contained in:
2026-06-02 15:33:14 +02:00
parent 6b5973a0bb
commit 107595826a
+13 -17
View File
@@ -9,7 +9,6 @@ from pydantic import BaseModel, Field
from arbitrade.config.settings import Settings from arbitrade.config.settings import Settings
from arbitrade.storage.db import DuckDBStore from arbitrade.storage.db import DuckDBStore
from arbitrade.storage.repositories import AuditRepository, ConfigSettingRepository
class ConfigSection(BaseModel): class ConfigSection(BaseModel):
@@ -59,19 +58,22 @@ class ConfigBacktestingDefaults(BaseModel):
class ConfigurationService: class ConfigurationService:
"""Manages application configuration from environment and database sources.""" """Manages application configuration from environment and database sources."""
def __init__(self, settings: Settings, store: DuckDBStore, audit_repo: AuditRepository) -> None: def __init__(self, settings: Settings, store: DuckDBStore, audit_repo) -> None:
self._settings = settings self._settings = settings
self._store = store self._store = store
self._audit_repo = audit_repo self._audit_repo = audit_repo
self._config_version = 0 self._config_version = 0
self._loaded_settings: dict[str, Any] = {} self._loaded_settings: dict[str, Any] = {}
self._setting_repo = ConfigSettingRepository(store)
self._load_database_settings() self._load_database_settings()
def _load_database_settings(self) -> None: def _load_database_settings(self) -> None:
"""Load user settings from database and merge with defaults.""" """Load user settings from database and merge with defaults."""
# Import here to avoid circular imports
from arbitrade.storage.repositories import ConfigSettingRepository
setting_repo = ConfigSettingRepository(self._store)
# Load all settings from database # Load all settings from database
db_settings = self._setting_repo.list_settings() db_settings = setting_repo.list_settings()
# Convert to dictionary for easy access # Convert to dictionary for easy access
for setting in db_settings: for setting in db_settings:
@@ -112,6 +114,10 @@ class ConfigurationService:
def set_setting(self, key: str, value: Any, updated_by: str | None = None) -> None: def set_setting(self, key: str, value: Any, updated_by: str | None = None) -> None:
"""Set a configuration setting value and persist to database.""" """Set a configuration setting value and persist to database."""
# Import here to avoid circular imports
from arbitrade.storage.repositories import ConfigSettingRepository
setting_repo = ConfigSettingRepository(self._store)
# Convert value to JSON string and determine type # Convert value to JSON string and determine type
if isinstance(value, str): if isinstance(value, str):
value_json = value value_json = value
@@ -147,20 +153,10 @@ class ConfigurationService:
) )
# Check if setting exists # Check if setting exists
existing_setting = self._setting_repo.get_setting(key) existing_setting = setting_repo.get_setting(key)
if existing_setting: if existing_setting:
# Update existing setting # Update existing setting
updated_setting = self._setting_repo.update_setting(key, setting) updated_setting = setting_repo.update_setting(key, setting)
else: else:
# Create new setting # Create new setting
updated_setting = self._setting_repo.create_setting(setting) updated_setting = setting_repo.create_setting(setting)
# Update in-memory cache
self._loaded_settings[key] = value
# Increment version for hot reloading
self._config_version += 1
def get_all_settings(self) -> dict[str, Any]:
"""Get all configuration settings."""
return self._loaded_settings.copy()