diff --git a/backend/app/services/codegraph/repo_service.py b/backend/app/services/codegraph/repo_service.py index eba4fca8..e98a290a 100644 --- a/backend/app/services/codegraph/repo_service.py +++ b/backend/app/services/codegraph/repo_service.py @@ -114,7 +114,10 @@ async def index_repo(self, repo_input: str, discord_id: str) -> Dict[str, Any]: } ) as response: if response.status == 200: - data = await response.json() if await response.text() else {} + try: + data = await response.json() + except (aiohttp.ContentTypeError, ValueError): + data = {} await self.supabase.table("indexed_repositories").update({ "indexing_status": "completed", @@ -133,8 +136,9 @@ async def index_repo(self, repo_input: str, discord_id: str) -> Dict[str, Any]: "nodes": data.get("node_count", 0), "edges": data.get("edge_count", 0) } - else: - error_msg = (await response.text())[:500] + elif response.status == 429: + error_text = await response.text() + error_msg = error_text[:500] await self.supabase.table("indexed_repositories").update({ "indexing_status": "failed", @@ -143,16 +147,69 @@ async def index_repo(self, repo_input: str, discord_id: str) -> Dict[str, Any]: "is_deleted", False ).execute() - return {"status": "error", "message": f"Indexing failed: {error_msg}"} + return { + "status": "error", + "error_code": "RATE_LIMITED", + "retryable": True, + "message": "Rate limit exceeded. Please try again later." + } + elif 500 <= response.status < 600: + error_text = await response.text() + error_msg = error_text[:500] + + await self.supabase.table("indexed_repositories").update({ + "indexing_status": "failed", + "last_error": error_msg + }).eq("repository_full_name", repo_info['full_name']).eq( + "is_deleted", False + ).execute() + + return { + "status": "error", + "error_code": "BACKEND_ERROR", + "retryable": True, + "message": "Indexing service encountered an internal error. Please try again later." + } + else: + error_text = await response.text() + error_msg = error_text[:500] + + await self.supabase.table("indexed_repositories").update({ + "indexing_status": "failed", + "last_error": error_msg + }).eq("repository_full_name", repo_info['full_name']).eq( + "is_deleted", False + ).execute() + return { + "status": "error", + "error_code": "INVALID_REQUEST", + "retryable": False, + "message": "Indexing request was rejected. Please verify the repository." + } except ValueError as e: - return {"status": "error", "message": str(e)} + return { + "status": "error", + "error_code": "INVALID_REPOSITORY", + "retryable": False, + "message": str(e) + } except aiohttp.ClientError as e: logger.exception(f"Network error indexing {repo_input}: {e}") - return {"status": "error", "message": "Network error. Please try again."} + return { + "status": "error", + "error_code": "BACKEND_UNAVAILABLE", + "retryable": True, + "message": "Indexing service is currently unavailable. Please try again later." + } except Exception: logger.exception(f"Failed to index {repo_input}") - return {"status": "error", "message": "Indexing failed. Please contact support."} + return { + "status": "error", + "error_code": "INDEXING_FAILED", + "retryable": False, + "message": "Indexing failed due to an unexpected error." + } async def query_repo(self, question: str, repo_full_name: str) -> Dict[str, Any]: """