"""FlowDeck — Dashboard: liste des projets Gitea.""" from __future__ import annotations import logging from fastapi import APIRouter, Request, HTTPException, Query from fastapi.responses import HTMLResponse from app.services.gitea_client import gitea logger = logging.getLogger(__name__) router = APIRouter(tags=["dashboard"]) @router.get("/", response_class=HTMLResponse) async def dashboard( request: Request, search: str = Query(default=""), show_archived: bool = Query(default=False), ): """Dashboard: liste tous les projets Gitea (user + orgs).""" try: # User repos repos = await gitea.get_user_repos(page=1, limit=50) # Org repos orgs = await gitea.get_user_orgs() for org in orgs: try: org_repos = await gitea.get_org_repos(org["username"]) for r in org_repos: r["_org"] = org["username"] repos.extend(org_repos) except Exception: logger.debug("Skip org %s", org.get("username")) # Filter if search: q = search.lower() repos = [r for r in repos if q in r.get("full_name", "").lower() or q in (r.get("description") or "").lower()] if not show_archived: repos = [r for r in repos if not r.get("archived", False)] # Sort by updated_at desc repos.sort(key=lambda r: r.get("updated_at", ""), reverse=True) except Exception as e: logger.error("Dashboard error: %s", e) repos = [] from jinja2 import Environment, FileSystemLoader env = Environment(loader=FileSystemLoader("app/templates")) template = env.get_template("dashboard.html") return template.render( request=request, repos=repos, search=search, show_archived=show_archived, )