From a02b9b101014d68146e0620d971ea4ef3462a04b Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 14 Aug 2025 17:27:32 +0400 Subject: [PATCH] wip: folders --- backend/open_webui/models/folders.py | 9 ++++--- backend/open_webui/routers/chats.py | 2 +- backend/open_webui/routers/folders.py | 34 ++++++++++++++------------- 3 files changed, 25 insertions(+), 20 deletions(-) diff --git a/backend/open_webui/models/folders.py b/backend/open_webui/models/folders.py index 918342fd59..0d82826f89 100644 --- a/backend/open_webui/models/folders.py +++ b/backend/open_webui/models/folders.py @@ -7,7 +7,10 @@ import re from pydantic import BaseModel, ConfigDict from sqlalchemy import BigInteger, Column, Text, JSON, Boolean, func +from sqlalchemy import select + +from backend.open_webui.internal import db from open_webui.internal.db import Base, get_db from open_webui.env import SRC_LOG_LEVELS @@ -244,9 +247,9 @@ class FolderTable: ) -> Optional[FolderModel]: try: async with get_db() as db: - folder = ( - await db.query(Folder).filter_by(id=id, user_id=user_id).first() - ) + stmt = select(Folder).where(Folder.id == id, Folder.user_id == user_id) + result = await db.execute(stmt) + folder = result.scalars().first() if not folder: return None diff --git a/backend/open_webui/routers/chats.py b/backend/open_webui/routers/chats.py index 0751951949..61eff9e9f2 100644 --- a/backend/open_webui/routers/chats.py +++ b/backend/open_webui/routers/chats.py @@ -203,7 +203,7 @@ async def search_user_chats( @router.get("/folder/{folder_id}", response_model=list[ChatResponse]) async def get_chats_by_folder_id(folder_id: str, user=Depends(get_verified_user)): folder_ids = [folder_id] - children_folders = Folders.get_children_folders_by_id_and_user_id( + children_folders = await Folders.get_children_folders_by_id_and_user_id( folder_id, user.id ) if children_folders: diff --git a/backend/open_webui/routers/folders.py b/backend/open_webui/routers/folders.py index e245c7f477..cde76d4a80 100644 --- a/backend/open_webui/routers/folders.py +++ b/backend/open_webui/routers/folders.py @@ -42,7 +42,7 @@ router = APIRouter() @router.get("/", response_model=list[FolderModel]) async def get_folders(user=Depends(get_verified_user)): - folders = Folders.get_folders_by_user_id(user.id) + folders = await Folders.get_folders_by_user_id(user.id) return [ { @@ -66,8 +66,8 @@ async def get_folders(user=Depends(get_verified_user)): @router.post("/") -def create_folder(form_data: FolderForm, user=Depends(get_verified_user)): - folder = Folders.get_folder_by_parent_id_and_user_id_and_name( +async def create_folder(form_data: FolderForm, user=Depends(get_verified_user)): + folder = await Folders.get_folder_by_parent_id_and_user_id_and_name( None, user.id, form_data.name ) @@ -78,7 +78,7 @@ def create_folder(form_data: FolderForm, user=Depends(get_verified_user)): ) try: - folder = Folders.insert_new_folder(user.id, form_data) + folder = await Folders.insert_new_folder(user.id, form_data) return folder except Exception as e: log.exception(e) @@ -96,7 +96,7 @@ def create_folder(form_data: FolderForm, user=Depends(get_verified_user)): @router.get("/{id}", response_model=Optional[FolderModel]) async def get_folder_by_id(id: str, user=Depends(get_verified_user)): - folder = Folders.get_folder_by_id_and_user_id(id, user.id) + folder = await Folders.get_folder_by_id_and_user_id(id, user.id) if folder: return folder else: @@ -115,9 +115,9 @@ async def get_folder_by_id(id: str, user=Depends(get_verified_user)): async def update_folder_name_by_id( id: str, form_data: FolderForm, user=Depends(get_verified_user) ): - folder = Folders.get_folder_by_id_and_user_id(id, user.id) + folder = await Folders.get_folder_by_id_and_user_id(id, user.id) if folder: - existing_folder = Folders.get_folder_by_parent_id_and_user_id_and_name( + existing_folder = await Folders.get_folder_by_parent_id_and_user_id_and_name( folder.parent_id, user.id, form_data.name ) if existing_folder and existing_folder.id != id: @@ -127,7 +127,9 @@ async def update_folder_name_by_id( ) try: - folder = Folders.update_folder_by_id_and_user_id(id, user.id, form_data) + folder = await Folders.update_folder_by_id_and_user_id( + id, user.id, form_data + ) return folder except Exception as e: @@ -157,9 +159,9 @@ class FolderParentIdForm(BaseModel): async def update_folder_parent_id_by_id( id: str, form_data: FolderParentIdForm, user=Depends(get_verified_user) ): - folder = Folders.get_folder_by_id_and_user_id(id, user.id) + folder = await Folders.get_folder_by_id_and_user_id(id, user.id) if folder: - existing_folder = Folders.get_folder_by_parent_id_and_user_id_and_name( + existing_folder = await Folders.get_folder_by_parent_id_and_user_id_and_name( form_data.parent_id, user.id, folder.name ) @@ -170,7 +172,7 @@ async def update_folder_parent_id_by_id( ) try: - folder = Folders.update_folder_parent_id_by_id_and_user_id( + folder = await Folders.update_folder_parent_id_by_id_and_user_id( id, user.id, form_data.parent_id ) return folder @@ -201,10 +203,10 @@ class FolderIsExpandedForm(BaseModel): async def update_folder_is_expanded_by_id( id: str, form_data: FolderIsExpandedForm, user=Depends(get_verified_user) ): - folder = Folders.get_folder_by_id_and_user_id(id, user.id) + folder = await Folders.get_folder_by_id_and_user_id(id, user.id) if folder: try: - folder = Folders.update_folder_is_expanded_by_id_and_user_id( + folder = await Folders.update_folder_is_expanded_by_id_and_user_id( id, user.id, form_data.is_expanded ) return folder @@ -231,7 +233,7 @@ async def update_folder_is_expanded_by_id( async def delete_folder_by_id( request: Request, id: str, user=Depends(get_verified_user) ): - chat_delete_permission = has_permission( + chat_delete_permission = await has_permission( user.id, "chat.delete", request.app.state.config.USER_PERMISSIONS ) @@ -241,10 +243,10 @@ async def delete_folder_by_id( detail=ERROR_MESSAGES.ACCESS_PROHIBITED, ) - folder = Folders.get_folder_by_id_and_user_id(id, user.id) + folder = await Folders.get_folder_by_id_and_user_id(id, user.id) if folder: try: - folder_ids = Folders.delete_folder_by_id_and_user_id(id, user.id) + folder_ids = await Folders.delete_folder_by_id_and_user_id(id, user.id) for folder_id in folder_ids: await Chats.delete_chats_by_user_id_and_folder_id(user.id, folder_id)