217 lines
7.8 KiB
Python
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)
|