From 159f825a2bca85a4ce97dedf2da4919c4f119bff Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 16 Nov 2023 17:05:22 -0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20fix(store.py):=20change=20check?= =?UTF-8?q?=5Fif=5Fstore=5Fhas=5Fapi=5Fkey=20function=20to=20be=20async=20?= =?UTF-8?q?and=20handle=20exceptions=20properly=20=E2=9C=A8=20feat(store.p?= =?UTF-8?q?y):=20add=20support=20for=20checking=20if=20store=20has=20a=20v?= =?UTF-8?q?alid=20API=20key=20using=20the=20StoreService=20=F0=9F=90=9B=20?= =?UTF-8?q?fix(service.py):=20remove=20unused=20import=20and=20fix=20forma?= =?UTF-8?q?tting=20=E2=9C=A8=20feat(service.py):=20add=20check=5Fapi=5Fkey?= =?UTF-8?q?=20method=20to=20StoreService=20to=20check=20if=20an=20API=20ke?= =?UTF-8?q?y=20is=20valid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/api/v1/store.py | 17 +++++++++++----- .../langflow/services/store/service.py | 20 +++++++++++++++++-- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/src/backend/langflow/api/v1/store.py b/src/backend/langflow/api/v1/store.py index 65f004fa5..c94bf0156 100644 --- a/src/backend/langflow/api/v1/store.py +++ b/src/backend/langflow/api/v1/store.py @@ -51,12 +51,19 @@ def check_if_store_is_enabled( @router.get("/check/api_key") -def check_if_store_has_api_key( - api_key=Depends(get_optional_user_store_api_key), +async def check_if_store_has_api_key( + api_key: Optional[str] = Depends(get_optional_user_store_api_key), + store_service: StoreService = Depends(get_store_service), ): - return { - "has_api_key": api_key is not None, - } + if api_key is None: + return {"has_api_key": False} + + try: + is_valid = await store_service.check_api_key(api_key) + except Exception as e: + raise HTTPException(status_code=400, detail=str(e)) + + return {"has_api_key": is_valid} @router.post("/components/", response_model=CreateComponentResponse, status_code=201) diff --git a/src/backend/langflow/services/store/service.py b/src/backend/langflow/services/store/service.py index 5da323138..acf6efcd0 100644 --- a/src/backend/langflow/services/store/service.py +++ b/src/backend/langflow/services/store/service.py @@ -4,8 +4,6 @@ from uuid import UUID import httpx from httpx import HTTPError, HTTPStatusError -from loguru import logger - from langflow.services.base import Service from langflow.services.store.schema import ( CreateComponentResponse, @@ -15,6 +13,7 @@ from langflow.services.store.schema import ( StoreComponentCreate, ) from langflow.services.store.utils import process_tags_for_post, update_components_with_user_data +from loguru import logger if TYPE_CHECKING: from langflow.services.settings.service import SettingsService @@ -78,6 +77,23 @@ class StoreService(Service): # will make a property return that data # Without making the request multiple times + async def check_api_key(self, api_key: str): + # Check if the api key is valid + # If it is, return True + # If it is not, return False + try: + user_data, _ = await self._get(f"{self.base_url}/users/me", api_key, params={"fields": "id"}) + if isinstance(user_data, list): + user_data = user_data[0] + return "id" in user_data + except HTTPStatusError as exc: + if exc.response.status_code in [403, 401]: + return False + else: + raise ValueError(f"Unexpected status code: {exc.response.status_code}") + except Exception as exc: + raise ValueError(f"Unexpected error: {exc}") + async def _get( self, url: str, api_key: Optional[str] = None, params: Optional[Dict[str, Any]] = None ) -> Tuple[List[Dict[str, Any]], Dict[str, Any]]: