feat: Gitea — register, settings connect, tabs org, search
FlowDeck CI / test (push) Failing after 4s
FlowDeck CI / docker (push) Has been skipped

1. Pas de Gitea sans config: _require_gitea() → 401 si pas de token OAuth
2. Register Gitea: boutons "Login/Register with Gitea" dynamiques selon l'onglet
3. Settings → Integrations: ✅ Active / 🔗 Connect / Disconnect + API status/disconnect
4. Workspaces: tabs par org (All | org1 | org2) + barre recherche 🔍 filtrage live
5. API: GET /api/gitea/status, DELETE /api/gitea/disconnect
This commit is contained in:
2026-07-13 15:17:17 -04:00
parent 46336df21b
commit e9d1c32b4f
4 changed files with 128 additions and 35 deletions
+27 -4
View File
@@ -6,12 +6,11 @@ router = APIRouter(tags=["gitea"], prefix="/api/gitea")
def _require_gitea(request: Request):
"""Return a per-user GiteaClient or fallback to admin token."""
from app.services.gitea_client import get_user_gitea_client, GiteaClient
"""Return a per-user GiteaClient or raise 401."""
from app.services.gitea_client import get_user_gitea_client
client = get_user_gitea_client(request)
if not client:
# Fallback to server admin token
client = GiteaClient()
raise HTTPException(status_code=401, detail="Gitea not connected. Go to Settings → Integrations or register with Gitea.")
return client
@@ -129,3 +128,27 @@ async def get_labels(request: Request, owner: str, repo: str):
]}
except Exception as e:
return JSONResponse({"error": str(e)}, status_code=502)
# ── Account linking ──
@router.get("/status")
async def gitea_status(request: Request):
"""Check if the current user has Gitea linked."""
from app.services.gitea_client import get_user_gitea_client
client = get_user_gitea_client(request)
return {"linked": client is not None}
@router.delete("/disconnect")
async def disconnect_gitea(request: Request):
"""Remove all Gitea OAuth tokens for the current user."""
from app.auth.session import SessionManager
from app.db import get_conn
user = SessionManager.decode_session(request.cookies.get("flowdeck_session", ""))
if not user:
return JSONResponse({"error": "Not authenticated"}, status_code=401)
with get_conn() as conn:
conn.execute("DELETE FROM user_oauth_tokens WHERE user_id=? AND provider='gitea'", (user["id"],))
conn.commit()
return {"status": "ok"}