settings.py 2.8 KB

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