70 lines
No EOL
2.6 KiB
Python
70 lines
No EOL
2.6 KiB
Python
# routes/upload.py
|
|
|
|
from fastapi import APIRouter, Request, UploadFile, File, HTTPException
|
|
from fastapi.responses import HTMLResponse, RedirectResponse
|
|
from pathlib import Path
|
|
import api_client
|
|
import config
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.get("/", response_class=RedirectResponse)
|
|
async def root():
|
|
"""Redirige / vers /upload"""
|
|
return RedirectResponse(url="/upload")
|
|
|
|
|
|
@router.get("/upload", response_class=HTMLResponse)
|
|
async def index(request: Request):
|
|
"""
|
|
✅ CORRECTION BUG 2 : si la requête vient de HTMX (header HX-Request),
|
|
on retourne uniquement le partial upload_form.html (sans navbar, sans layout).
|
|
Si c'est une navigation directe dans le navigateur, on retourne index.html complet.
|
|
"""
|
|
is_htmx = request.headers.get("HX-Request") == "true"
|
|
if is_htmx:
|
|
return request.app.state.templates.TemplateResponse(
|
|
"partials/upload_form.html",
|
|
{"request": request},
|
|
)
|
|
return request.app.state.templates.TemplateResponse(
|
|
"index.html",
|
|
{"request": request, "active_tab": "upload"},
|
|
)
|
|
|
|
|
|
@router.get("/health-check", response_class=HTMLResponse)
|
|
async def health_check(request: Request):
|
|
try:
|
|
data = await api_client.check_health()
|
|
return request.app.state.templates.TemplateResponse(
|
|
"partials/health_status.html",
|
|
{"request": request, "ok": True, "entwine_available": data.get("entwine_available", False), "disk_free_gb": data.get("disk_free_gb", "?")},
|
|
)
|
|
except Exception as e:
|
|
return request.app.state.templates.TemplateResponse(
|
|
"partials/health_status.html",
|
|
{"request": request, "ok": False, "error": str(e)},
|
|
)
|
|
|
|
|
|
@router.post("/upload", response_class=HTMLResponse)
|
|
async def upload(request: Request, file: UploadFile = File(...)):
|
|
suffix = Path(file.filename).suffix.lower()
|
|
if suffix not in config.SUPPORTED_EXTENSIONS:
|
|
return request.app.state.templates.TemplateResponse(
|
|
"partials/upload_result.html",
|
|
{"request": request, "error": f"Format non supporté : {suffix}. Formats acceptés : {', '.join(config.SUPPORTED_EXTENSIONS)}", "result": None},
|
|
)
|
|
try:
|
|
data = await api_client.upload_file(file.filename, await file.read())
|
|
return request.app.state.templates.TemplateResponse(
|
|
"partials/upload_result.html",
|
|
{"request": request, "result": data, "error": None},
|
|
)
|
|
except Exception as e:
|
|
return request.app.state.templates.TemplateResponse(
|
|
"partials/upload_result.html",
|
|
{"request": request, "error": str(e), "result": None},
|
|
) |