Source code for bridge.adapters.api.routers.github_to_biotools

"""
Endpoint to extract bio.tools metadata from a GitHub repository.
"""

import logging

from fastapi import APIRouter, HTTPException, status
from fastapi.responses import JSONResponse
from pydantic import BaseModel

from bridge.handlers import extract_meta_from_repo

logger = logging.getLogger(__name__)

router = APIRouter(tags=["GitHub -> bio.tools bridge"])


[docs] class GitHubToBioToolsPayload(BaseModel): """ Payload for extracting bio.tools metadata from a GitHub repository. Parameters ---------- owner : str The owner of the source GitHub repository. repo : str The name of the source GitHub repository. biotools_id : Optional[str] Existing bio.tools ID to update, if available. """ owner: str repo: str biotools_id: str | None = None
[docs] @router.post( "", status_code=status.HTTP_201_CREATED, summary="Extract bio.tools metadata from a GitHub repository", description="Extract bio.tools metadata from a GitHub repository", ) async def github_to_biotools(payload: GitHubToBioToolsPayload): """ Extract bio.tools metadata from a GitHub repository. Parameters ---------- payload : GitHubToBioToolsPayload The payload containing GitHub repo details and optional existing bio.tools ID. """ logger.info( f"Received metadata extraction request for {payload.owner}/{payload.repo} to bio.tools:{payload.biotools_id}" ) try: metadata = await extract_meta_from_repo( schema="biotools", repo_type="github", owner=payload.owner, repo=payload.repo, identifier=payload.biotools_id, ) return JSONResponse(status_code=status.HTTP_201_CREATED, content=metadata) except Exception as e: logger.error(f"Failed to extract metadata from GitHub repository: {e}") raise HTTPException(status_code=500, detail=f"Failed to extract metadata from GitHub repository: {e}") from e