diff --git a/backend/open_webui/models/feedbacks.py b/backend/open_webui/models/feedbacks.py index 00bb6f1588..d288980501 100644 --- a/backend/open_webui/models/feedbacks.py +++ b/backend/open_webui/models/feedbacks.py @@ -380,10 +380,39 @@ class FeedbackTable: result = await db.execute(select(Feedback).filter_by(type=type).order_by(Feedback.updated_at.desc())) return [FeedbackModel.model_validate(feedback) for feedback in result.scalars().all()] - async def get_feedbacks_by_user_id(self, user_id: str, db: Optional[AsyncSession] = None) -> list[FeedbackModel]: + async def get_feedbacks_by_user_id( + self, + user_id: str, + skip: int = 0, + limit: int = 30, + db: Optional[AsyncSession] = None, + ) -> FeedbackListResponse: async with get_async_db_context(db) as db: - result = await db.execute(select(Feedback).filter_by(user_id=user_id).order_by(Feedback.updated_at.desc())) - return [FeedbackModel.model_validate(feedback) for feedback in result.scalars().all()] + stmt = ( + select(Feedback, User) + .join(User, Feedback.user_id == User.id) + .filter(Feedback.user_id == user_id) + .order_by(Feedback.updated_at.desc()) + ) + + count_result = await db.execute(select(func.count()).select_from(stmt.subquery())) + total = count_result.scalar() + + if skip: + stmt = stmt.offset(skip) + if limit: + stmt = stmt.limit(limit) + + result = await db.execute(stmt) + items = result.all() + + feedbacks = [] + for feedback, user in items: + feedback_model = FeedbackModel.model_validate(feedback) + user_model = UserResponse.model_validate(user) + feedbacks.append(FeedbackUserResponse(**feedback_model.model_dump(), user=user_model)) + + return FeedbackListResponse(items=feedbacks, total=total) async def update_feedback_by_id( self, id: str, form_data: FeedbackForm, db: Optional[AsyncSession] = None diff --git a/backend/open_webui/routers/evaluations.py b/backend/open_webui/routers/evaluations.py index eb79bfa63c..d1c914f4ee 100644 --- a/backend/open_webui/routers/evaluations.py +++ b/backend/open_webui/routers/evaluations.py @@ -11,7 +11,6 @@ from open_webui.models.feedbacks import ( FeedbackListResponse, FeedbackModel, Feedbacks, - FeedbackUserResponse, LeaderboardFeedbackData, ModelHistoryEntry, ModelHistoryResponse, @@ -317,10 +316,19 @@ async def export_all_feedbacks( return feedbacks -@router.get('/feedbacks/user', response_model=list[FeedbackUserResponse]) -async def get_feedbacks(user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session)): - feedbacks = await Feedbacks.get_feedbacks_by_user_id(user.id, db=db) - return feedbacks +PAGE_ITEM_COUNT = 30 + + +@router.get('/feedbacks/user', response_model=FeedbackListResponse) +async def get_user_feedbacks( + page: Optional[int] = 1, + user=Depends(get_verified_user), + db: AsyncSession = Depends(get_async_session), +): + limit = PAGE_ITEM_COUNT + page = max(1, page) + skip = (page - 1) * limit + return await Feedbacks.get_feedbacks_by_user_id(user.id, skip=skip, limit=limit, db=db) @router.delete('/feedbacks', response_model=bool) @@ -329,9 +337,6 @@ async def delete_feedbacks(user=Depends(get_verified_user), db: AsyncSession = D return success -PAGE_ITEM_COUNT = 30 - - @router.get('/feedbacks/list', response_model=FeedbackListResponse) async def get_feedbacks( order_by: Optional[str] = None,