From c9b77ec9db7e18092d0fa5f649f90a06577af48f Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 25 Oct 2023 21:47:39 -0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A7=20fix(store.py):=20change=20`list?= =?UTF-8?q?=5Fcomponents`=20function=20name=20to=20`query=5Fcomponents`=20?= =?UTF-8?q?for=20better=20semantics=20and=20consistency=20=E2=9C=A8=20feat?= =?UTF-8?q?(store.py):=20add=20`count=5Fcomponents`=20endpoint=20to=20get?= =?UTF-8?q?=20the=20count=20of=20components=20based=20on=20filter=20criter?= =?UTF-8?q?ia=20=F0=9F=94=A7=20fix(service.py):=20modify=20`query=5Fcompon?= =?UTF-8?q?ents`=20function=20to=20return=20a=20list=20of=20dictionaries?= =?UTF-8?q?=20when=20`count`=20parameter=20is=20True?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/api/v1/store.py | 25 +++++++++++++++++-- .../langflow/services/store/service.py | 24 ++++++++++++------ 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/src/backend/langflow/api/v1/store.py b/src/backend/langflow/api/v1/store.py index e63b20aab..e8878a5f5 100644 --- a/src/backend/langflow/api/v1/store.py +++ b/src/backend/langflow/api/v1/store.py @@ -66,14 +66,35 @@ def list_components( ): try: fields = ["id", "name", "description", "user_created.name", "is_component"] - result = store_service.list_components( - store_api_Key, page, limit, fields=fields, filter_by_user=filter_by_user + result = store_service.query_components( + store_api_Key, + page, + limit, + fields=fields, + filter_by_user=filter_by_user, ) return result except Exception as exc: raise HTTPException(status_code=400, detail=str(exc)) +@router.get("/components/count", response_model=dict) +def count_components( + filter_by_user: bool = Query(False), + store_service: StoreService = Depends(get_store_service), + store_api_Key: str = Depends(get_optional_user_store_api_key), +): + try: + result = store_service.query_components( + store_api_Key, + count=True, + filter_by_user=filter_by_user, + ) + return {"count": result[0].get("count", 0)} + except Exception as exc: + raise HTTPException(status_code=400, detail=str(exc)) + + @router.get("/components/{component_id}", response_model=DownloadComponentResponse) def read_component( component_id: UUID, diff --git a/src/backend/langflow/services/store/service.py b/src/backend/langflow/services/store/service.py index 39d31996e..47ecc772a 100644 --- a/src/backend/langflow/services/store/service.py +++ b/src/backend/langflow/services/store/service.py @@ -2,7 +2,7 @@ from datetime import datetime import json from uuid import UUID from langflow.services.base import Service -from typing import TYPE_CHECKING, List, Dict, Any, Optional +from typing import TYPE_CHECKING, List, Dict, Any, Optional, Union import httpx from httpx import HTTPError @@ -119,21 +119,27 @@ class StoreService(Service): results = self._get(self.components_url, api_key, params) return [ComponentResponse(**component) for component in results] - def list_components( + def query_components( self, api_key: str, page: int = 1, limit: int = 15, fields: Optional[List[str]] = None, filter_by_user: bool = False, - ) -> List[ListComponentResponse]: + count: bool = False, + ) -> Union[List[ListComponentResponse], List[Dict[str, int]]]: params = {"page": page, "limit": limit} # ?aggregate[count]=likes - params["fields"] = ( - ",".join(fields) - if fields - else ",".join(["id", "name", "description", "count(likes)", "is_component"]) - ) + if count: + params["aggregate"] = json.dumps({"count": "*"}) + else: + params["fields"] = ( + ",".join(fields) + if fields + else ",".join( + ["id", "name", "description", "count(likes)", "is_component"] + ) + ) # Only public components or the ones created by the user # check for "public" or "Public" @@ -151,6 +157,8 @@ class StoreService(Service): ) results = self._get(self.components_url, api_key, params) + if "count" in results[0]: + return results return [ListComponentResponse(**component) for component in results] def download(self, api_key: str, component_id: str) -> DownloadComponentResponse: