diff --git a/src/backend/langflow/api/v1/store.py b/src/backend/langflow/api/v1/store.py index b5c8d2ea1..5a1893629 100644 --- a/src/backend/langflow/api/v1/store.py +++ b/src/backend/langflow/api/v1/store.py @@ -75,7 +75,7 @@ def list_components( page: int = 1, limit: int = 10, store_service: StoreService = Depends(get_store_service), - store_api_Key: str = Depends(get_optional_user_store_api_key), + store_api_Key: Optional[str] = Depends(get_optional_user_store_api_key), ): try: result = store_service.query_components( @@ -85,6 +85,19 @@ def list_components( filter_by_user=filter_by_user, ) + if not store_api_Key: + return result + + # Now, from the result, we need to get the components + # the user likes and set the liked_by_user to True + liked_by_user_ids = store_service.get_liked_by_user_components( + component_ids=[str(component.id) for component in result], + api_key=store_api_Key, + ) + # Now we need to set the liked_by_user attribute + for component in result: + component.liked_by_user = str(component.id) in liked_by_user_ids + return result except Exception as exc: raise HTTPException(status_code=400, detail=str(exc)) diff --git a/src/backend/langflow/services/store/schema.py b/src/backend/langflow/services/store/schema.py index 7614b9609..54c6ff91c 100644 --- a/src/backend/langflow/services/store/schema.py +++ b/src/backend/langflow/services/store/schema.py @@ -42,6 +42,7 @@ class ListComponentResponse(BaseModel): name: Optional[str] description: Optional[str] liked_by_count: Optional[int] + liked_by_user: Optional[bool] is_component: Optional[bool] metadata: Optional[dict] user_created: Optional[dict] diff --git a/src/backend/langflow/services/store/service.py b/src/backend/langflow/services/store/service.py index 92dcc0fc1..df559fe82 100644 --- a/src/backend/langflow/services/store/service.py +++ b/src/backend/langflow/services/store/service.py @@ -1,6 +1,7 @@ from datetime import datetime import json from uuid import UUID +from fastapi import params from langflow.services.base import Service from typing import TYPE_CHECKING, List, Dict, Any, Optional, Union import httpx @@ -169,6 +170,7 @@ class StoreService(Service): # Only public components or the ones created by the user # check for "public" or "Public" + if filter_by_user and not api_key: raise ValueError("No API key provided") @@ -190,6 +192,29 @@ class StoreService(Service): # component.tags = [tags_id.tags_id for tags_id in component.tags] return results_objects + def get_liked_by_user_components( + self, component_ids: List[UUID], api_key: str + ) -> List[UUID]: + # Get fields id + # filter should be "id is in component_ids AND liked_by directus_users_id token is api_key" + # return the ids + user_data = self._get( + f"{self.base_url}/users/me", api_key, params={"fields": "id"} + ) + params = { + "fields": "id", + "filter": json.dumps( + { + "_and": [ + {"id": {"_in": component_ids}}, + {"liked_by": {"directus_users_id": {"_eq": user_data["id"]}}}, + ] + } + ), + } + results = self._get(self.components_url, api_key, params) + return [result["id"] for result in results] + def download(self, api_key: str, component_id: str) -> DownloadComponentResponse: url = f"{self.components_url}/{component_id}" params = {