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: