155 lines
4.5 KiB
Python
155 lines
4.5 KiB
Python
"""Ideen-Queue-Endpoints — dünner REST-Layer über services/ideen.py (natives Hermes-Kanban).
|
|
LAN-only wie alle MC2-Endpoints; das Mensch-Gate bleibt die Karte im Auftragsbuch."""
|
|
|
|
from fastapi import APIRouter, HTTPException
|
|
from pydantic import BaseModel
|
|
from services import ideen
|
|
|
|
router = APIRouter(prefix="/api")
|
|
|
|
|
|
class IdeeIn(BaseModel):
|
|
titel: str
|
|
notiz: str = ""
|
|
welt: str = "box" # "box" = Werkstatt baut · "ide" = vorbereiten für Agentic IDE
|
|
tiefe: str = "" # nur ide: "simpel" | "gruendlich" (leer = Box schätzt selbst)
|
|
ziel: str = "" # nur ide-Projekt: "lxc" | "docker" (leer = Box entscheidet)
|
|
art: str = "projekt" # nur ide: "projekt" (Repo+Roadmap+Bau) | "idee" (nur durchdenken)
|
|
|
|
|
|
class TaskIn(BaseModel):
|
|
id: str
|
|
|
|
|
|
class AntwortIn(BaseModel):
|
|
id: str
|
|
antwort: str
|
|
|
|
|
|
class ArchivAlleIn(BaseModel):
|
|
# Leer = alle fertigen Karten der Queue; gesetzt = nur die dieses Projekts.
|
|
projekt: str = ""
|
|
|
|
|
|
class EinordnenIn(BaseModel):
|
|
text: str
|
|
|
|
|
|
@router.get("/ideen")
|
|
def list_queue() -> dict:
|
|
return ideen.list_queue()
|
|
|
|
|
|
@router.post("/ideen")
|
|
def add_idea(body: IdeeIn) -> dict:
|
|
res = ideen.add_idea(body.titel, body.notiz, welt=body.welt, tiefe=body.tiefe,
|
|
ziel=body.ziel, art=body.art)
|
|
if not res.get("ok"):
|
|
raise HTTPException(400, res.get("error", "Idee konnte nicht angelegt werden."))
|
|
return res
|
|
|
|
|
|
@router.post("/ideen/antwort")
|
|
def answer(body: AntwortIn) -> dict:
|
|
res = ideen.answer_task(body.id, body.antwort)
|
|
if not res.get("ok"):
|
|
raise HTTPException(400, res.get("error", "Antwort konnte nicht gesendet werden."))
|
|
return res
|
|
|
|
|
|
class PrioIn(BaseModel):
|
|
id: str
|
|
richtung: str # hoch | runter
|
|
|
|
|
|
@router.post("/ideen/stopp")
|
|
def stop(body: TaskIn) -> dict:
|
|
res = ideen.stop_task(body.id)
|
|
if not res.get("ok"):
|
|
raise HTTPException(400, res.get("error", "Stoppen fehlgeschlagen."))
|
|
return res
|
|
|
|
|
|
@router.post("/ideen/retry")
|
|
def retry(body: TaskIn) -> dict:
|
|
res = ideen.retry_task(body.id)
|
|
if not res.get("ok"):
|
|
raise HTTPException(400, res.get("error", "Neuer Versuch fehlgeschlagen."))
|
|
return res
|
|
|
|
|
|
@router.post("/ideen/prio")
|
|
def prio(body: PrioIn) -> dict:
|
|
res = ideen.prio_task(body.id, body.richtung)
|
|
if not res.get("ok"):
|
|
raise HTTPException(400, res.get("error", "Prio-Änderung fehlgeschlagen."))
|
|
return res
|
|
|
|
|
|
class WeiterIn(BaseModel):
|
|
id: str
|
|
ziel: str = "" # "lxc" | "docker" (leer = Box entscheidet)
|
|
tiefe: str = "" # "simpel" | "gruendlich" (leer = Box schätzt selbst)
|
|
|
|
|
|
@router.post("/ideen/weiterfuehren")
|
|
def weiterfuehren(body: WeiterIn) -> dict:
|
|
"""„Konzept gefällt mir" → IDE-Projekt-Karte mit dem fertigen Konzept als Vorlage."""
|
|
res = ideen.projekt_aus_idee(body.id, ziel=body.ziel, tiefe=body.tiefe)
|
|
if not res.get("ok"):
|
|
raise HTTPException(400, res.get("error", "Projekt konnte nicht angelegt werden."))
|
|
return res
|
|
|
|
|
|
class NachschaerfenIn(BaseModel):
|
|
id: str
|
|
hinweis: str
|
|
|
|
|
|
@router.post("/ideen/nachschaerfen")
|
|
def nachschaerfen(body: NachschaerfenIn) -> dict:
|
|
"""„Punkt X passt nicht" → Überarbeitungs-Runde am bestehenden Konzept."""
|
|
res = ideen.konzept_ueberarbeiten(body.id, body.hinweis)
|
|
if not res.get("ok"):
|
|
raise HTTPException(400, res.get("error", "Überarbeitung konnte nicht gestartet werden."))
|
|
return res
|
|
|
|
|
|
@router.post("/ideen/archivieren")
|
|
def archive(body: TaskIn) -> dict:
|
|
res = ideen.archive_task(body.id)
|
|
if not res.get("ok"):
|
|
raise HTTPException(400, res.get("error", "Archivieren fehlgeschlagen."))
|
|
return res
|
|
|
|
|
|
@router.post("/ideen/einordnen")
|
|
def einordnen(body: EinordnenIn) -> dict:
|
|
"""Einordnungs-VORSCHLAG beim Tippen. Wirft nie — scheitert es, kommt `ok: false`
|
|
und die Oberfläche behält ihre Voreinstellung."""
|
|
return ideen.einordnen(body.text)
|
|
|
|
|
|
@router.post("/ideen/archivieren-alle")
|
|
def archive_alle(body: ArchivAlleIn) -> dict:
|
|
"""Fertige Karten sammelweise wegräumen. Fasst ausschließlich `done` an."""
|
|
res = ideen.archive_done(body.projekt)
|
|
if not res.get("ok"):
|
|
raise HTTPException(400, res.get("error", "Archivieren fehlgeschlagen."))
|
|
return res
|
|
|
|
|
|
@router.get("/ideen/{id}/log")
|
|
def get_log(id: str) -> dict:
|
|
return ideen.log_of(id)
|
|
|
|
|
|
@router.get("/ideen/{id}/ergebnis")
|
|
def get_ergebnis(id: str) -> dict:
|
|
return ideen.ergebnis_of(id)
|
|
|
|
|
|
@router.get("/ideen/{id}/konzept")
|
|
def get_konzept(id: str) -> dict:
|
|
return ideen.konzept_of(id)
|