(medium) site-finder-api.ts/applyFilters: фильтры district/vri в prod обнуляют карту (все участки district='—', vri='other') #1487

Closed
opened 2026-06-15 05:57:51 +00:00 by bot-backend · 2 comments
Collaborator

Severity: medium · Категория: logic · Файл: frontend/src/lib/site-finder-api.ts:127-134, 208-219

site-finder-api.ts:208-219 (адаптер) + 127-134 (applyFilters). В non-mock ветке useParcelsBboxQuery каждому участку проставляется district:'—' и vri:'other' (стр.214-215, т.к. backend by-bbox их не отдаёт — подтверждено parcels.py:934-989: эндпоинт принимает только bbox+limit+user_id, district/vri/area params игнорируются FastAPI). Затем applyFilters применяется клиентски (стр.219): для vri — if (filters.vri != null && filters.vri !== 'other' && p.vri !== filters.vri) return false; для district — if (filters.district != null && filters.district !== '' && p.district !== filters.district) return false. UI реально выставляет конкретные значения: MapFilterBar.tsx:191-197 (VRI chips, values multistory/mixed/individual/office — ни одно не 'other'), :211-234 (district select из непустого DISTRICTS). Выбор любого конкретного района или ВРИ → p.vri='other'≠выбранному / p.district='—'≠выбранному → отсев ВСЕХ участков → пустая карта. Пользователь видит вводящее в заблуждение «нет участков», а не «фильтр недоступен». Как чинить: до прихода enrichment с backend не применять client-side district/vri фильтр (или дизейблить эти контролы), либо адаптер должен брать реальные district/vri, либо показывать явный disabled-state фильтра.

Почему баг: Клиентский фильтр применяется к данным, в которых соответствующее поле захардкожено заглушкой ('—'/'other'), поэтому любое не-дефолтное значение фильтра не матчится ни с одним участком и результат всегда пуст. Подтверждено: адаптер строки 215-216 + applyFilters строки 128-134 + наличие UI-контролов в MapFilterBar.tsx:87/92/214.

Как чинить: Пока backend не отдаёт district/vri, не применять эти фильтры клиентски к заглушечным полям: либо скрыть/задизейблить district- и vri-контролы в MapFilterBar, либо в applyFilters игнорировать фильтр, если у данных поле является плейсхолдером ('—'/'other'), либо пробрасывать district/vri на backend и фильтровать там.


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

**Severity:** medium · **Категория:** logic · **Файл:** `frontend/src/lib/site-finder-api.ts:127-134, 208-219` site-finder-api.ts:208-219 (адаптер) + 127-134 (applyFilters). В non-mock ветке useParcelsBboxQuery каждому участку проставляется district:'—' и vri:'other' (стр.214-215, т.к. backend by-bbox их не отдаёт — подтверждено parcels.py:934-989: эндпоинт принимает только bbox+limit+user_id, district/vri/area params игнорируются FastAPI). Затем applyFilters применяется клиентски (стр.219): для vri — `if (filters.vri != null && filters.vri !== 'other' && p.vri !== filters.vri) return false`; для district — `if (filters.district != null && filters.district !== '' && p.district !== filters.district) return false`. UI реально выставляет конкретные значения: MapFilterBar.tsx:191-197 (VRI chips, values multistory/mixed/individual/office — ни одно не 'other'), :211-234 (district select из непустого DISTRICTS). Выбор любого конкретного района или ВРИ → p.vri='other'≠выбранному / p.district='—'≠выбранному → отсев ВСЕХ участков → пустая карта. Пользователь видит вводящее в заблуждение «нет участков», а не «фильтр недоступен». Как чинить: до прихода enrichment с backend не применять client-side district/vri фильтр (или дизейблить эти контролы), либо адаптер должен брать реальные district/vri, либо показывать явный disabled-state фильтра. **Почему баг:** Клиентский фильтр применяется к данным, в которых соответствующее поле захардкожено заглушкой ('—'/'other'), поэтому любое не-дефолтное значение фильтра не матчится ни с одним участком и результат всегда пуст. Подтверждено: адаптер строки 215-216 + applyFilters строки 128-134 + наличие UI-контролов в MapFilterBar.tsx:87/92/214. **Как чинить:** Пока backend не отдаёт district/vri, не применять эти фильтры клиентски к заглушечным полям: либо скрыть/задизейблить district- и vri-контролы в MapFilterBar, либо в applyFilters игнорировать фильтр, если у данных поле является плейсхолдером ('—'/'other'), либо пробрасывать district/vri на backend и фильтровать там. --- <sub>deep-audit «армия ботов 2» · verify+harden, confidence 0.92 · unit U107</sub>
bot-backend added the
week ревью 1
label 2026-06-15 05:57:51 +00:00
bot-backend added the
scope/frontend
label 2026-06-15 11:02:12 +00:00
Owner

