mirror of
https://github.com/OpenHands/OpenHands.git
synced 2025-12-26 05:48:36 +08:00
165 lines
5.0 KiB
Python
165 lines
5.0 KiB
Python
from fastapi import APIRouter, Depends, status
|
|
from fastapi.responses import JSONResponse
|
|
from pydantic import SecretStr
|
|
|
|
from openhands.integrations.github.github_service import GithubServiceImpl
|
|
from openhands.integrations.provider import (
|
|
PROVIDER_TOKEN_TYPE,
|
|
ProviderHandler,
|
|
ProviderType,
|
|
)
|
|
from openhands.integrations.service_types import (
|
|
AuthenticationError,
|
|
Repository,
|
|
SuggestedTask,
|
|
UnknownException,
|
|
User,
|
|
)
|
|
from openhands.server.auth import get_access_token, get_provider_tokens, get_user_id
|
|
from openhands.server.shared import server_config
|
|
|
|
app = APIRouter(prefix='/api/user')
|
|
|
|
|
|
@app.get('/repositories', response_model=list[Repository])
|
|
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),
|
|
):
|
|
if provider_tokens:
|
|
client = ProviderHandler(
|
|
provider_tokens=provider_tokens,
|
|
external_auth_token=access_token,
|
|
external_auth_id=user_id,
|
|
)
|
|
|
|
try:
|
|
repos: list[Repository] = await client.get_repositories(
|
|
sort, server_config.app_mode
|
|
)
|
|
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,
|
|
)
|
|
|
|
return JSONResponse(
|
|
content='Git provider token required. (such as GitHub).',
|
|
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
)
|
|
|
|
|
|
@app.get('/info', response_model=User)
|
|
async def get_user(
|
|
provider_tokens: PROVIDER_TOKEN_TYPE | None = Depends(get_provider_tokens),
|
|
access_token: SecretStr | None = Depends(get_access_token),
|
|
):
|
|
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:
|
|
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,
|
|
)
|
|
|
|
return JSONResponse(
|
|
content='Git provider token required. (such as GitHub).',
|
|
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
)
|
|
|
|
|
|
@app.get('/search/repositories', response_model=list[Repository])
|
|
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),
|
|
):
|
|
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,
|
|
)
|
|
|
|
return JSONResponse(
|
|
content='GitHub token required.',
|
|
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
)
|
|
|
|
|
|
@app.get('/suggested-tasks', response_model=list[SuggestedTask])
|
|
async def get_suggested_tasks(
|
|
provider_tokens: PROVIDER_TOKEN_TYPE | None = Depends(get_provider_tokens),
|
|
access_token: SecretStr | None = Depends(get_access_token),
|
|
):
|
|
"""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,
|
|
)
|
|
|
|
return JSONResponse(
|
|
content='No providers set.',
|
|
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
) |