Spaces:
Build error
Build error
| from fastapi import APIRouter, Depends, status | |
| from fastapi.responses import JSONResponse | |
| from pydantic import SecretStr | |
| from openhands.core.logger import openhands_logger as logger | |
| from openhands.integrations.provider import ( | |
| PROVIDER_TOKEN_TYPE, | |
| ProviderHandler, | |
| ) | |
| from openhands.integrations.service_types import ( | |
| AuthenticationError, | |
| Branch, | |
| Repository, | |
| SuggestedTask, | |
| UnknownException, | |
| User, | |
| ) | |
| from openhands.server.dependencies import get_dependencies | |
| from openhands.server.shared import server_config | |
| from openhands.server.user_auth import ( | |
| get_access_token, | |
| get_provider_tokens, | |
| get_user_id, | |
| ) | |
| app = APIRouter(prefix='/api/user', dependencies=get_dependencies()) | |
| async def get_user_repositories( | |
| sort: str = 'pushed', | |
| provider_tokens: PROVIDER_TOKEN_TYPE | None = Depends(get_provider_tokens), | |
| access_token: SecretStr | None = Depends(get_access_token), | |
| user_id: str | None = Depends(get_user_id), | |
| ) -> list[Repository] | JSONResponse: | |
| if provider_tokens: | |
| client = ProviderHandler( | |
| provider_tokens=provider_tokens, | |
| external_auth_token=access_token, | |
| external_auth_id=user_id, | |
| ) | |
| try: | |
| return await client.get_repositories(sort, server_config.app_mode) | |
| except AuthenticationError as e: | |
| logger.info( | |
| f'Returning 401 Unauthorized - Authentication error for user_id: {user_id}, error: {str(e)}' | |
| ) | |
| return JSONResponse( | |
| content=str(e), | |
| status_code=status.HTTP_401_UNAUTHORIZED, | |
| ) | |
| except UnknownException as e: | |
| return JSONResponse( | |
| content=str(e), | |
| status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, | |
| ) | |
| logger.info( | |
| f'Returning 401 Unauthorized - Git provider token required for user_id: {user_id}' | |
| ) | |
| return JSONResponse( | |
| content='Git provider token required. (such as GitHub).', | |
| status_code=status.HTTP_401_UNAUTHORIZED, | |
| ) | |
| async def get_user( | |
| provider_tokens: PROVIDER_TOKEN_TYPE | None = Depends(get_provider_tokens), | |
| access_token: SecretStr | None = Depends(get_access_token), | |
| user_id: str | None = Depends(get_user_id), | |
| ) -> User | JSONResponse: | |
| if provider_tokens: | |
| client = ProviderHandler( | |
| provider_tokens=provider_tokens, external_auth_token=access_token | |
| ) | |
| try: | |
| user: User = await client.get_user() | |
| return user | |
| except AuthenticationError as e: | |
| logger.info( | |
| f'Returning 401 Unauthorized - Authentication error for user_id: {user_id}, error: {str(e)}' | |
| ) | |
| return JSONResponse( | |
| content=str(e), | |
| status_code=status.HTTP_401_UNAUTHORIZED, | |
| ) | |
| except UnknownException as e: | |
| return JSONResponse( | |
| content=str(e), | |
| status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, | |
| ) | |
| logger.info( | |
| f'Returning 401 Unauthorized - Git provider token required for user_id: {user_id}' | |
| ) | |
| return JSONResponse( | |
| content='Git provider token required. (such as GitHub).', | |
| status_code=status.HTTP_401_UNAUTHORIZED, | |
| ) | |
| async def search_repositories( | |
| query: str, | |
| per_page: int = 5, | |
| sort: str = 'stars', | |
| order: str = 'desc', | |
| provider_tokens: PROVIDER_TOKEN_TYPE | None = Depends(get_provider_tokens), | |
| access_token: SecretStr | None = Depends(get_access_token), | |
| user_id: str | None = Depends(get_user_id), | |
| ) -> list[Repository] | JSONResponse: | |
| if provider_tokens: | |
| client = ProviderHandler( | |
| provider_tokens=provider_tokens, external_auth_token=access_token | |
| ) | |
| try: | |
| repos: list[Repository] = await client.search_repositories( | |
| query, per_page, sort, order | |
| ) | |
| return repos | |
| except AuthenticationError as e: | |
| return JSONResponse( | |
| content=str(e), | |
| status_code=status.HTTP_401_UNAUTHORIZED, | |
| ) | |
| except UnknownException as e: | |
| return JSONResponse( | |
| content=str(e), | |
| status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, | |
| ) | |
| logger.info( | |
| f'Returning 401 Unauthorized - GitHub token required for user_id: {user_id}' | |
| ) | |
| return JSONResponse( | |
| content='GitHub token required.', | |
| status_code=status.HTTP_401_UNAUTHORIZED, | |
| ) | |
| async def get_suggested_tasks( | |
| provider_tokens: PROVIDER_TOKEN_TYPE | None = Depends(get_provider_tokens), | |
| access_token: SecretStr | None = Depends(get_access_token), | |
| user_id: str | None = Depends(get_user_id), | |
| ) -> list[SuggestedTask] | JSONResponse: | |
| """Get suggested tasks for the authenticated user across their most recently pushed repositories. | |
| Returns: | |
| - PRs owned by the user | |
| - Issues assigned to the user. | |
| """ | |
| if provider_tokens: | |
| client = ProviderHandler( | |
| provider_tokens=provider_tokens, external_auth_token=access_token | |
| ) | |
| try: | |
| tasks: list[SuggestedTask] = await client.get_suggested_tasks() | |
| return tasks | |
| except AuthenticationError as e: | |
| return JSONResponse( | |
| content=str(e), | |
| status_code=status.HTTP_401_UNAUTHORIZED, | |
| ) | |
| except UnknownException as e: | |
| return JSONResponse( | |
| content=str(e), | |
| status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, | |
| ) | |
| logger.info(f'Returning 401 Unauthorized - No providers set for user_id: {user_id}') | |
| return JSONResponse( | |
| content='No providers set.', | |
| status_code=status.HTTP_401_UNAUTHORIZED, | |
| ) | |
| async def get_repository_branches( | |
| repository: str, | |
| provider_tokens: PROVIDER_TOKEN_TYPE | None = Depends(get_provider_tokens), | |
| access_token: SecretStr | None = Depends(get_access_token), | |
| user_id: str | None = Depends(get_user_id), | |
| ) -> list[Branch] | JSONResponse: | |
| """Get branches for a repository. | |
| Args: | |
| repository: The repository name in the format 'owner/repo' | |
| Returns: | |
| A list of branches for the repository | |
| """ | |
| if provider_tokens: | |
| client = ProviderHandler( | |
| provider_tokens=provider_tokens, external_auth_token=access_token | |
| ) | |
| try: | |
| branches: list[Branch] = await client.get_branches(repository) | |
| return branches | |
| except AuthenticationError as e: | |
| return JSONResponse( | |
| content=str(e), | |
| status_code=status.HTTP_401_UNAUTHORIZED, | |
| ) | |
| except UnknownException as e: | |
| return JSONResponse( | |
| content=str(e), | |
| status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, | |
| ) | |
| logger.info( | |
| f'Returning 401 Unauthorized - Git provider token required for user_id: {user_id}' | |
| ) | |
| return JSONResponse( | |
| content='Git provider token required. (such as GitHub).', | |
| status_code=status.HTTP_401_UNAUTHORIZED, | |
| ) | |