From ee0c11b4a6699e60972cb2b60a270f69332a1977 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Mon, 23 Oct 2023 17:14:09 -0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20fix(store.py):=20add=20missing?= =?UTF-8?q?=20import=20for=20FlowCreate=20and=20FlowRead=20models=20?= =?UTF-8?q?=E2=9C=A8=20feat(store.py):=20add=20support=20for=20fetching=20?= =?UTF-8?q?specific=20fields=20when=20listing=20components=20=E2=9C=A8=20f?= =?UTF-8?q?eat(store.py):=20add=20support=20for=20forking=20components=20f?= =?UTF-8?q?rom=20the=20store=20=E2=9C=A8=20feat(store.py):=20add=20support?= =?UTF-8?q?=20for=20searching=20components=20with=20various=20filters=20an?= =?UTF-8?q?d=20sorting=20options=20=F0=9F=90=9B=20fix(schema.py):=20add=20?= =?UTF-8?q?missing=20parent=20field=20to=20ComponentResponse=20and=20Store?= =?UTF-8?q?ComponentCreate=20models?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/api/v1/store.py | 62 +++++++++++++++++-- src/backend/langflow/services/store/schema.py | 2 + 2 files changed, 60 insertions(+), 4 deletions(-) diff --git a/src/backend/langflow/api/v1/store.py b/src/backend/langflow/api/v1/store.py index 35938f1fc..55b53f88f 100644 --- a/src/backend/langflow/api/v1/store.py +++ b/src/backend/langflow/api/v1/store.py @@ -1,8 +1,10 @@ from typing import List, Optional from uuid import UUID from langflow.services.auth import utils as auth_utils +from langflow.services.database.models.flow.flow import FlowCreate, FlowRead from langflow.services.database.models.user.user import User from langflow.services.deps import ( + get_session, get_store_service, get_settings_service, ) @@ -54,11 +56,12 @@ def list_components( settings_service=Depends(get_settings_service), ): try: + fields = ["id", "name", "description", "user_created"] if store_api_Key: decrypted = auth_utils.decrypt_api_key(store_api_Key, settings_service) else: decrypted = None - result = store_service.list_components(decrypted, page, limit) + result = store_service.list_components(decrypted, page, limit, fields=fields) return result except Exception as exc: raise HTTPException(status_code=400, detail=str(exc)) @@ -70,6 +73,30 @@ def read_component( store_service: StoreService = Depends(get_store_service), store_api_Key: str = Depends(get_user_store_api_key), settings_service=Depends(get_settings_service), + session=Depends(get_session), +): + # If the component is from the store, we need to get it from the store + + try: + decrypted = auth_utils.decrypt_api_key(store_api_Key, settings_service) + component = store_service.get(decrypted, component_id) + except Exception as exc: + raise HTTPException(status_code=400, detail=str(exc)) from exc + + if component is None: + raise HTTPException(status_code=400, detail="Component not found") + + return component + + +@router.post("/components/{component_id}/fork", response_model=FlowRead) +def fork_component( + component_id: UUID, + store_service: StoreService = Depends(get_store_service), + store_api_Key: str = Depends(get_user_store_api_key), + settings_service=Depends(get_settings_service), + user: User = Depends(auth_utils.get_current_active_user), + session=Depends(get_session), ): # If the component is from the store, we need to get it from the store try: @@ -80,7 +107,36 @@ def read_component( if component is None: raise HTTPException(status_code=400, detail="Component not found") - return component + + # Now we need to get the component id and put it in StoreComponentCreate.parent + parent_id = component.id + new_component = StoreComponentCreate( + name=component.name, + data=component.data, + parent=parent_id, + description=component.description, + tags=component.tags, + ) + + try: + created_component = store_service.upload(decrypted, new_component.dict()) + except Exception as exc: + raise HTTPException(status_code=500, detail=str(exc)) from exc + + if created_component is None: + raise HTTPException(status_code=500, detail="Component not created") + + # Now save it locally + db_component = FlowCreate( + name=created_component.name, + data=created_component.data, + description=created_component.description, + user_id=user.id, + ) + session.add(db_component) + session.commit() + session.refresh(db_component) + return db_component @router.get("/search", response_model=List[ComponentResponse]) @@ -92,7 +148,6 @@ async def search_endpoint( tags: Optional[List[str]] = Query(None), date_from: Optional[datetime] = Query(None), date_to: Optional[datetime] = Query(None), - sort_by: Optional[str] = Query("likes"), sort: Optional[List[str]] = Query(None), fields: Optional[List[str]] = Query(None), store_service: "StoreService" = Depends(get_store_service), @@ -108,7 +163,6 @@ async def search_endpoint( tags=tags, date_from=date_from, date_to=date_to, - sort_by=sort_by, sort=sort, fields=fields, ) diff --git a/src/backend/langflow/services/store/schema.py b/src/backend/langflow/services/store/schema.py index e18162f40..74f8d10be 100644 --- a/src/backend/langflow/services/store/schema.py +++ b/src/backend/langflow/services/store/schema.py @@ -18,6 +18,7 @@ class ComponentResponse(BaseModel): data: Optional[dict] tags: Optional[List[int]] likes_count: Optional[List[UUID]] + parent: Optional[UUID] class StoreComponentCreate(BaseModel): @@ -25,3 +26,4 @@ class StoreComponentCreate(BaseModel): description: Optional[str] data: dict tags: Optional[List[str]] + parent: Optional[UUID]