Files
life-echo/api/app/features/memory/router.py
Sully 53e0065e3e refactor(api): TOML 配置 SSOT、统一错误契约、Auth/事务加固与可观测性 (#33)
配置 SSOT(TOML + .env)
统一错误契约
Auth 与事务边界
Redis / Celery 可靠性:业务 Redis(DB/0)与 Celery broker/backend(DB/1)显式拆分;连接池、sync client
可观测性(OpenTelemetry + LGTM)
2026-05-22 13:44:50 +08:00

69 lines
2.1 KiB
Python

"""Memory 策展与内部扩展 API。"""
from fastapi import APIRouter, Depends, status
from pydantic import BaseModel, Field
from app.core.deps_types import CurrentUserDep
from app.core.errors import NotFoundError
from app.features.memory.deps import get_memory_service
from app.features.memory.service import MemoryService
from app.features.user.models import User
router = APIRouter(prefix="/api/memory", tags=["memory"])
class ExcludeBody(BaseModel):
reason: str = Field(default="", max_length=2000)
class RejectFactBody(BaseModel):
reason: str = Field(default="", max_length=2000)
@router.post("/chunks/{chunk_id}/exclude", status_code=status.HTTP_204_NO_CONTENT)
async def exclude_chunk(
chunk_id: str,
current_user: CurrentUserDep,
memory: MemoryService = Depends(get_memory_service),
body: ExcludeBody | None = None,
):
reason = (body.reason if body else "") or ""
ok = await memory.exclude_chunk(current_user.id, chunk_id, reason=reason)
if not ok:
raise NotFoundError("chunk 不存在")
@router.post("/chunks/{chunk_id}/restore", status_code=status.HTTP_204_NO_CONTENT)
async def restore_chunk(
chunk_id: str,
current_user: CurrentUserDep,
memory: MemoryService = Depends(get_memory_service),
):
ok = await memory.restore_chunk(current_user.id, chunk_id)
if not ok:
raise NotFoundError("chunk 不存在")
@router.post("/facts/{fact_id}/confirm", status_code=status.HTTP_204_NO_CONTENT)
async def confirm_fact(
fact_id: str,
current_user: CurrentUserDep,
memory: MemoryService = Depends(get_memory_service),
):
ok = await memory.confirm_fact(current_user.id, fact_id)
if not ok:
raise NotFoundError("fact 不存在")
@router.post("/facts/{fact_id}/reject", status_code=status.HTTP_204_NO_CONTENT)
async def reject_fact(
fact_id: str,
current_user: CurrentUserDep,
memory: MemoryService = Depends(get_memory_service),
body: RejectFactBody | None = None,
):
reason = (body.reason if body else "") or ""
ok = await memory.reject_fact(current_user.id, fact_id, reason=reason)
if not ok:
raise NotFoundError("fact 不存在")