"""FlowDeck — Collections : boards. Découpe A28 de l'ancien app/routers/collections.py (2 622 lignes, 53 routes) — un module par concern, contrat inchangé. """ from __future__ import annotations import logging from fastapi import APIRouter, HTTPException, Request logger = logging.getLogger(__name__) router = APIRouter(tags=["collections"], prefix="/db") # ── Gitea Board Compatibility (BEFORE {collection_id} wildcards) ── @router.get("/boards/api") def list_boards_as_collections(request: Request): """API: list all Gitea boards as pseudo-collections.""" from app.services.collection_adapter import GiteaBoardCompat boards = GiteaBoardCompat.list_boards_as_collections() return {"boards": boards} @router.get("/board/{owner}/{repo}/api") async def get_board_as_collection(request: Request, owner: str, repo: str): """API: get a specific Gitea board as a pseudo-collection.""" from app.services.collection_adapter import GiteaBoardCompat coll = GiteaBoardCompat.get_board_as_collection(owner, repo) if not coll: raise HTTPException(status_code=404, detail="Board not found") from app.services.gitea_client import gitea issues = await gitea.get_issues(owner, repo, state="all") cards = GiteaBoardCompat.get_board_cards(owner, repo, issues) return {"collection": coll, "pages": cards} @router.post("/board/{owner}/{repo}/sync") async def sync_board_to_collection(request: Request, owner: str, repo: str): """Sync a Gitea board to a real collection.""" from app.services.collection_adapter import GiteaBoardCompat from app.services.gitea_client import gitea issues = await gitea.get_issues(owner, repo, state="all") coll_id = GiteaBoardCompat.sync_to_collection(owner, repo, issues) if coll_id is None: raise HTTPException(status_code=404, detail="Board not found") return {"collection_id": coll_id, "status": "synced"} # ── Collection Properties (v1.4.0) ──