From e64d0fcf03bb3f45b0a3e233acd27aaf079f4e85 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 31 Oct 2023 19:58:10 -0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A7=20fix(store.py):=20set=20liked=5Fb?= =?UTF-8?q?y=5Fuser=20flag=20to=20True=20for=20components=20liked=20by=20t?= =?UTF-8?q?he=20user=20=F0=9F=94=A7=20fix(schema.py):=20add=20liked=5Fby?= =?UTF-8?q?=5Fuser=20field=20to=20ListComponentResponse=20schema=20?= =?UTF-8?q?=F0=9F=94=A7=20fix(service.py):=20add=20get=5Fliked=5Fby=5Fuser?= =?UTF-8?q?=5Fcomponents=20method=20to=20StoreService=20to=20retrieve=20li?= =?UTF-8?q?ked=20components=20by=20user?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/api/v1/store.py | 10 ++++++++ src/backend/langflow/services/store/schema.py | 1 + .../langflow/services/store/service.py | 25 +++++++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/src/backend/langflow/api/v1/store.py b/src/backend/langflow/api/v1/store.py index b5c8d2ea1..bbdde22e2 100644 --- a/src/backend/langflow/api/v1/store.py +++ b/src/backend/langflow/api/v1/store.py @@ -84,6 +84,16 @@ def list_components( limit=limit, filter_by_user=filter_by_user, ) + # 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 to True + for component in result: + if str(component.id) in liked_by_user_ids: + component.liked_by_user = True return result except Exception as exc: diff --git a/src/backend/langflow/services/store/schema.py b/src/backend/langflow/services/store/schema.py index 7614b9609..71e61b2da 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] = False 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 = {