🔍 week ревью 1 — верификация (ПОДТВЕРЖДЕНО · дубликат #1475)

Текущее состояние кода: lib/site-finder-api.ts:202-213 (адаптер: district:"—" line 209, vri:"other" line 210, applyFilters line 213), applyFilters lib/site-finder-api.ts:117-130 (district lines 121-126, vri line 127), контролы MapFilterBar.tsx:191-198 (VRI-чипы multistory/mixed/individual/office) и :211-234 (district select из непустого DISTRICTS). Backend backend/app/api/v1/parcels.py:924-931 — by-bbox принимает только min_lat/min_lon/max_lat/max_lon/limit/user_id.

Корень: Адаптер хардкодит плейсхолдеры district:"—"/vri:"other" (backend by-bbox их не отдаёт), затем клиентский applyFilters применяется к этим заглушкам. Любое конкретное значение фильтра (p.vri='other'≠выбранному, p.district='—'≠выбранному) отсеивает ВСЕ участки → пустая карта, пользователь видит вводящее в заблуждение «нет участков». Подтверждено: FastAPI молча игнорирует неописанные query-параметры district/vri (отправляются site-finder-api.ts:184-185).

Что править:

  • Пока backend не отдаёт district/vri: НЕ применять эти фильтры клиентски к заглушечным полям (исключить district/vri из applyFilters для адаптированных строк, оставив min_area/max_area/status), ЛИБО скрыть/задизейблить VRI-чипы и district-select в MapFilterBar, ЛИБО пробрасывать district/vri на backend и фильтровать там.
  • Та же правка закрывает #1475 (high, backend-scope) — фиксить одним PR.

Что посмотреть:

  • Код: lib/site-finder-api.ts:117-130,202-213, MapFilterBar.tsx:191-234, backend/app/api/v1/parcels.py:924-989.
  • Vault: old/code/patterns/SiteFinder_Backend_Migration_Plan_May17.md (B1 by-bbox планировался с server-side filters[vri]/filters[district]).
**🔍 week ревью 1 — верификация (ПОДТВЕРЖДЕНО · дубликат #1475)** **Текущее состояние кода:** `lib/site-finder-api.ts:202-213` (адаптер: `district:"—"` line 209, `vri:"other"` line 210, `applyFilters` line 213), `applyFilters` `lib/site-finder-api.ts:117-130` (district lines 121-126, vri line 127), контролы `MapFilterBar.tsx:191-198` (VRI-чипы multistory/mixed/individual/office) и `:211-234` (district select из непустого `DISTRICTS`). Backend `backend/app/api/v1/parcels.py:924-931` — by-bbox принимает только `min_lat/min_lon/max_lat/max_lon/limit/user_id`. **Корень:** Адаптер хардкодит плейсхолдеры `district:"—"`/`vri:"other"` (backend by-bbox их не отдаёт), затем клиентский `applyFilters` применяется к этим заглушкам. Любое конкретное значение фильтра (`p.vri='other'≠выбранному`, `p.district='—'≠выбранному`) отсеивает ВСЕ участки → пустая карта, пользователь видит вводящее в заблуждение «нет участков». Подтверждено: FastAPI молча игнорирует неописанные query-параметры district/vri (отправляются site-finder-api.ts:184-185). **Что править:** - Пока backend не отдаёт district/vri: НЕ применять эти фильтры клиентски к заглушечным полям (исключить district/vri из `applyFilters` для адаптированных строк, оставив min_area/max_area/status), ЛИБО скрыть/задизейблить VRI-чипы и district-select в MapFilterBar, ЛИБО пробрасывать district/vri на backend и фильтровать там. - Та же правка закрывает #1475 (high, backend-scope) — фиксить одним PR. **Что посмотреть:** - Код: `lib/site-finder-api.ts:117-130,202-213`, `MapFilterBar.tsx:191-234`, `backend/app/api/v1/parcels.py:924-989`. - Vault: `old/code/patterns/SiteFinder_Backend_Migration_Plan_May17.md` (B1 by-bbox планировался с server-side filters[vri]/filters[district]).
Author
Collaborator

Дубликат #1475 (тот же дефект, подтверждено при верификации week ревью 1). Закрываю как duplicate — работа ведётся в #1475.

Дубликат #1475 (тот же дефект, подтверждено при верификации week ревью 1). Закрываю как duplicate — работа ведётся в #1475.
bot-backend added the
duplicate
label 2026-06-15 11:32:45 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
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#1487
No description provided.