Complete Forgejo discussion MVP

This commit is contained in:
kacper 2026-04-13 18:19:50 -04:00
parent d84a885fdb
commit 51706d2d11
17 changed files with 1708 additions and 127 deletions

View file

@ -83,17 +83,32 @@ class ForgejoClient:
return await self._get_json("/api/v1/user", auth_required=True)
async def search_repositories(self) -> list[dict[str, Any]]:
payload = await self._get_json(
"/api/v1/repos/search",
params={
"limit": self._settings.forgejo_repo_scan_limit,
"page": 1,
"private": "false",
"is_private": "false",
},
)
data = payload.get("data", [])
return [repo for repo in data if isinstance(repo, dict)]
scan_limit = max(self._settings.forgejo_repo_scan_limit, 1)
page_limit = min(scan_limit, 50)
repos: list[dict[str, Any]] = []
page = 1
while len(repos) < scan_limit:
payload = await self._get_json(
"/api/v1/repos/search",
params={
"limit": page_limit,
"page": page,
"private": "false",
"is_private": "false",
},
)
if not isinstance(payload, dict):
break
data = payload.get("data", [])
page_repos = [repo for repo in data if isinstance(repo, dict)]
repos.extend(page_repos)
if len(page_repos) < page_limit:
break
page += 1
return repos[:scan_limit]
async def fetch_repository(self, owner: str, repo: str) -> dict[str, Any]:
payload = await self._get_json(
@ -124,6 +139,12 @@ class ForgejoClient:
return [issue for issue in payload if isinstance(issue, dict)]
return []
async def fetch_issue(self, owner: str, repo: str, issue_number: int) -> dict[str, Any]:
payload = await self._get_json(f"/api/v1/repos/{owner}/{repo}/issues/{issue_number}")
if isinstance(payload, dict):
return payload
raise ForgejoClientError(f"Unexpected issue payload for {owner}/{repo}#{issue_number}")
async def list_directory(self, owner: str, repo: str, path: str = "") -> list[dict[str, Any]]:
endpoint = f"/api/v1/repos/{owner}/{repo}/contents"
if path:
@ -166,6 +187,23 @@ class ForgejoClient:
return payload
raise ForgejoClientError(f"Unexpected comment payload for {owner}/{repo}#{issue_number}")
async def create_issue(
self,
owner: str,
repo: str,
title: str,
body: str,
) -> dict[str, Any]:
payload = await self._request_json(
"POST",
f"/api/v1/repos/{owner}/{repo}/issues",
json_payload={"title": title, "body": body},
auth_required=True,
)
if isinstance(payload, dict):
return payload
raise ForgejoClientError(f"Unexpected issue payload for {owner}/{repo}")
async def get_file_content(self, owner: str, repo: str, path: str) -> dict[str, str]:
payload = await self._get_json(
f"/api/v1/repos/{owner}/{repo}/contents/{path.strip('/')}",