86 lines
2.6 KiB
Python
86 lines
2.6 KiB
Python
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
|
|
} |