Cache VM112/VM122 para lista e detalhe domínio, modal purge com loading animado, cards Escopo OPS clicáveis (camada + Spec + navegação), blocklist visível na UI, e documentação nas specs e anais de referência 20260625. Co-authored-by: Cursor <cursoragent@cursor.com>
53 lines
2 KiB
Python
53 lines
2 KiB
Python
"""API admin — domínios orquestrados (Desk Spec 017)."""
|
|
|
|
from fastapi import APIRouter, BackgroundTasks, Depends, Header, HTTPException, Query
|
|
|
|
from app.config import settings
|
|
from app.services import domain_orchestration, purge_jobs
|
|
|
|
router = APIRouter(prefix="/admin/domains", tags=["admin-domains"])
|
|
|
|
|
|
def require_api_key(x_api_key: str | None = Header(default=None, alias="X-Api-Key")):
|
|
if x_api_key != settings.admin_api_key:
|
|
raise HTTPException(401, "API key inválida")
|
|
return True
|
|
|
|
|
|
@router.get("/purge-jobs/{job_id}", dependencies=[Depends(require_api_key)])
|
|
def get_purge_job(job_id: str):
|
|
job = purge_jobs.get_job(job_id)
|
|
if not job:
|
|
raise HTTPException(404, "Job de purge não encontrado")
|
|
return job
|
|
|
|
|
|
@router.get("", dependencies=[Depends(require_api_key)])
|
|
def list_domains(q: str = Query(default="")):
|
|
return domain_orchestration.list_orchestrated_domains_meta(q)
|
|
|
|
|
|
@router.get("/{domain}", dependencies=[Depends(require_api_key)])
|
|
def domain_detail(domain: str):
|
|
try:
|
|
return domain_orchestration.get_domain_detail(domain.lower().strip())
|
|
except ValueError as e:
|
|
raise HTTPException(404, str(e)) from e
|
|
|
|
|
|
@router.post("/{domain}/purge", dependencies=[Depends(require_api_key)])
|
|
def purge_domain(domain: str, background_tasks: BackgroundTasks, sync: bool = Query(default=False)):
|
|
"""Inicia purge assíncrono (Fase 3). Desk faz poll em purge-jobs/{job_id}."""
|
|
domain = domain.lower().strip()
|
|
try:
|
|
domain_orchestration.assert_purge_allowed(domain)
|
|
if sync:
|
|
result = domain_orchestration.purge_domain(domain)
|
|
return {"ok": True, "steps": result.get("steps", []), "result": result}
|
|
meta = purge_jobs.create_job(domain)
|
|
background_tasks.add_task(domain_orchestration.run_purge_job, meta["job_id"])
|
|
return {"ok": True, **meta}
|
|
except ValueError as e:
|
|
raise HTTPException(400, str(e)) from e
|
|
except Exception as e:
|
|
raise HTTPException(500, str(e)) from e
|