"""GET/PUT /api/state; DELETE /api/state/{key}""" from __future__ import annotations from typing import Any, Dict from fastapi import APIRouter, Depends, HTTPException from web.auth import require_auth from web.deps import get_config, get_user_registry router = APIRouter() def _get_user_sm(user: dict): """Return the per-user WorkflowStateManager, raising 503 if unavailable.""" registry = get_user_registry() if registry is None: raise HTTPException(503, "State manager not available") return registry.get_state_manager(user["sub"]) @router.get("/state") async def get_state(user: dict = Depends(require_auth)): """Return all current overrides for the authenticated user.""" sm = _get_user_sm(user) return sm.get_overrides() @router.put("/state") async def put_state(body: Dict[str, Any], user: dict = Depends(require_auth)): """Merge override values. Pass ``null`` as a value to delete a key.""" sm = _get_user_sm(user) for key, value in body.items(): if value is None: sm.delete_override(key) else: sm.set_override(key, value) return sm.get_overrides() @router.delete("/state/{key}") async def delete_state_key(key: str, user: dict = Depends(require_auth)): """Remove a single override key, and clean up any associated slot file.""" sm = _get_user_sm(user) sm.delete_override(key) config = get_config() if config: from input_image_db import deactivate_image_slot user_label: str = user["sub"] deactivate_image_slot(f"{user_label}_{key}", config.comfy_input_path) return {"ok": True, "key": key}