"""数字分身单聊接管配置 API。""" from fastapi import APIRouter, Body, Depends, Header from sqlalchemy.orm import Session from database import get_db from responses import fail, ok from routers.authorizations import _require_authorization from routers.avatars import _require_owned_avatar router = APIRouter(tags=["分身接管"]) def _has(payload: dict, camel_key: str, snake_key: str) -> bool: return camel_key in payload or snake_key in payload def _read(payload: dict, camel_key: str, snake_key: str, default=None): if camel_key in payload: return payload[camel_key] if snake_key in payload: return payload[snake_key] return default @router.put("/avatar/{avatar_id}/authorizations/takeover") def update_takeover_config( avatar_id: str, payload: dict = Body(...), authorization: str = Header(None), db: Session = Depends(get_db), ): _require_owned_avatar(db, avatar_id, authorization) auth_id = _read(payload, "authorizationId", "authorization_id") if not auth_id: return fail("缺少 authorization_id", 400) auth = _require_authorization(db, avatar_id, str(auth_id)) enabled = bool(auth.takeover_enabled) mode = auth.takeover_mode or "immediate" delay = auth.takeover_delay_seconds or 30 if _has(payload, "takeoverEnabled", "takeover_enabled"): raw_enabled = _read(payload, "takeoverEnabled", "takeover_enabled") if not isinstance(raw_enabled, bool): return fail("takeover_enabled 必须是布尔值", 400) enabled = raw_enabled if _has(payload, "takeoverMode", "takeover_mode"): mode = _read(payload, "takeoverMode", "takeover_mode") if mode not in ("immediate", "delayed"): return fail("takeover_mode 必须是 immediate 或 delayed", 400) if _has(payload, "takeoverDelaySeconds", "takeover_delay_seconds"): delay = _read(payload, "takeoverDelaySeconds", "takeover_delay_seconds") if isinstance(delay, bool) or not isinstance(delay, int) or not 5 <= delay <= 3600: return fail("延迟时间需在 5 到 3600 秒之间", 400) if enabled and auth.target_type != "user": return fail("本期仅支持对会会用户开启单聊接管", 400) if enabled and auth.status != "active": return fail("请先启用该授权,再开启聊天接管", 400) permissions = list(auth.permissions or []) if enabled: if "chat" not in permissions and "reply" not in permissions: permissions.append("chat") if "takeover" not in permissions: permissions.append("takeover") else: permissions = [permission for permission in permissions if permission != "takeover"] auth.permissions = permissions auth.takeover_enabled = enabled auth.takeover_mode = mode auth.takeover_delay_seconds = delay db.commit() db.refresh(auth) return ok(auth.to_dict(), "接管配置已保存")