from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select from app.models.models import SystemSetting from app.core.config import settings from pathlib import Path import os DEFAULT_SETTINGS = { "storage_root": settings.STORAGE_ROOT, "global_quota_gb": "1000", "default_client_quota_gb": "100", "default_keep_daily": str(settings.DEFAULT_RETENTION_DAILY), "default_keep_weekly": str(settings.DEFAULT_RETENTION_WEEKLY), "default_keep_monthly": str(settings.DEFAULT_RETENTION_MONTHLY), } async def get_setting(db: AsyncSession, key: str) -> str: result = await db.execute(select(SystemSetting).where(SystemSetting.key == key)) setting = result.scalar_one_or_none() if setting: return setting.value return DEFAULT_SETTINGS.get(key, "") async def get_all_settings(db: AsyncSession) -> dict: result = await db.execute(select(SystemSetting)) db_settings = {s.key: s.value for s in result.scalars().all()} # Merge defaults and add them if not present in db updated = False for k, v in DEFAULT_SETTINGS.items(): if k not in db_settings: db_settings[k] = v db.add(SystemSetting(key=k, value=v)) updated = True if updated: await db.commit() return db_settings async def update_settings_service(db: AsyncSession, new_settings: dict) -> dict: from app.storage.local import storage_provider for k, v in new_settings.items(): if k in DEFAULT_SETTINGS and v is not None: # If changing storage root, validate and apply if k == "storage_root": path = Path(v).resolve() try: os.makedirs(path, exist_ok=True) # Test write access test_file = path / ".write_test" test_file.touch() test_file.unlink() except Exception as e: raise ValueError(f"Invalid or unwritable storage root path: {str(e)}") # Apply to in-memory storage provider storage_provider.root_dir = path result = await db.execute(select(SystemSetting).where(SystemSetting.key == k)) setting = result.scalar_one_or_none() if setting: setting.value = str(v) else: db.add(SystemSetting(key=k, value=str(v))) await db.commit() return await get_all_settings(db)