diff --git a/.env.example b/.env.example index 91a8e9eb6..45a724601 100644 --- a/.env.example +++ b/.env.example @@ -73,5 +73,13 @@ LANGFLOW_SUPERUSER= LANGFLOW_SUPERUSER_PASSWORD= # STORE_URL -# Example: LANGFLOW_STORE_URL=https://langflow.store -LANGFLOW_STORE_URL= \ No newline at end of file +# Example: LANGFLOW_STORE_URL=https://api.langflow.store +LANGFLOW_STORE_URL= + +# DOWNLOAD_WEBHOOK_URL +# +LANGFLOW_DOWNLOAD_WEBHOOK_URL= + +# LIKE_WEBHOOK_URL +# +LANGFLOW_LIKE_WEBHOOK_URL= \ No newline at end of file diff --git a/src/backend/langflow/api/v1/store.py b/src/backend/langflow/api/v1/store.py index 47f377058..8bed196ae 100644 --- a/src/backend/langflow/api/v1/store.py +++ b/src/backend/langflow/api/v1/store.py @@ -189,3 +189,15 @@ def get_list_of_components_liked_by_user( return store_service.get_user_likes(store_api_Key) except Exception as exc: raise HTTPException(status_code=500, detail=str(exc)) + + +@router.post("/users/likes/{component_id}", response_model=UsersLikesResponse) +def like_component( + component_id: UUID, + store_service: StoreService = Depends(get_store_service), + store_api_Key: str = Depends(get_user_store_api_key), +): + try: + return store_service.like_component(store_api_Key, component_id) + except Exception as exc: + raise HTTPException(status_code=500, detail=str(exc)) diff --git a/src/backend/langflow/services/settings/base.py b/src/backend/langflow/services/settings/base.py index 294f5881a..13688e889 100644 --- a/src/backend/langflow/services/settings/base.py +++ b/src/backend/langflow/services/settings/base.py @@ -55,6 +55,7 @@ class Settings(BaseSettings): STORE: Optional[bool] = True STORE_URL: Optional[str] = None DOWNLOAD_WEBHOOK_URL: Optional[str] = None + LIKE_WEBHOOK_URL: Optional[str] = None @validator("CONFIG_DIR", pre=True, allow_reuse=True) def set_langflow_dir(cls, value): diff --git a/src/backend/langflow/services/store/service.py b/src/backend/langflow/services/store/service.py index ab7cdd86f..85fe27e03 100644 --- a/src/backend/langflow/services/store/service.py +++ b/src/backend/langflow/services/store/service.py @@ -27,7 +27,8 @@ class StoreService(Service): def __init__(self, settings_service: "SettingsService"): self.settings_service = settings_service self.base_url = self.settings_service.settings.STORE_URL - self.webhook_url = self.settings_service.settings.DOWNLOAD_WEBHOOK_URL + self.download_webhook_url = self.settings_service.settings.DOWNLOAD_WEBHOOK_URL + self.like_webhook_url = self.settings_service.settings.LIKE_WEBHOOK_URL self.components_url = f"{self.base_url}/items/components" def _get( @@ -200,7 +201,7 @@ class StoreService(Service): } component = self._get(url, api_key, params) - self.call_webhook(api_key, self.webhook_url, component_id) + self.call_webhook(api_key, self.download_webhook_url, component_id) return DownloadComponentResponse(**component) @@ -243,3 +244,21 @@ class StoreService(Service): } likes = self._get(url, api_key, params) return likes + + def like_component(self, api_key: str, component_id: str) -> bool: + # if it returns a list with one id, it means the like was successful + # if it returns an int, it means the like was removed + headers = {"Authorization": f"Bearer {api_key}"} + response = httpx.post( + self.like_webhook_url, json={"component_id": component_id}, headers=headers + ) + + if response.status_code == 200: + result = response.json() + + if isinstance(result, list): + return True + elif isinstance(result, int): + return False + else: + raise ValueError(f"Unexpected result: {result}")