"""Anzeige-/Verhaltens-Einstellungen je Benutzer (Schlüssel-Wert). Jeder Benutzer hat seine eigenen Einstellungen. Unbekannte Schlüssel werden ebenfalls gespeichert; die hier bekannten liefern sinnvolle Vorgaben. """ from fastapi import APIRouter, Depends from sqlalchemy.orm import Session from ..config import get_settings from ..database import get_db from ..deps import get_current_user from ..models import User, UserSetting from ..schemas import SettingOut router = APIRouter(prefix="/settings", tags=["settings"]) BASE_CURRENCY_KEY = "base_currency" BUDGET_START_DAY_KEY = "budget_start_day" LOCALE_KEY = "locale" THEME_KEY = "theme" DATE_FORMAT_KEY = "date_format" # Welche Waehrungen in Auswahlfeldern erscheinen (Komma-getrennt). # Beschraenkt nur die ANZEIGE: Gueltig bleibt alles, was einen # EZB-Referenzkurs hat – sonst verloere ein Konto seine Waehrung, # nur weil sie hier gerade nicht angehakt ist. ACTIVE_CURRENCIES_KEY = "active_currencies" def known_defaults() -> dict[str, str]: return { BASE_CURRENCY_KEY: get_settings().default_base_currency, BUDGET_START_DAY_KEY: "1", LOCALE_KEY: "de", THEME_KEY: "system", DATE_FORMAT_KEY: "de", ACTIVE_CURRENCIES_KEY: "EUR,CHF,USD", } def get_user_setting(db: Session, user: User, key: str) -> str | None: row = db.get(UserSetting, (user.id, key)) if row is not None and row.value is not None: return row.value return known_defaults().get(key) @router.get("", response_model=list[SettingOut]) def list_settings( db: Session = Depends(get_db), user: User = Depends(get_current_user) ) -> list[SettingOut]: rows = db.query(UserSetting).filter(UserSetting.user_id == user.id).all() merged: dict[str, str | None] = dict(known_defaults()) for r in rows: merged[r.key] = r.value return [SettingOut(key=k, value=v) for k, v in merged.items()] @router.put("/{key}", response_model=SettingOut) def set_setting( key: str, value: str, db: Session = Depends(get_db), user: User = Depends(get_current_user), ) -> SettingOut: row = db.get(UserSetting, (user.id, key)) if row is None: row = UserSetting(user_id=user.id, key=key, value=value) db.add(row) else: row.value = value db.commit() return SettingOut(key=key, value=value)