diff --git a/README.md b/README.md index 00b71bb..038ebb1 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ ___ - 🔥 Установка приоритетов и дедлайнов - 🔔 Напоминания и уведомления - ⚙️ Асинхронная обработка задач +- 📄 Пагинация и фильтрация задач с поддержкой limit/offset - 💡 Современный и интуитивно понятный интерфейс --- diff --git a/docs/api.md b/docs/api.md index ea20a91..cef85cc 100644 --- a/docs/api.md +++ b/docs/api.md @@ -9,6 +9,10 @@ ___ - `GET /users` — Получить список всех пользователей - `GET /users/{user_id}` — Получить конкретного пользователя - `GET /users/{user_id}/tasks` — Получить задачи пользователя + - **Query параметры:** + - `limit` (int, опционально) — Максимальное количество задач для возврата + - `offset` (int, опционально, по умолчанию 0) — Количество задач для пропуска + - **Пример:** `GET /users/1/tasks?limit=10&offset=20` - `POST /users` — Создать нового пользователя - `PUT /users/{user_id}` — Обновить данные пользователя - `PATCH /users/{user_id}` — Частично обновить данные пользователя diff --git a/src/repository/users.py b/src/repository/users.py index 46e669e..7d13789 100644 --- a/src/repository/users.py +++ b/src/repository/users.py @@ -1,3 +1,5 @@ +from typing import Optional + from sqlalchemy import select, update from sqlalchemy.orm import selectinload @@ -20,16 +22,34 @@ class UsersRepo(BaseRepo): model = result.scalar_one() return model - async def get_one_with_load(self, user_id: int) -> UsersORM | None: - quary = ( + async def get_one_with_load( + self, + user_id: int, + tasks_limit: Optional[int] = None, + tasks_offset: int = 0 + ) -> UsersORM | None: + tasks_subquery = ( + select(TasksORM.id) + .where(TasksORM.user_id == user_id) + ) + + if tasks_limit is not None: + tasks_subquery = tasks_subquery.limit(tasks_limit) + if tasks_offset > 0: + tasks_subquery = tasks_subquery.offset(tasks_offset) + + query = ( select(self.model) .where(self.model.id == user_id) .options( - selectinload(self.model.tasks).load_only( + selectinload( + self.model.tasks.and_(TasksORM.id.in_(tasks_subquery)) + ).load_only( TasksORM.id, TasksORM.title, TasksORM.due_date, TasksORM.priority ) ) + ) - result = await self.session.execute(quary) + result = await self.session.execute(query) obj = result.scalar_one_or_none() return obj