(low) schemas/search.py _validate_geo_pair: нет проверки инвертированных вилок floor/year_built/floors_total (min>max) #1516

Closed
opened 2026-06-15 05:59:05 +00:00 by bot-backend · 0 comments
Collaborator

Severity: low · Категория: api · Файл: tradein-mvp/backend/app/schemas/search.py:63-67

schemas/search.py:63-66 — model_validator проверяет инверсию вилки только для price_rub (стр.63) и area_m2 (стр.65), но НЕ для floor_min/floor_max (поля стр.30-31), year_built_min/year_built_max (стр.34-35), floors_total_min/floors_total_max (стр.37-38). Все эти поля в build_search_query идут парами >=/<= в WHERE (search_query.py:61-66, 68-73, 79-84). При floor_min=10, floor_max=3 запрос проходит валидацию и формирует противоречивый WHERE (floor>=10 AND floor<=3) → молча 0 результатов вместо 422. Контракт непоследователен. Доп.: проверки на стр.63/65 используют truthiness (if self.price_rub_min and ...), поэтому граница 0 не проверяется (для 0 безвредно, но хрупко — лучше is not None). Чинить: добавить аналогичные проверки для трёх недостающих пар, заменить truthiness на is not None.

Почему баг: В model_validator (search.py:63-66) есть только проверки price_rub_min>price_rub_max и area_m2_min>area_m2_max. Для floor/year_built/floors_total аналогичных проверок нет, хотя в build_search_query (search_query.py:61-84) все эти поля идут в WHERE как >=/<= пары. Инвертированная вилка по этажу/году даёт пустую выдачу без сигнала об ошибке ввода. Дополнительно: проверки используют truthiness (if self.price_rub_min and ...), поэтому граница 0 (price_rub_min=0) не проверяется — для 0 безвредно, но логика хрупкая.

Как чинить: Добавить в валидатор симметричные проверки для floor_min/max, year_built_min/max, floors_total_min/max; сравнивать через is not None, а не truthiness.


deep-audit «армия ботов 2» · verify+harden, confidence 0.85 · unit U120

**Severity:** low · **Категория:** api · **Файл:** `tradein-mvp/backend/app/schemas/search.py:63-67` schemas/search.py:63-66 — model_validator проверяет инверсию вилки только для price_rub (стр.63) и area_m2 (стр.65), но НЕ для floor_min/floor_max (поля стр.30-31), year_built_min/year_built_max (стр.34-35), floors_total_min/floors_total_max (стр.37-38). Все эти поля в build_search_query идут парами >=/<= в WHERE (search_query.py:61-66, 68-73, 79-84). При floor_min=10, floor_max=3 запрос проходит валидацию и формирует противоречивый WHERE (floor>=10 AND floor<=3) → молча 0 результатов вместо 422. Контракт непоследователен. Доп.: проверки на стр.63/65 используют truthiness (`if self.price_rub_min and ...`), поэтому граница 0 не проверяется (для 0 безвредно, но хрупко — лучше `is not None`). Чинить: добавить аналогичные проверки для трёх недостающих пар, заменить truthiness на `is not None`. **Почему баг:** В model_validator (search.py:63-66) есть только проверки price_rub_min>price_rub_max и area_m2_min>area_m2_max. Для floor/year_built/floors_total аналогичных проверок нет, хотя в build_search_query (search_query.py:61-84) все эти поля идут в WHERE как >=/<= пары. Инвертированная вилка по этажу/году даёт пустую выдачу без сигнала об ошибке ввода. Дополнительно: проверки используют truthiness (`if self.price_rub_min and ...`), поэтому граница 0 (price_rub_min=0) не проверяется — для 0 безвредно, но логика хрупкая. **Как чинить:** Добавить в валидатор симметричные проверки для floor_min/max, year_built_min/max, floors_total_min/max; сравнивать через `is not None`, а не truthiness. --- <sub>deep-audit «армия ботов 2» · verify+harden, confidence 0.85 · unit U120</sub>
bot-backend added the
week ревью 1
label 2026-06-15 05:59:05 +00:00
bot-backend added the
scope/backend
label 2026-06-15 11:02:17 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#1516
No description provided.