Files
ai-contract-platform/backend/app/api/standard_clauses.py
T

137 lines
4.9 KiB
Python

from typing import Optional
from fastapi import APIRouter, Depends, Form, Header
from sqlalchemy.orm import Session
from app.core.response import success_response
from app.db import get_db_session
from app.services.audit_log_service import AuditLogService
from app.services.auth_service import AuthService
from app.services.standard_clause_service import StandardClauseService
router = APIRouter(prefix="/standard-clauses", tags=["standard-clauses"])
ROUTE_PERMISSION_SCOPE = "standard_clause_management"
ROUTE_PERMISSION_ACTIONS = {
"list": "standard_clauses:list",
"versions": "standard_clauses:versions",
"publish": "standard_clauses:publish",
"unpublish": "standard_clauses:unpublish",
"rollback": "standard_clauses:rollback",
}
def get_standard_clause_service(db: Session = Depends(get_db_session)) -> StandardClauseService:
return StandardClauseService(db)
def get_audit_log_service(db: Session = Depends(get_db_session)) -> AuditLogService:
return AuditLogService(db)
def require_current_user(
authorization: Optional[str] = Header(default=None),
db: Session = Depends(get_db_session),
):
return AuthService(db).require_current_user(authorization)
@router.get("")
def list_standard_clauses(
page: int = 1,
page_size: int = 20,
contract_type: Optional[str] = None,
clause_category: Optional[str] = None,
is_active: Optional[bool] = None,
standard_clause_service: StandardClauseService = Depends(get_standard_clause_service),
current_user: dict = Depends(require_current_user),
):
return success_response(
standard_clause_service.list_clauses(
current_user,
page=page,
page_size=page_size,
contract_type=contract_type,
clause_category=clause_category,
is_active=is_active,
)
)
@router.get("/{clause_id}/versions")
def get_standard_clause_versions(
clause_id: str,
standard_clause_service: StandardClauseService = Depends(get_standard_clause_service),
current_user: dict = Depends(require_current_user),
):
return success_response(standard_clause_service.get_clause_versions(current_user, clause_id))
@router.post("/{clause_id}/publish")
def publish_standard_clause(
clause_id: str,
standard_clause_service: StandardClauseService = Depends(get_standard_clause_service),
audit_log_service: AuditLogService = Depends(get_audit_log_service),
current_user: dict = Depends(require_current_user),
):
result = standard_clause_service.publish_clause(current_user, clause_id)
audit_log_service.record_event(
tenant_id=current_user.get("tenant_id"),
user_id=current_user.get("id"),
action="publish_standard_clause",
resource_type="standard_clause",
resource_id=result["id"],
detail_json={
"clause_code": result["clause_code"],
"name": result["name"],
"published_at": result.get("published_at"),
"published_by": result.get("published_by"),
"latest_governance_asset_id": result.get("latest_governance_asset_id"),
},
)
return success_response(result)
@router.post("/{clause_id}/unpublish")
def unpublish_standard_clause(
clause_id: str,
standard_clause_service: StandardClauseService = Depends(get_standard_clause_service),
audit_log_service: AuditLogService = Depends(get_audit_log_service),
current_user: dict = Depends(require_current_user),
):
result = standard_clause_service.unpublish_clause(current_user, clause_id)
audit_log_service.record_event(
tenant_id=current_user.get("tenant_id"),
user_id=current_user.get("id"),
action="unpublish_standard_clause",
resource_type="standard_clause",
resource_id=result["id"],
detail_json={"clause_code": result["clause_code"], "name": result["name"]},
)
return success_response(result)
@router.post("/{clause_id}/rollback")
def rollback_standard_clause(
clause_id: str,
target_version_label: str = Form(...),
change_summary: Optional[str] = Form(default=None),
standard_clause_service: StandardClauseService = Depends(get_standard_clause_service),
audit_log_service: AuditLogService = Depends(get_audit_log_service),
current_user: dict = Depends(require_current_user),
):
result = standard_clause_service.rollback_clause(current_user, clause_id, target_version_label, change_summary)
audit_log_service.record_event(
tenant_id=current_user.get("tenant_id"),
user_id=current_user.get("id"),
action="rollback_standard_clause",
resource_type="standard_clause",
resource_id=result["id"],
detail_json={
"clause_code": result["clause_code"],
"name": result["name"],
"target_version_label": target_version_label,
"current_version_label": result.get("current_version_label"),
},
)
return success_response(result)