This commit is contained in:
Team3
2026-05-27 01:00:33 +02:00
parent ad2f3e4786
commit 351f330db0
10 changed files with 1184 additions and 13 deletions

View File

@@ -7,9 +7,16 @@ from fastapi import APIRouter, HTTPException
from fastapi.responses import FileResponse
from config import FORMAT_META, STORAGE_DIR
from database import create_guide, delete_guide, get_guide, list_guides
from generator import generate_guide, rework_guide, cancel_guide
from models import GuideCreateRequest, GuideReworkRequest, GuideResponse
from database import (
create_guide, delete_guide, get_guide, list_guides,
create_baustein as db_create_baustein, list_bausteine, get_baustein, delete_baustein as db_delete_baustein,
list_suggestions, get_suggestion, update_suggestion, delete_suggestion,
)
from generator import generate_guide, rework_guide, cancel_guide, generate_suggestions, generate_baustein_detail, is_suggestions_generating
from models import (
GuideCreateRequest, GuideReworkRequest, GuideResponse,
BausteinCreateRequest, BausteinResponse, SuggestionResponse,
)
router = APIRouter(prefix="/api")
@@ -108,3 +115,92 @@ async def remove(guide_id: str):
Path(guide["pdf_path"]).unlink(missing_ok=True)
await delete_guide(guide_id)
return {"ok": True}
# --- Bausteine ---
@router.get("/bausteine", response_model=list[BausteinResponse])
async def get_bausteine(topic: str):
return await list_bausteine(topic)
@router.post("/bausteine", response_model=BausteinResponse)
async def add_baustein(req: BausteinCreateRequest):
now = datetime.now(timezone.utc).isoformat()
baustein = {
"id": str(uuid.uuid4()),
"topic": req.topic.strip(),
"title": req.title.strip(),
"description": "",
"purpose": "",
"example": "",
"created_at": now,
"updated_at": now,
}
await db_create_baustein(baustein)
asyncio.create_task(generate_baustein_detail(baustein["id"], baustein["topic"], baustein["title"]))
return baustein
@router.delete("/bausteine/{baustein_id}")
async def remove_baustein(baustein_id: str):
b = await get_baustein(baustein_id)
if b is None:
raise HTTPException(404, "Baustein nicht gefunden")
await db_delete_baustein(baustein_id)
return {"ok": True}
# --- Baustein Suggestions ---
@router.get("/bausteine/suggestions", response_model=list[SuggestionResponse])
async def get_suggestions(topic: str):
return await list_suggestions(topic)
@router.post("/bausteine/suggestions/generate")
async def trigger_suggestions(topic: str):
if is_suggestions_generating(topic):
return {"ok": True, "status": "already_generating"}
guides = await list_guides()
html_paths = []
for g in guides:
if g["topic"] == topic and g["status"] == "done" and g["html_path"]:
html_paths.append(Path(g["html_path"]))
asyncio.create_task(generate_suggestions(topic, html_paths))
return {"ok": True}
@router.get("/bausteine/suggestions/status")
async def suggestions_status(topic: str):
return {"generating": is_suggestions_generating(topic)}
@router.post("/bausteine/suggestions/{suggestion_id}/add")
async def accept_suggestion(suggestion_id: str):
s = await get_suggestion(suggestion_id)
if s is None:
raise HTTPException(404, "Vorschlag nicht gefunden")
now = datetime.now(timezone.utc).isoformat()
baustein = {
"id": str(uuid.uuid4()),
"topic": s["topic"],
"title": s["title"],
"description": s["description"],
"purpose": s["purpose"],
"example": s["example"],
"created_at": now,
"updated_at": now,
}
await db_create_baustein(baustein)
await delete_suggestion(suggestion_id)
return baustein
@router.post("/bausteine/suggestions/{suggestion_id}/ignore")
async def ignore_suggestion(suggestion_id: str):
s = await get_suggestion(suggestion_id)
if s is None:
raise HTTPException(404, "Vorschlag nicht gefunden")
await update_suggestion(suggestion_id, status="ignored")
return {"ok": True}