Files
ipam_control/docs/changes/013-pagination-bounds/PLAN.md
T

24 lines
2.0 KiB
Markdown
Raw Normal View History

# Границы пагинации: отрицательные 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 не затронут (передаёт корректные значения) — пройти основные экраны.