"""缘契 API(/covenants):提议—问心—铭契、撤回、边界与事件历史。""" from fastapi import APIRouter, Depends, status from pydantic import BaseModel, Field from app.api.v1.deps import get_current_user from app.domains.yuanqi import service from app.schemas.auth import CurrentUser cov_router = APIRouter(prefix="/covenants", tags=["yuanqi"]) class ProposeRequest(BaseModel): character_id: str dimensions: dict = Field(description="多维关系维度(禁单一好感度)") primary_title: str | None = None boundaries: dict = Field(default_factory=dict) class WenxinRequest(BaseModel): candidates: dict = Field(description="人物自陈关系感受候选") note: str | None = None class SealRequest(BaseModel): dimensions: dict boundaries: dict = Field(default_factory=dict) class BoundaryRequest(BaseModel): boundaries: dict class AdultConsentRequest(BaseModel): enabled: bool class WithdrawRequest(BaseModel): reason: str | None = None @cov_router.post("", status_code=status.HTTP_201_CREATED) async def propose_covenant( payload: ProposeRequest, user: CurrentUser = Depends(get_current_user) ) -> dict: return await service.propose( character_id=payload.character_id, owner_scope=user.owner_scope, dimensions=payload.dimensions, primary_title=payload.primary_title, boundaries=payload.boundaries, ) @cov_router.get("") async def list_covenants(user: CurrentUser = Depends(get_current_user)) -> list[dict]: return await service.list_covenants(user.owner_scope) @cov_router.get("/by-character/{character_id}") async def get_active_covenant( character_id: str, user: CurrentUser = Depends(get_current_user) ) -> dict | None: return await service.get_active(character_id, user.owner_scope) @cov_router.post("/{covenant_id}/wenxin") async def wenxin_covenant( covenant_id: str, payload: WenxinRequest, user: CurrentUser = Depends(get_current_user) ) -> dict: return await service.wenxin(covenant_id, user.owner_scope, candidates=payload.candidates, note=payload.note) @cov_router.post("/{covenant_id}/seal") async def seal_covenant( covenant_id: str, payload: SealRequest, user: CurrentUser = Depends(get_current_user) ) -> dict: return await service.seal( covenant_id, user.owner_scope, dimensions=payload.dimensions, boundaries=payload.boundaries ) @cov_router.post("/{covenant_id}/withdraw") async def withdraw_covenant( covenant_id: str, payload: WithdrawRequest, user: CurrentUser = Depends(get_current_user) ) -> dict: return await service.withdraw(covenant_id, user.owner_scope, reason=payload.reason) @cov_router.patch("/{covenant_id}/boundaries") async def update_boundaries( covenant_id: str, payload: BoundaryRequest, user: CurrentUser = Depends(get_current_user) ) -> dict: return await service.update_boundaries(covenant_id, user.owner_scope, payload.boundaries) @cov_router.post("/{covenant_id}/adult-consent") async def set_adult_consent( covenant_id: str, payload: AdultConsentRequest, user: CurrentUser = Depends(get_current_user) ) -> dict: return await service.set_adult_consent(covenant_id, user.owner_scope, enabled=payload.enabled) @cov_router.get("/{covenant_id}/events") async def list_covenant_events( covenant_id: str, user: CurrentUser = Depends(get_current_user) ) -> list[dict]: return await service.list_events(covenant_id, user.owner_scope)