import re import httpx from fastapi import APIRouter, HTTPException from config import GITEA_TOKEN, GITEA_URL router = APIRouter() HEADERS = {"Authorization": f"token {GITEA_TOKEN}"} if GITEA_TOKEN else {} _SAFE_NAME = re.compile(r"^[a-zA-Z0-9._-]+$") @router.get("/repos") async def list_repos(): async with httpx.AsyncClient() as c: r = await c.get(f"{GITEA_URL}/api/v1/repos/search", headers=HEADERS, params={"limit": 50}) return r.json() @router.get("/repos/{owner}/{repo}/commits") async def list_commits(owner: str, repo: str, page: int = 1): if not _SAFE_NAME.match(owner) or not _SAFE_NAME.match(repo): raise HTTPException(status_code=400, detail="Invalid owner or repo name") async with httpx.AsyncClient() as c: r = await c.get(f"{GITEA_URL}/api/v1/repos/{owner}/{repo}/commits", headers=HEADERS, params={"page": page}) return r.json()