From 867177e106aec3eb64ce132e8bd88064d37ccfc8 Mon Sep 17 00:00:00 2001 From: Bulat Kurbanov Date: Wed, 7 Dec 2022 21:01:21 +0100 Subject: [PATCH] Fix get_book --- src/app/services/cache_updater.py | 10 ++++------ src/app/services/library_client.py | 22 ++++++++++++++-------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/app/services/cache_updater.py b/src/app/services/cache_updater.py index 72f0442..0204685 100644 --- a/src/app/services/cache_updater.py +++ b/src/app/services/cache_updater.py @@ -110,16 +110,14 @@ async def cache_file_by_book_id( ) -> Optional[CachedFile]: r_client: aioredis.Redis = ctx["redis"] - try: - book = await get_book(book_id) - except httpx.ConnectError: + get_book_retry = 3 if by_request else 1 + book = await get_book(book_id, get_book_retry) + + if book is None: if by_request: return None raise Retry(defer=15) - if book is None: - return None - if file_type not in book.available_types: return None diff --git a/src/app/services/library_client.py b/src/app/services/library_client.py index e392d88..cb99261 100644 --- a/src/app/services/library_client.py +++ b/src/app/services/library_client.py @@ -48,16 +48,22 @@ class BookDetail(Book): AUTH_HEADERS = {"Authorization": env_config.LIBRARY_API_KEY} -async def get_book(book_id: int) -> Optional[BookDetail]: - async with httpx.AsyncClient(timeout=2 * 60) as client: - response = await client.get( - f"{env_config.LIBRARY_URL}/api/v1/books/{book_id}", headers=AUTH_HEADERS - ) +async def get_book(book_id: int, retry: int = 3) -> Optional[BookDetail]: + if retry == 0: + return None - if response.status_code != 200: - return None + try: + async with httpx.AsyncClient(timeout=2 * 60) as client: + response = await client.get( + f"{env_config.LIBRARY_URL}/api/v1/books/{book_id}", headers=AUTH_HEADERS + ) - return BookDetail.parse_obj(response.json()) + if response.status_code != 200: + return None + + return BookDetail.parse_obj(response.json()) + except (httpx.ConnectError, httpx.ReadError, httpx.ReadTimeout): + return await get_book(book_id, retry=retry - 1) async def get_books(page: int, page_size: int) -> Page[Book]: