GitRecap / services /fetcher_service.py
github-actions[bot]
Deploy app/api to HF Space
0491d76
from typing import Dict, Optional
from fastapi import HTTPException
from git_recap.providers.base_fetcher import BaseFetcher
from git_recap.providers import GitHubFetcher, AzureFetcher, GitLabFetcher, URLFetcher
import ulid
# In-memory store mapping session_id to its respective fetcher instance
fetchers: Dict[str, BaseFetcher] = {}
def store_fetcher(session_id: str, pat: str, provider: Optional[str] = "GitHub") -> None:
"""
Store the provided PAT associated with the given session_id.
Args:
session_id: The session identifier tied to the active session.
pat: The Personal Access Token to be stored (or URL for URL provider).
provider: The provider identifier (default is "GitHub").
Can be "Azure Devops", "GitLab", or "URL".
Raises:
HTTPException: If the session_id or PAT/URL is invalid or unsupported provider.
"""
if not session_id or not pat:
raise HTTPException(status_code=400, detail="Invalid session_id or PAT/URL")
try:
if provider == "GitHub":
fetchers[session_id] = GitHubFetcher(pat=pat)
elif provider == "Azure Devops":
fetchers[session_id] = AzureFetcher(pat=pat)
elif provider == "GitLab":
fetchers[session_id] = GitLabFetcher(pat=pat)
elif provider == "URL":
fetchers[session_id] = URLFetcher(url=pat)
else:
raise HTTPException(status_code=400, detail="Unsupported provider")
except ValueError as e:
raise HTTPException(status_code=400, detail=str(e))
except Exception as e:
raise HTTPException(
status_code=500,
detail=f"Failed to initialize {provider} fetcher: {str(e)}"
)
def get_fetcher(session_id: str) -> BaseFetcher:
"""
Retrieve the stored fetcher instance for the provided session_id.
Args:
session_id: The session identifier.
Returns:
The fetcher instance associated with the session_id.
Raises:
HTTPException: If no fetcher is found for the given session_id.
"""
fetcher = fetchers.get(session_id)
if not fetcher:
raise HTTPException(status_code=404, detail="Session not found")
return fetcher
def expire_fetcher(session_id: str) -> None:
"""
Remove the fetcher associated with the given session_id.
This function is used for cleaning up resources by expiring the stored fetcher instance
when its corresponding session is expired.
Args:
session_id: The session identifier whose associated fetcher should be removed.
"""
fetcher = fetchers.pop(session_id, None)
if fetcher and hasattr(fetcher, 'clear'):
fetcher.clear()
def generate_session_id() -> str:
"""
Generate a new unique session ID.
Returns:
str: A new ULID-based session identifier.
"""
return ulid.ulid()