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, require_admin from ..models import Setting, User from ..schemas import SettingOut router = APIRouter(prefix="/settings", tags=["settings"]) EXPIRY_WARNING_KEY = "expiry_warning_days" # Ab wie viel Prozent Übereinstimmung ein Artikel beim Kassenzettel-Scan als # Treffer vorgeschlagen wird. RECEIPT_THRESHOLD_KEY = "receipt_match_threshold" RECEIPT_THRESHOLD_DEFAULT = 45 def get_expiry_warning_days(db: Session) -> int: row = db.get(Setting, EXPIRY_WARNING_KEY) if row is None: return get_settings().expiry_warning_days_default try: return int(row.value) except ValueError: return get_settings().expiry_warning_days_default def get_receipt_match_threshold(db: Session) -> int: """Schwellwert (0–100) für Kassenzettel-Treffer; auf sinnvollen Bereich geklemmt.""" row = db.get(Setting, RECEIPT_THRESHOLD_KEY) if row is None: return RECEIPT_THRESHOLD_DEFAULT try: return max(0, min(100, int(row.value))) except ValueError: return RECEIPT_THRESHOLD_DEFAULT @router.get("", response_model=list[SettingOut]) def list_settings( db: Session = Depends(get_db), _: User = Depends(get_current_user) ) -> list[SettingOut]: rows = db.query(Setting).all() known = {r.key: r.value for r in rows} known.setdefault(EXPIRY_WARNING_KEY, str(get_expiry_warning_days(db))) known.setdefault(RECEIPT_THRESHOLD_KEY, str(get_receipt_match_threshold(db))) return [SettingOut(key=k, value=v) for k, v in known.items()] @router.put("/{key}", response_model=SettingOut) def set_setting( key: str, value: str, db: Session = Depends(get_db), _: User = Depends(require_admin), ) -> SettingOut: row = db.get(Setting, key) if row is None: row = Setting(key=key, value=value) db.add(row) else: row.value = value db.commit() return SettingOut(key=key, value=value)