24 lines
2.0 KiB
Markdown
24 lines
2.0 KiB
Markdown
# Границы пагинации: отрицательные limit/offset дают 500 (изменение 013)
|
||||
|
|
|
|||
|
|
Находка ревью № 3, серьёзность — средняя.
|
|||
|
|
|
|||
|
|
## Context
|
|||
|
|
Во всех списках `limit: int = Query(…, le=…)` и `offset: int = 0` без нижней границы. `GET /audit?limit=-1` и `GET /isps?offset=-1` отвечают 500
|
|||
|
|
(PostgreSQL отвергает отрицательные LIMIT/OFFSET). Ожидаемо — 422 с указанием поля.
|
|||
|
|
|
|||
|
|
## Решение
|
|||
|
|
1. `app/api/v1/__init__.py` (или `app/services.py`): общая зависимость
|
|||
|
|
`Paging(limit: int = Query(100, ge=1, le=500), offset: int = Query(0, ge=0, le=10_000_000))`, с параметризацией верхнего `limit` там, где он отличается
|
|||
|
|
(`/prefixes` — 1000, `/organizations` — 500).
|
|||
|
|
2. Заменить объявления в `refs.py` (организации, устройства, операторы), `prefixes.py` (префиксы, адреса), `journal.py` (`/audit`), `users.py`.
|
|||
|
|
Формат ответа, значения по умолчанию и верхние пределы остаются прежними — меняется только отказ на недопустимых значениях.
|
|||
|
|
3. Верхний предел `offset` в `list_addresses` — см. № 014 (там он существенен для ресурсоёмкой ветки `status=free`).
|
|||
|
|
|
|||
|
|
## Файлы
|
|||
|
|
`app/api/v1/{refs,prefixes,journal,users}.py`, модуль с зависимостью, `tests/test_api.py`, `README.md` (раздел API: параметры пагинации).
|
|||
|
|
|
|||
|
|
## Тест
|
|||
|
|
Параметризованный: для 3–4 списков `limit=-1`, `limit=0`, `offset=-1` → 422 с полем в `fields`.
|
|||
|
|
|
|||
|
|
## Проверка
|
|||
|
|
`pytest -q`; UI не затронут (передаёт корректные значения) — пройти основные экраны.
|