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" 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 @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))) 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)