137 lines
4.9 KiB
Python
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)
|