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_service: TemplateService = Depends(get_template_service), current_user: dict = Depends(require_current_user), ): return success_response(template_service.list_templates(current_user, page, page_size, contract_type)) @router.post("") def create_template( name: str = Form(...), contract_type: 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), 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.create_template(current_user, name, contract_type, description, content, variables_json, enabled) 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"], "enabled": result["enabled"], "variable_count": len(result.get("variables", [])), }, ) 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), description: Optional[str] = Form(default=None), content: str = Form(...), variables_json: Optional[str] = Form(default=None), enabled: bool = Form(default=True), 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.update_template(current_user, template_id, name, contract_type, description, content, variables_json, enabled) 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"], "enabled": result["enabled"], "variable_count": len(result.get("variables", [])), }, ) 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)