Files
g0v0-server/app/dependencies/fetcher.py
2025-11-25 03:09:02 +00:00

40 lines
1.4 KiB
Python

from typing import Annotated
from app.config import settings
from app.dependencies.database import get_redis
from app.fetcher import Fetcher as OriginFetcher
from app.fetcher._base import TokenAuthError
from app.log import fetcher_logger
from fastapi import Depends
fetcher: OriginFetcher | None = None
logger = fetcher_logger("FetcherDependency")
async def get_fetcher() -> OriginFetcher:
global fetcher
if fetcher is None:
fetcher = OriginFetcher(
settings.fetcher_client_id,
settings.fetcher_client_secret,
)
redis = get_redis()
access_token = await redis.get(f"fetcher:access_token:{fetcher.client_id}")
expire_at = await redis.get(f"fetcher:expire_at:{fetcher.client_id}")
if expire_at:
fetcher.token_expiry = int(float(expire_at))
if access_token:
fetcher.access_token = str(access_token)
# Always ensure the access token is valid, regardless of initial state
try:
await fetcher.ensure_valid_access_token()
except TokenAuthError as exc:
logger.warning(f"Failed to refresh fetcher access token during startup: {exc}. Will retry on demand.")
except Exception as exc:
logger.exception("Unexpected error while initializing fetcher access token", exc_info=exc)
return fetcher
Fetcher = Annotated[OriginFetcher, Depends(get_fetcher)]