From 67374445dea8437b9cc613a3db5e97a431fd78ec Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 7 Dec 2023 18:19:11 -0300 Subject: [PATCH 1/6] Update shared component API endpoint --- src/backend/langflow/api/v1/store.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/backend/langflow/api/v1/store.py b/src/backend/langflow/api/v1/store.py index c9371ab16..1588dedc7 100644 --- a/src/backend/langflow/api/v1/store.py +++ b/src/backend/langflow/api/v1/store.py @@ -3,6 +3,7 @@ from typing import Annotated, List, Optional, Union from uuid import UUID from fastapi import APIRouter, Depends, HTTPException, Query + from langflow.services.auth import utils as auth_utils from langflow.services.database.models.user.model import User from langflow.services.deps import get_settings_service, get_store_service @@ -101,7 +102,7 @@ async def share_component( @router.patch("/components/{component_id}", response_model=CreateComponentResponse, status_code=201) -async def update_component( +async def update_shared_component( component_id: UUID, component: StoreComponentCreate, store_service: StoreService = Depends(get_store_service), From 62697ac3a6f24c6d5f036e605c1efae7a9319a78 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 7 Dec 2023 18:21:30 -0300 Subject: [PATCH 2/6] Refactor store API endpoints --- src/backend/langflow/api/v1/store.py | 73 ++++++---------------------- 1 file changed, 16 insertions(+), 57 deletions(-) diff --git a/src/backend/langflow/api/v1/store.py b/src/backend/langflow/api/v1/store.py index 1588dedc7..313b0638b 100644 --- a/src/backend/langflow/api/v1/store.py +++ b/src/backend/langflow/api/v1/store.py @@ -1,9 +1,9 @@ -import warnings from typing import Annotated, List, Optional, Union from uuid import UUID from fastapi import APIRouter, Depends, HTTPException, Query +from langflow.api.utils import check_langflow_version from langflow.services.auth import utils as auth_utils from langflow.services.database.models.user.model import User from langflow.services.deps import get_settings_service, get_store_service @@ -17,7 +17,6 @@ from langflow.services.store.schema import ( UsersLikesResponse, ) from langflow.services.store.service import StoreService -from langflow.services.store.utils import get_lf_version_from_pypi router = APIRouter(prefix="/store", tags=["Components Store"]) @@ -71,31 +70,11 @@ async def check_if_store_has_api_key( async def share_component( component: StoreComponentCreate, store_service: StoreService = Depends(get_store_service), - store_api_Key: str = Depends(get_user_store_api_key), + store_api_key: str = Depends(get_user_store_api_key), ): try: - # Verify if this is the latest version of Langflow - # If not, raise an error - if not component.last_tested_version: - # Get the local version of Langflow - from langflow import __version__ as current_version - - component.last_tested_version = current_version - langflow_version = get_lf_version_from_pypi() - if langflow_version is None: - raise HTTPException( - status_code=500, - detail="Unable to verify the latest version of Langflow", - ) - elif langflow_version != component.last_tested_version: - # If the user is using an older version of Langflow, we need to raise an error - # raise ValueError( - warnings.warn( - f"Your version of Langflow ({component.last_tested_version}) is outdated." - f" Please update to the latest version ({langflow_version}) and try again." - ) - - result = await store_service.upload(store_api_Key, component) + await check_langflow_version(component) + result = await store_service.upload(store_api_key, component) return result except Exception as exc: raise HTTPException(status_code=400, detail=str(exc)) @@ -106,31 +85,11 @@ async def update_shared_component( component_id: UUID, component: StoreComponentCreate, store_service: StoreService = Depends(get_store_service), - store_api_Key: str = Depends(get_user_store_api_key), + store_api_key: str = Depends(get_user_store_api_key), ): try: - # Verify if this is the latest version of Langflow - # If not, raise an error - if not component.last_tested_version: - # Get the local version of Langflow - from langflow import __version__ as current_version - - component.last_tested_version = current_version - langflow_version = get_lf_version_from_pypi() - if langflow_version is None: - raise HTTPException( - status_code=500, - detail="Unable to verify the latest version of Langflow", - ) - elif langflow_version != component.last_tested_version: - # If the user is using an older version of Langflow, we need to raise an error - # raise ValueError( - warnings.warn( - f"Your version of Langflow ({component.last_tested_version}) is outdated." - f" Please update to the latest version ({langflow_version}) and try again." - ) - - result = await store_service.update(store_api_Key, component_id, component) + await check_langflow_version(component) + result = await store_service.update(store_api_key, component_id, component) return result except Exception as exc: raise HTTPException(status_code=400, detail=str(exc)) @@ -150,7 +109,7 @@ async def get_components( page: int = 1, limit: int = 10, store_service: StoreService = Depends(get_store_service), - store_api_Key: Optional[str] = Depends(get_optional_user_store_api_key), + store_api_key: Optional[str] = Depends(get_optional_user_store_api_key), ): try: return await store_service.get_list_component_response_model( @@ -165,7 +124,7 @@ async def get_components( filter_by_user=filter_by_user, page=page, limit=limit, - store_api_key=store_api_Key, + store_api_key=store_api_key, ) except CustomException as exc: raise HTTPException(status_code=exc.status_code, detail=str(exc)) from exc @@ -177,10 +136,10 @@ async def get_components( async def download_component( component_id: UUID, store_service: StoreService = Depends(get_store_service), - store_api_Key: str = Depends(get_user_store_api_key), + store_api_key: str = Depends(get_user_store_api_key), ): try: - component = await store_service.download(store_api_Key, component_id) + component = await store_service.download(store_api_key, component_id) except CustomException as exc: raise HTTPException(status_code=400, detail=str(exc)) from exc except Exception as exc: @@ -207,10 +166,10 @@ async def get_tags( @router.get("/users/likes", response_model=List[UsersLikesResponse]) async def get_list_of_components_liked_by_user( store_service: StoreService = Depends(get_store_service), - store_api_Key: str = Depends(get_user_store_api_key), + store_api_key: str = Depends(get_user_store_api_key), ): try: - return await store_service.get_user_likes(store_api_Key) + return await store_service.get_user_likes(store_api_key) except CustomException as exc: raise HTTPException(status_code=400, detail=str(exc)) from exc except Exception as exc: @@ -221,11 +180,11 @@ async def get_list_of_components_liked_by_user( async def like_component( component_id: UUID, store_service: StoreService = Depends(get_store_service), - store_api_Key: str = Depends(get_user_store_api_key), + store_api_key: str = Depends(get_user_store_api_key), ): try: - result = await store_service.like_component(store_api_Key, str(component_id)) - likes_count = await store_service.get_component_likes_count(str(component_id), store_api_Key) + result = await store_service.like_component(store_api_key, str(component_id)) + likes_count = await store_service.get_component_likes_count(str(component_id), store_api_key) return UsersLikesResponse(likes_count=likes_count, liked_by_user=result) except CustomException as exc: From 7caa4a6084c39ca6d8b62642d53bbf54429b3821 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 7 Dec 2023 18:21:56 -0300 Subject: [PATCH 3/6] Add check_langflow_version function to validate Langflow version --- src/backend/langflow/api/utils.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/backend/langflow/api/utils.py b/src/backend/langflow/api/utils.py index 9e362fa32..d88d2525f 100644 --- a/src/backend/langflow/api/utils.py +++ b/src/backend/langflow/api/utils.py @@ -1,5 +1,9 @@ from pathlib import Path from typing import TYPE_CHECKING, List +from fastapi import HTTPException +from langflow.services.store.schema import StoreComponentCreate +from langflow.services.store.utils import get_lf_version_from_pypi +import warnings from platformdirs import user_cache_dir @@ -139,3 +143,19 @@ def validate_is_component(flows: List["Flow"]): def get_is_component_from_data(data: dict): """Returns True if the data is a component.""" return data.get("is_component") + + +async def check_langflow_version(component: StoreComponentCreate): + from langflow import __version__ as current_version + + if not component.last_tested_version: + component.last_tested_version = current_version + + langflow_version = get_lf_version_from_pypi() + if langflow_version is None: + raise HTTPException(status_code=500, detail="Unable to verify the latest version of Langflow") + elif langflow_version != component.last_tested_version: + warnings.warn( + f"Your version of Langflow ({component.last_tested_version}) is outdated. " + f"Please update to the latest version ({langflow_version}) and try again." + ) From 3b13c78b5e00606954aad445d808da6bae84fca0 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 7 Dec 2023 18:22:16 -0300 Subject: [PATCH 4/6] Fix variable naming convention in StoreService --- src/backend/langflow/services/store/service.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/backend/langflow/services/store/service.py b/src/backend/langflow/services/store/service.py index 52ee1c861..b25599297 100644 --- a/src/backend/langflow/services/store/service.py +++ b/src/backend/langflow/services/store/service.py @@ -179,7 +179,7 @@ class StoreService(Service): is_component: Optional[bool] = None, filter_by_user: Optional[bool] = False, liked: Optional[bool] = False, - store_api_Key: Optional[str] = None, + store_api_key: Optional[str] = None, ): filter_conditions = [] @@ -197,18 +197,18 @@ class StoreService(Service): filter_conditions.append({"id": {"_eq": component_id}}) if is_component is not None: filter_conditions.append({"is_component": {"_eq": is_component}}) - if liked and store_api_Key: + if liked and store_api_key: liked_filter = self.build_liked_filter() filter_conditions.append(liked_filter) - elif liked and not store_api_Key: + elif liked and not store_api_key: raise APIKeyError("You must provide an API key to filter by likes") - if filter_by_user and store_api_Key: + if filter_by_user and store_api_key: user_data = user_data_var.get() if not user_data: raise ValueError("No user data") filter_conditions.append({"user_created": {"_eq": user_data["id"]}}) - elif filter_by_user and not store_api_Key: + elif filter_by_user and not store_api_key: raise APIKeyError("You must provide an API key to filter your components") else: filter_conditions.append({"private": {"_eq": False}}) @@ -477,7 +477,7 @@ class StoreService(Service): is_component=is_component, filter_by_user=filter_by_user, liked=liked, - store_api_Key=store_api_key, + store_api_key=store_api_key, ) result: List[ListComponentResponse] = [] From 07d678042cb9dda7d5e480d836d171709bea871c Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 7 Dec 2023 18:22:36 -0300 Subject: [PATCH 5/6] Fix variable naming in update_components_with_user_data function --- src/backend/langflow/services/store/utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/langflow/services/store/utils.py b/src/backend/langflow/services/store/utils.py index 3ce4434f1..9d8beb632 100644 --- a/src/backend/langflow/services/store/utils.py +++ b/src/backend/langflow/services/store/utils.py @@ -17,7 +17,7 @@ def process_tags_for_post(component_dict): async def update_components_with_user_data( components: List["ListComponentResponse"], store_service: "StoreService", - store_api_Key: str, + store_api_key: str, liked: bool, ): """ @@ -31,7 +31,7 @@ async def update_components_with_user_data( else: liked_by_user_ids = await store_service.get_liked_by_user_components( component_ids=component_ids, - api_key=store_api_Key, + api_key=store_api_key, ) # Now we need to set the liked_by_user attribute for component in components: From f45dfda656633240dd4b6bc032089d907e66efcb Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 7 Dec 2023 18:28:08 -0300 Subject: [PATCH 6/6] Refactor store service imports