from __future__ import annotations from backend.app.api.schemas import SettingsResponse, SettingsUpdateRequest from backend.app.db.settings_repository import SettingsRepository from backend.app.security.path_guard import PathGuard class SettingsService: def __init__(self, repository: SettingsRepository, path_guard: PathGuard): self._repository = repository self._path_guard = path_guard def get_settings(self) -> SettingsResponse: values = self._repository.get_settings() preferred_left = self._as_optional_str(values.get("preferred_startup_path_left")) preferred_right = self._as_optional_str(values.get("preferred_startup_path_right")) legacy_preferred = self._as_optional_str(values.get("preferred_startup_path")) return SettingsResponse( show_thumbnails=self._as_bool(values.get("show_thumbnails"), default=False), preferred_startup_path_left=preferred_left or legacy_preferred, preferred_startup_path_right=preferred_right, ) def update_settings(self, request: SettingsUpdateRequest) -> SettingsResponse: if request.show_thumbnails is not None: self._repository.set_setting("show_thumbnails", "true" if request.show_thumbnails else "false") if request.preferred_startup_path_left is not None: self._set_directory_setting("preferred_startup_path_left", request.preferred_startup_path_left) if request.preferred_startup_path_right is not None: self._set_directory_setting("preferred_startup_path_right", request.preferred_startup_path_right) return self.get_settings() def _set_directory_setting(self, key: str, value: str) -> None: normalized = value.strip() if not normalized: self._repository.set_setting(key, "") return resolved = self._path_guard.resolve_directory_path(normalized) self._repository.set_setting(key, resolved.relative) @staticmethod def _as_bool(value: str | None, default: bool) -> bool: if value is None: return default return value.strip().lower() in {"1", "true", "yes", "on"} @staticmethod def _as_optional_str(value: str | None) -> str | None: if value is None: return None normalized = value.strip() return normalized or None