feat(analytics): C1 命中列表默认过滤+批量处置
Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -10,6 +10,7 @@ from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
from app.analytics import health as health_svc
|
||||
from app.analytics import metrics as metrics_svc
|
||||
from app.analytics.sensitive import hits as hits_svc
|
||||
from app.analytics.sensitive import words as words_svc
|
||||
from app.api.deps import get_session
|
||||
|
||||
@@ -146,3 +147,35 @@ async def delete_word(session: SessionDep, word_id: int) -> dict:
|
||||
return {"ok": True}
|
||||
except LookupError as exc:
|
||||
raise HTTPException(404, str(exc)) from exc
|
||||
|
||||
|
||||
class DisposeIn(BaseModel):
|
||||
ids: list[int]
|
||||
disposition: str
|
||||
|
||||
|
||||
@router.get("/sensitive/hits")
|
||||
async def list_hits(
|
||||
session: SessionDep,
|
||||
disposition: str | None = None,
|
||||
word_id: int | None = None,
|
||||
page: int = Query(1, ge=1),
|
||||
page_size: int = Query(20, ge=1, le=100),
|
||||
) -> dict:
|
||||
"""C1 命中列表——不传 disposition 默认只回 pending+confirmed(治理闭环:
|
||||
处置完即出队列);word_id 供词详情下钻。"""
|
||||
return await hits_svc.list_hits(
|
||||
session, disposition=disposition, word_id=word_id,
|
||||
page=page, page_size=page_size,
|
||||
)
|
||||
|
||||
|
||||
@router.patch("/sensitive/hits")
|
||||
async def dispose_hits(session: SessionDep, body: DisposeIn) -> dict:
|
||||
"""批量处置(pending 合法——重开误报);UPDATE 不写日志(词/snippet 红线)。"""
|
||||
try:
|
||||
n = await hits_svc.dispose(session, body.ids, body.disposition)
|
||||
await session.commit()
|
||||
return {"updated": n}
|
||||
except ValueError as exc:
|
||||
raise HTTPException(422, str(exc)) from exc
|
||||
|
||||
Reference in New Issue
Block a user