From ce18eca340e51111cae3612b1b8e07e916c06850 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 8 Oct 2026 19:36:27 +0400 Subject: [PATCH] refac --- backend/open_webui/models/folders.py | 3 ++- backend/open_webui/routers/folders.py | 9 ++++----- src/lib/components/layout/Sidebar.svelte | 5 ++++- src/lib/components/layout/Sidebar/RecursiveFolder.svelte | 4 +++- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/backend/open_webui/models/folders.py b/backend/open_webui/models/folders.py index 1db732ed7e..2349cfb491 100644 --- a/backend/open_webui/models/folders.py +++ b/backend/open_webui/models/folders.py @@ -166,13 +166,14 @@ class FolderTable: self, user_id: str, user_group_ids: set[str], db: Optional[AsyncSession] = None ) -> dict[str, str]: """ - Returns {folder_id: highest_permission} for all folders shared with user. + Returns {folder_id: highest_permission} for folders shared with or by user. Checks direct user grants, group grants, and public (user:*) grants. """ from open_webui.models.access_grants import AccessGrant async with get_async_db_context(db) as db: conditions = [ + AccessGrant.resource_id.in_(select(Folder.id).where(Folder.user_id == user_id)), and_(AccessGrant.principal_type == 'user', AccessGrant.principal_id == '*'), and_(AccessGrant.principal_type == 'user', AccessGrant.principal_id == user_id), ] diff --git a/backend/open_webui/routers/folders.py b/backend/open_webui/routers/folders.py index 889b6ef097..3370f3e939 100644 --- a/backend/open_webui/routers/folders.py +++ b/backend/open_webui/routers/folders.py @@ -245,15 +245,14 @@ async def get_shared_folders( user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session), ): - """Get all folders shared with the current user (not owned by them).""" + """Get folders shared with or by the current user.""" await check_folders_permission(request, user, db=db) groups = await Groups.get_groups_by_member_id(user.id, db=db, include_inherited=True) group_ids = {g.id for g in groups} folder_perms = await Folders.get_shared_folder_ids_for_user(user.id, group_ids, db=db) - folders = await Folders.get_folders_by_ids(list(folder_perms.keys()), db=db) - shared_folders = [folder for folder in folders if folder.user_id != user.id] + shared_folders = await Folders.get_folders_by_ids(list(folder_perms.keys()), db=db) owners = await Users.get_users_by_user_ids([folder.user_id for folder in shared_folders], db=db) owner_names = {owner.id: owner.name for owner in owners} @@ -262,7 +261,7 @@ async def get_shared_folders( { **folder.model_dump(), 'owner_name': owner_names.get(folder.user_id, 'Unknown'), - 'permission': folder_perms[folder.id], + 'permission': 'write' if folder.user_id == user.id else folder_perms[folder.id], } for folder in shared_folders ] @@ -278,7 +277,7 @@ async def get_shared_folders( { **child.model_dump(), 'owner_name': owner_names.get(child.user_id, 'Unknown'), - 'permission': folder_perms[folder.id], + 'permission': 'write' if child.user_id == user.id else folder_perms[folder.id], } ) diff --git a/src/lib/components/layout/Sidebar.svelte b/src/lib/components/layout/Sidebar.svelte index 9ad9cc97f9..e17692bff3 100644 --- a/src/lib/components/layout/Sidebar.svelte +++ b/src/lib/components/layout/Sidebar.svelte @@ -290,7 +290,10 @@ // Merge shared folders into the same structure for (const sf of sharedFolders) { - if (folderMap[sf.id]) continue; // Already owned by user + if (folderMap[sf.id]) { + folderMap[sf.id].showOwnerInfo = true; + continue; + } folderMap[sf.id] = { ...sf, shared: true }; } diff --git a/src/lib/components/layout/Sidebar/RecursiveFolder.svelte b/src/lib/components/layout/Sidebar/RecursiveFolder.svelte index fcb32f4dc2..6e4007f263 100644 --- a/src/lib/components/layout/Sidebar/RecursiveFolder.svelte +++ b/src/lib/components/layout/Sidebar/RecursiveFolder.svelte @@ -959,7 +959,9 @@ lastReadAt={chat.last_read_at} active={chat.active ?? false} ownerName={chat.owner_name ?? null} - ownerUserId={folders[folderId]?.shared || chat.user_id !== $user?.id + ownerUserId={folders[folderId]?.showOwnerInfo || + folders[folderId]?.shared || + chat.user_id !== $user?.id ? chat.user_id : null} readonly={chat.user_id !== $user?.id}