settings.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. from fastapi import APIRouter, Depends
  2. from sqlalchemy.ext.asyncio import AsyncSession
  3. from sqlalchemy import select
  4. from backend.app.core.database import get_db
  5. from backend.app.models.settings import Settings
  6. from backend.app.schemas.settings import AppSettings, AppSettingsUpdate
  7. router = APIRouter(prefix="/settings", tags=["settings"])
  8. # Default settings
  9. DEFAULT_SETTINGS = AppSettings()
  10. async def get_setting(db: AsyncSession, key: str) -> str | None:
  11. """Get a single setting value by key."""
  12. result = await db.execute(select(Settings).where(Settings.key == key))
  13. setting = result.scalar_one_or_none()
  14. return setting.value if setting else None
  15. async def set_setting(db: AsyncSession, key: str, value: str) -> None:
  16. """Set a single setting value."""
  17. result = await db.execute(select(Settings).where(Settings.key == key))
  18. setting = result.scalar_one_or_none()
  19. if setting:
  20. setting.value = value
  21. else:
  22. setting = Settings(key=key, value=value)
  23. db.add(setting)
  24. @router.get("/", response_model=AppSettings)
  25. async def get_settings(db: AsyncSession = Depends(get_db)):
  26. """Get all application settings."""
  27. settings_dict = DEFAULT_SETTINGS.model_dump()
  28. # Load saved settings from database
  29. result = await db.execute(select(Settings))
  30. db_settings = result.scalars().all()
  31. for setting in db_settings:
  32. if setting.key in settings_dict:
  33. # Parse the value based on the expected type
  34. if setting.key in ["auto_archive", "save_thumbnails"]:
  35. settings_dict[setting.key] = setting.value.lower() == "true"
  36. elif setting.key == "default_filament_cost":
  37. settings_dict[setting.key] = float(setting.value)
  38. else:
  39. settings_dict[setting.key] = setting.value
  40. return AppSettings(**settings_dict)
  41. @router.put("/", response_model=AppSettings)
  42. async def update_settings(
  43. settings_update: AppSettingsUpdate,
  44. db: AsyncSession = Depends(get_db),
  45. ):
  46. """Update application settings."""
  47. update_data = settings_update.model_dump(exclude_unset=True)
  48. for key, value in update_data.items():
  49. # Convert value to string for storage
  50. if isinstance(value, bool):
  51. str_value = "true" if value else "false"
  52. else:
  53. str_value = str(value)
  54. await set_setting(db, key, str_value)
  55. await db.commit()
  56. # Return updated settings
  57. return await get_settings(db)
  58. @router.post("/reset", response_model=AppSettings)
  59. async def reset_settings(db: AsyncSession = Depends(get_db)):
  60. """Reset all settings to defaults."""
  61. # Delete all settings
  62. result = await db.execute(select(Settings))
  63. for setting in result.scalars().all():
  64. await db.delete(setting)
  65. await db.commit()
  66. return DEFAULT_SETTINGS