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

217 lines
7.8 KiB
Python

from typing import Optional
from fastapi import APIRouter, Depends, Form, Header, HTTPException, Response
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.template_service import TemplateService
router = APIRouter(prefix="/templates", tags=["templates"])
ROUTE_PERMISSION_SCOPE = "template_management"
ROUTE_PERMISSION_ACTIONS = {
"list": "templates:list",
"create": "templates:create",
"seed_defaults": "templates:seed_defaults",
"update": "templates:update",
"delete": "templates:delete",
}
def get_template_service(db: Session = Depends(get_db_session)) -> TemplateService:
return TemplateService(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_templates(
page: int = 1,
page_size: int = 20,
contract_type: Optional[str] = None,
template_category: Optional[str] = None,
industry_category: Optional[str] = None,
template_service: TemplateService = Depends(get_template_service),
current_user: dict = Depends(require_current_user),
):
kwargs = {
"current_user": current_user,
"page": page,
"page_size": page_size,
"contract_type": contract_type,
}
if template_category is not None:
kwargs["template_category"] = template_category
if industry_category is not None:
kwargs["industry_category"] = industry_category
return success_response(template_service.list_templates(**kwargs))
@router.get("/{template_id}/versions")
def get_template_versions(
template_id: str,
template_service: TemplateService = Depends(get_template_service),
current_user: dict = Depends(require_current_user),
):
return success_response(template_service.get_template_versions(current_user, template_id))
@router.post("")
def create_template(
name: str = Form(...),
contract_type: Optional[str] = Form(default=None),
template_category: Optional[str] = Form(default=None),
industry_category: Optional[str] = Form(default=None),
description: Optional[str] = Form(default=None),
content: str = Form(...),
variables_json: Optional[str] = Form(default=None),
enabled: bool = Form(default=True),
change_summary: Optional[str] = Form(default=None),
template_service: TemplateService = Depends(get_template_service),
audit_log_service: AuditLogService = Depends(get_audit_log_service),
current_user: dict = Depends(require_current_user),
):
kwargs = {
"current_user": current_user,
"name": name,
"contract_type": contract_type,
"description": description,
"content": content,
"variables_json": variables_json,
"enabled": enabled,
"change_summary": change_summary,
}
if template_category is not None:
kwargs["template_category"] = template_category
if industry_category is not None:
kwargs["industry_category"] = industry_category
result = template_service.create_template(**kwargs)
audit_log_service.record_event(
tenant_id=current_user.get("tenant_id"),
user_id=current_user.get("id"),
action="create_template",
resource_type="template",
resource_id=result["id"],
detail_json={
"name": result["name"],
"contract_type": result["contract_type"],
"template_category": result.get("template_category"),
"industry_category": result.get("industry_category"),
"enabled": result["enabled"],
"variable_count": len(result.get("variables", [])),
"current_version_label": result.get("current_version_label"),
"latest_change_summary": result.get("latest_change_summary"),
},
)
return success_response(result)
@router.post("/seed-defaults")
def seed_default_templates(
template_service: TemplateService = Depends(get_template_service),
audit_log_service: AuditLogService = Depends(get_audit_log_service),
current_user: dict = Depends(require_current_user),
):
result = template_service.seed_default_templates(current_user)
audit_log_service.record_event(
tenant_id=current_user.get("tenant_id"),
user_id=current_user.get("id"),
action="seed_default_templates",
resource_type="template",
resource_id=None,
detail_json={
"created_count": result["created_count"],
"existing_count": result["existing_count"],
"total": result["total"],
"template_names": result.get("template_names", []),
},
)
return success_response(result)
@router.put("/{template_id}")
def update_template(
template_id: str,
name: str = Form(...),
contract_type: Optional[str] = Form(default=None),
template_category: Optional[str] = Form(default=None),
industry_category: Optional[str] = Form(default=None),
description: Optional[str] = Form(default=None),
content: str = Form(...),
variables_json: Optional[str] = Form(default=None),
enabled: bool = Form(default=True),
change_summary: Optional[str] = Form(default=None),
template_service: TemplateService = Depends(get_template_service),
audit_log_service: AuditLogService = Depends(get_audit_log_service),
current_user: dict = Depends(require_current_user),
):
kwargs = {
"current_user": current_user,
"template_id": template_id,
"name": name,
"contract_type": contract_type,
"description": description,
"content": content,
"variables_json": variables_json,
"enabled": enabled,
"change_summary": change_summary,
}
if template_category is not None:
kwargs["template_category"] = template_category
if industry_category is not None:
kwargs["industry_category"] = industry_category
result = template_service.update_template(**kwargs)
audit_log_service.record_event(
tenant_id=current_user.get("tenant_id"),
user_id=current_user.get("id"),
action="update_template",
resource_type="template",
resource_id=result["id"],
detail_json={
"name": result["name"],
"contract_type": result["contract_type"],
"template_category": result.get("template_category"),
"industry_category": result.get("industry_category"),
"enabled": result["enabled"],
"variable_count": len(result.get("variables", [])),
"current_version_label": result.get("current_version_label"),
"latest_change_summary": result.get("latest_change_summary"),
},
)
return success_response(result)
@router.delete("/{template_id}")
def delete_template(
template_id: str,
template_service: TemplateService = Depends(get_template_service),
audit_log_service: AuditLogService = Depends(get_audit_log_service),
current_user: dict = Depends(require_current_user),
):
deleted_template = template_service.delete_template(current_user, template_id)
audit_log_service.record_event(
tenant_id=current_user.get("tenant_id"),
user_id=current_user.get("id"),
action="delete_template",
resource_type="template",
resource_id=template_id,
detail_json={
"name": deleted_template["name"],
"contract_type": deleted_template["contract_type"],
"enabled": deleted_template["enabled"],
"variable_count": len(deleted_template.get("variables", [])),
},
)
return Response(status_code=204)