import os import secrets import logging from fastapi import APIRouter, HTTPException, status, Depends from sqlalchemy.orm import Session from app.config import settings from app.database import get_db from app.models import HTMLFile from app.schemas import HTMLGenerateRequest, HTMLGenerateResponse router = APIRouter(prefix="/html", tags=["html"]) logger = logging.getLogger(__name__) def generate_unique_id() -> str: return secrets.token_urlsafe(16) @router.post("/generate", response_model=HTMLGenerateResponse, status_code=status.HTTP_201_CREATED) def generate_html(request: HTMLGenerateRequest, db: Session = Depends(get_db)): try: # 先删除过期记录 deleted_count = HTMLFile.delete_expired_records(db) if deleted_count > 0: logger.info(f"Deleted {deleted_count} expired HTML file records") # 生成唯一 ID unique_id = generate_unique_id() # 确保静态文件目录存在 static_dir = settings.static_dir.resolve() static_dir.mkdir(parents=True, exist_ok=True) # 生成 HTML 文件路径 html_filename = f"{unique_id}.html" html_path = static_dir / html_filename # 写入 HTML 内容 with open(html_path, "w", encoding="utf-8") as f: f.write(request.html_content) # 保存到数据库 html_file = HTMLFile( unique_id=unique_id, filename=html_filename, ) db.add(html_file) db.commit() db.refresh(html_file) # 生成完整链接 html_url = f"{settings.frontend_base_url}/static/{html_filename}" return HTMLGenerateResponse( message="HTML 文件生成成功", unique_id=unique_id, url=html_url ) except Exception as e: logger.error(f"生成 HTML 文件失败: {str(e)}") raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=f"生成 HTML 文件失败: {str(e)}" ) @router.get("/{unique_id}") def get_html_file(unique_id: str, db: Session = Depends(get_db)): html_file = db.query(HTMLFile).filter(HTMLFile.unique_id == unique_id).first() if not html_file: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="HTML 文件不存在" ) # 生成完整链接 html_url = f"{settings.frontend_base_url}/static/{html_file.filename}" return { "message": "HTML 文件查询成功", "unique_id": html_file.unique_id, "url": html_url }