from __future__ import annotations from .shared import * from ...services.sstc.entity_lookup import _ensure_project, _ensure_review from ...services.sstc.governance import _require_manager from ...services.sstc.signal_core import _as_dict, _parse_node_id, _parse_project_id, _sync_pmflow_rag_async router = APIRouter(tags=["sstc"]) @router.post("/projects/{project_id}/reviews/{review_node_id}/archive") async def archive_review( project_id: str, review_node_id: str, body: ReviewArchiveRequest, permission_user: User = Depends(require_project_member_or_manager), db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user), ): _ = permission_user _require_manager(current_user) pid = _parse_project_id(project_id) rid = _parse_node_id(review_node_id, "review_node_id") tenant_id = int(current_user.tenant_id) await _ensure_project(SSTCService(db, tenant_id=tenant_id), pid) review_node = await _ensure_review( db, tenant_id=tenant_id, project_id=pid, review_node_id=rid, ) before = {"status": review_node.status} review_node.status = "archived" if body.archive else "draft" content = _as_dict(review_node.content) content["archive_note"] = body.note content["archived_at"] = now_cn_aware().isoformat() if body.archive else None review_node.content = content await log_operation( db, tenant_id=tenant_id, user_id=int(current_user.id), project_id=pid, entity_type="review", entity_id=str(rid), action="archive" if body.archive else "unarchive", before_data=before, after_data={"status": review_node.status}, ) await db.commit() _sync_pmflow_rag_async( tenant_id=tenant_id, record_type="review", record_id=int(review_node.id), project_id=pid, title=review_node.title, content=_as_dict(review_node.content), ) return success_response({"id": str(review_node.id), "status": review_node.status})