Complete Forgejo discussion MVP
This commit is contained in:
parent
d84a885fdb
commit
51706d2d11
17 changed files with 1708 additions and 127 deletions
|
|
@ -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('/')}",
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue