From f9756de693a93e918c037d757afddb7defc847e4 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 15 Mar 2026 17:35:06 -0500 Subject: [PATCH] refac --- backend/open_webui/models/files.py | 33 +++++++++++++++++++++++++---- backend/open_webui/routers/files.py | 25 +++++++++++++++------- 2 files changed, 46 insertions(+), 12 deletions(-) diff --git a/backend/open_webui/models/files.py b/backend/open_webui/models/files.py index 84dd43f5e..d1200e4f4 100644 --- a/backend/open_webui/models/files.py +++ b/backend/open_webui/models/files.py @@ -103,6 +103,11 @@ class FileMetadataResponse(BaseModel): updated_at: int # timestamp in epoch +class FileListResponse(BaseModel): + items: list[FileModelResponse] + total: int + + class FileForm(BaseModel): id: str hash: Optional[str] = None @@ -118,10 +123,6 @@ class FileUpdateForm(BaseModel): meta: Optional[dict] = None -class FileListResponse(BaseModel): - items: list[FileModel] - total: int - class FilesTable: def insert_new_file( @@ -255,6 +256,30 @@ class FilesTable: for file in db.query(File).filter_by(user_id=user_id).all() ] + def get_file_list( + self, + user_id: Optional[str] = None, + skip: int = 0, + limit: int = 50, + db: Optional[Session] = None, + ) -> "FileListResponse": + with get_db_context(db) as db: + query = db.query(File) + if user_id: + query = query.filter_by(user_id=user_id) + + total = query.count() + + items = [ + FileModel.model_validate(file) + for file in query.order_by(File.updated_at.desc(), File.id.desc()) + .offset(skip) + .limit(limit) + .all() + ] + + return FileListResponse(items=items, total=total) + @staticmethod def _glob_to_like_pattern(glob: str) -> str: """ diff --git a/backend/open_webui/routers/files.py b/backend/open_webui/routers/files.py index 5268ea657..0ec16b6f5 100644 --- a/backend/open_webui/routers/files.py +++ b/backend/open_webui/routers/files.py @@ -31,6 +31,7 @@ from open_webui.models.channels import Channels from open_webui.models.users import Users from open_webui.models.files import ( FileForm, + FileListResponse, FileModel, FileModelResponse, Files, @@ -326,23 +327,31 @@ def upload_file_handler( ############################ -@router.get("/", response_model=list[FileModelResponse]) +PAGE_SIZE = 50 + + +@router.get("/", response_model=FileListResponse) async def list_files( user=Depends(get_verified_user), + page: int = Query(1, ge=1, description="Page number (1-indexed)"), content: bool = Query(True), db: Session = Depends(get_session), ): - if user.role == "admin" and BYPASS_ADMIN_ACCESS_CONTROL: - files = Files.get_files(db=db) - else: - files = Files.get_files_by_user_id(user.id, db=db) + skip = (page - 1) * PAGE_SIZE + user_id = ( + None if (user.role == "admin" and BYPASS_ADMIN_ACCESS_CONTROL) else user.id + ) + + result = Files.get_file_list( + user_id=user_id, skip=skip, limit=PAGE_SIZE, db=db + ) if not content: - for file in files: - if "content" in file.data: + for file in result.items: + if file.data and "content" in file.data: del file.data["content"] - return files + return result ############################