Files
Nat20-Notes/backend/app/routers/settings.py
KansaiGaijin ca13989ca0
All checks were successful
Build and Push / build (push) Successful in 12m10s
per-campaign settings, default campaign folders, custom prompt fix
2026-07-21 17:46:37 +12:00

52 lines
1.4 KiB
Python

import os
from fastapi import APIRouter
from .. import database as db, config
router = APIRouter(prefix="/api/settings", tags=["settings"])
# Only global (GLOBAL_SETTINGS) keys live here; campaign settings are under /api/campaigns/{id}/settings.
_ENV_OVERRIDES = {
"onboarding_completed": "NAT20_ONBOARDING_COMPLETED",
}
_BOOL_KEYS = {"onboarding_completed"}
def _coerce(key: str, value: str):
if key in _BOOL_KEYS:
return str(value).lower() in ("1", "true", "yes")
return value
def _merge_with_env(raw: dict) -> dict:
"""Priority: explicit user DB saves (non-default) > env vars > GLOBAL_SETTINGS."""
merged = {**config.GLOBAL_SETTINGS}
for key, env_name in _ENV_OVERRIDES.items():
val = os.environ.get(env_name)
if val is not None:
merged[key] = val
for key, val in raw.items():
db_val = val.strip()
if db_val and db_val != config.GLOBAL_SETTINGS.get(key, ""):
merged[key] = db_val
return merged
@router.get("")
async def get_settings():
raw = db.get_settings()
merged = _merge_with_env(raw)
return {k: _coerce(k, v) for k, v in merged.items()}
@router.post("")
async def update_settings(patch: dict):
clean = {k: str(v) for k, v in patch.items() if k in config.GLOBAL_SETTINGS}
db.update_settings(clean)
raw = db.get_settings()
merged = _merge_with_env(raw)
return {k: _coerce(k, v) for k, v in merged.items()}