from fastapi import APIRouter, HTTPException from models.analysis import DocsRequest from utils.cache import docs_cache, repo_cache from utils.jobs import create_job, find_active_job, public_job, start_job from .doc_generator import generate_documentation router = APIRouter() @router.post("/generate") async def generate(request: DocsRequest): try: cache_key = f"{request.repo_id}:{request.doc_type}" if cache_key in docs_cache: return docs_cache[cache_key] docs = await generate_documentation(request.repo_id, request.doc_type) docs_cache[cache_key] = docs return docs except Exception as exc: raise HTTPException(status_code=500, detail=str(exc)) from exc @router.post("/generate/start") async def start_generate(request: DocsRequest): if request.repo_id not in repo_cache: raise HTTPException(status_code=404, detail="Repository not loaded") cache_key = f"{request.repo_id}:{request.doc_type}" if cache_key in docs_cache: return { "job_id": None, "status": "completed", "message": "Documentation already completed", "result": docs_cache[cache_key], } payload = {"doc_type": request.doc_type} existing = find_active_job("documentation", request.repo_id, payload) if existing: return public_job(existing) job = create_job("documentation", request.repo_id, payload) async def run(): docs = await generate_documentation(request.repo_id, request.doc_type) docs_cache[cache_key] = docs return docs start_job(job, run) return public_job(job) @router.get("/generate/jobs/{job_id}") async def get_docs_job(job_id: str): from utils.cache import job_cache job = job_cache.get(job_id) if not job or job.get("kind") != "documentation": raise HTTPException(status_code=404, detail="Documentation job not found") return public_job(job)