61 lines
2.0 KiB
Python
61 lines
2.0 KiB
Python
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})
|
|
|