🐛 fix(store.py): change check_if_store_has_api_key function to be async and handle exceptions properly

 feat(store.py): add support for checking if store has a valid API key using the StoreService
🐛 fix(service.py): remove unused import and fix formatting
 feat(service.py): add check_api_key method to StoreService to check if an API key is valid
This commit is contained in:
Gabriel Luiz Freitas Almeida 2023-11-16 17:05:22 -03:00
commit 159f825a2b
2 changed files with 30 additions and 7 deletions

View file

@ -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)

View file

@ -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]]: