from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.ext.asyncio import AsyncSession from app.core.database import get_db from app.api.deps import require_admin from app.models.models import User from app.schemas.schemas import SystemSettingsResponse, SystemSettingsUpdate from app.services.settings_service import get_all_settings, update_settings_service router = APIRouter(prefix="/settings", tags=["System Settings"]) @router.get("", response_model=SystemSettingsResponse) async def get_settings( db: AsyncSession = Depends(get_db), admin_user: User = Depends(require_admin) ): """Retrieve global system settings.""" settings_dict = await get_all_settings(db) return { "storage_root": settings_dict.get("storage_root", ""), "global_quota_gb": int(settings_dict.get("global_quota_gb", 1000)), "default_client_quota_gb": int(settings_dict.get("default_client_quota_gb", 100)), "default_keep_daily": int(settings_dict.get("default_keep_daily", 7)), "default_keep_weekly": int(settings_dict.get("default_keep_weekly", 4)), "default_keep_monthly": int(settings_dict.get("default_keep_monthly", 12)), } @router.put("", response_model=SystemSettingsResponse) async def update_settings( payload: SystemSettingsUpdate, db: AsyncSession = Depends(get_db), admin_user: User = Depends(require_admin) ): """Update global system settings.""" # Convert Pydantic model to a dict of values (filtering out None) updates = {k: v for k, v in payload.model_dump().items() if v is not None} try: settings_dict = await update_settings_service(db, updates) except ValueError as e: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail=str(e) ) return { "storage_root": settings_dict.get("storage_root", ""), "global_quota_gb": int(settings_dict.get("global_quota_gb", 1000)), "default_client_quota_gb": int(settings_dict.get("default_client_quota_gb", 100)), "default_keep_daily": int(settings_dict.get("default_keep_daily", 7)), "default_keep_weekly": int(settings_dict.get("default_keep_weekly", 4)), "default_keep_monthly": int(settings_dict.get("default_keep_monthly", 12)), }