github.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import requests
  2. from fastapi import APIRouter, HTTPException, Request
  3. from fastapi.responses import JSONResponse
  4. from openhands.server.shared import openhands_config
  5. app = APIRouter(prefix='/api')
  6. @app.get('/github/repositories')
  7. def get_github_repositories(
  8. request: Request,
  9. page: int = 1,
  10. per_page: int = 10,
  11. sort: str = 'pushed',
  12. installation_id: int | None = None,
  13. ):
  14. # Extract the GitHub token from the headers
  15. github_token = request.headers.get('X-GitHub-Token')
  16. if not github_token:
  17. raise HTTPException(status_code=400, detail='Missing X-GitHub-Token header')
  18. openhands_config.verify_github_repo_list(installation_id)
  19. # Add query parameters
  20. params: dict[str, str] = {
  21. 'page': str(page),
  22. 'per_page': str(per_page),
  23. }
  24. # Construct the GitHub API URL
  25. if installation_id:
  26. github_api_url = (
  27. f'https://api.github.com/user/installations/{installation_id}/repositories'
  28. )
  29. else:
  30. github_api_url = 'https://api.github.com/user/repos'
  31. params['sort'] = sort
  32. # Set the authorization header with the GitHub token
  33. headers = {
  34. 'Authorization': f'Bearer {github_token}',
  35. 'Accept': 'application/vnd.github.v3+json',
  36. }
  37. # Fetch repositories from GitHub
  38. try:
  39. response = requests.get(github_api_url, headers=headers, params=params)
  40. response.raise_for_status() # Raise an error for HTTP codes >= 400
  41. except requests.exceptions.RequestException as e:
  42. raise HTTPException(
  43. status_code=response.status_code if response else 500,
  44. detail=f'Error fetching repositories: {str(e)}',
  45. )
  46. # Return the JSON response
  47. return JSONResponse(content=response.json())