(high) site-finder-api/applyFilters: фильтры «Район» и «ВРИ» в prod дают пустую карту (клиентская фильтрация по плейсхолдерам) #1475

Closed
opened 2026-06-15 05:56:57 +00:00 by bot-backend · 1 comment
Collaborator

Severity: high · Категория: frontend · Файл: frontend/src/components/site-finder/entry/MapFilterBar.tsx:91-93,191-236

site-finder-api.ts:208-219 — в не-mock пути адаптер by-bbox жёстко проставляет district:'—' (стр.214) и vri:'other' (стр.215) каждому участку (B1 ещё не отдаёт district/vri), затем стр.219 повторно прогоняет applyFilters(adapted, filters). В applyFilters (стр.127-133): любой выбранный район (p.district==='—' !== filters.district) и любой выбранный ВРИ (p.vri==='other', а filters.vri∈{multistory,mixed,individual,office}!=='other') выбрасывают 100% участков. UI-контролы активны: MapFilterBar.tsx:191-198 (чипы ВРИ) и :211-236 (select района). Импакт: в проде выбор района/ВРИ → «Нет участков», хотя backend вернул совпадения; 2 из 3 осей фильтрации сломаны. В dev (MOCK_PARCELS_BBOX, фикстура с реальными district/vri) баг не виден. Чинить: не применять клиентский applyFilters к district/vri пока backend не отдаёт эти поля (исключить district/vri из клиентского applyFilters в адаптере, оставив их только серверными query-параметрами), либо скрывать/дизейблить эти контролы до прихода данных из B1.

Почему баг: MapFilterBar.tsx:191-198 (VRI-чипы) и :211-236 (district select) активны и пишут реальные значения в filters. site-finder-api.ts:190-191 шлёт их на бэкенд, но :208-219 адаптер ставит district:'—', vri:'other' для каждого участка, после чего :219 вызывает applyFilters(adapted, filters). При filters.vri='multistory' условие :133 (filters.vri!=null && filters.vri!=='other' && p.vri!==filters.vri) истинно для всех (p.vri==='other') → drop всех. При filters.district='Кировский' условие :127-132 истинно для всех (p.district==='—') → drop всех. Это не косметика: основной механизм фильтрации возвращает заведомо неверный (пустой) результат в проде.

Как чинить: Пока backend не отдаёт district/vri в by-bbox, НЕ применять клиентский applyFilters по district/vri к адаптированным строкам (полагаться на серверную фильтрацию по этим осям), либо скрывать/дизейблить чипы ВРИ и селект района до прихода enrichment. Клиентский applyFilters оставить только для min_area/max_area/status, которые реально известны на клиенте.


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

**Severity:** high · **Категория:** frontend · **Файл:** `frontend/src/components/site-finder/entry/MapFilterBar.tsx:91-93,191-236` site-finder-api.ts:208-219 — в не-mock пути адаптер by-bbox жёстко проставляет district:'—' (стр.214) и vri:'other' (стр.215) каждому участку (B1 ещё не отдаёт district/vri), затем стр.219 повторно прогоняет applyFilters(adapted, filters). В applyFilters (стр.127-133): любой выбранный район (p.district==='—' !== filters.district) и любой выбранный ВРИ (p.vri==='other', а filters.vri∈{multistory,mixed,individual,office}!=='other') выбрасывают 100% участков. UI-контролы активны: MapFilterBar.tsx:191-198 (чипы ВРИ) и :211-236 (select района). Импакт: в проде выбор района/ВРИ → «Нет участков», хотя backend вернул совпадения; 2 из 3 осей фильтрации сломаны. В dev (MOCK_PARCELS_BBOX, фикстура с реальными district/vri) баг не виден. Чинить: не применять клиентский applyFilters к district/vri пока backend не отдаёт эти поля (исключить district/vri из клиентского applyFilters в адаптере, оставив их только серверными query-параметрами), либо скрывать/дизейблить эти контролы до прихода данных из B1. **Почему баг:** MapFilterBar.tsx:191-198 (VRI-чипы) и :211-236 (district select) активны и пишут реальные значения в filters. site-finder-api.ts:190-191 шлёт их на бэкенд, но :208-219 адаптер ставит district:'—', vri:'other' для каждого участка, после чего :219 вызывает applyFilters(adapted, filters). При filters.vri='multistory' условие :133 (filters.vri!=null && filters.vri!=='other' && p.vri!==filters.vri) истинно для всех (p.vri==='other') → drop всех. При filters.district='Кировский' условие :127-132 истинно для всех (p.district==='—') → drop всех. Это не косметика: основной механизм фильтрации возвращает заведомо неверный (пустой) результат в проде. **Как чинить:** Пока backend не отдаёт district/vri в by-bbox, НЕ применять клиентский applyFilters по district/vri к адаптированным строкам (полагаться на серверную фильтрацию по этим осям), либо скрывать/дизейблить чипы ВРИ и селект района до прихода enrichment. Клиентский applyFilters оставить только для min_area/max_area/status, которые реально известны на клиенте. --- <sub>deep-audit «армия ботов 2» · verify+harden, confidence 0.9 · unit U102</sub>
bot-backend added the
week ревью 1
label 2026-06-15 05:56:57 +00:00
bot-backend added the
scope/backend
label 2026-06-15 11:02:10 +00:00
Owner

🔍 week ревью 1 — верификация (ПОДТВЕРЖДЕНО)

Текущее состояние кода: lib/site-finder-api.ts:202-213 (адаптер by-bbox + applyFilters), applyFilters lib/site-finder-api.ts:113-131, контролы MapFilterBar.tsx:191-198 (VRI-чипы) и :211-234 (district select), backend backend/app/api/v1/parcels.py:924-931.

Корень: Non-mock ветка адаптера хардкодит каждому участку district:"—" (line 209) и vri:"other" (line 210), затем прогоняет applyFilters(adapted, filters) (line 213). При выбранном районе условие applyFilters lines 121-126 (p.district==='—' !== filters.district) отсеивает ВСЕ; при выбранном ВРИ условие line 127 (p.vri==='other' !== filters.vri) отсеивает ВСЕ. UI пишет реальные значения (district из непустого DISTRICTS, vri ∈ multistory/mixed/individual/office — ни одно не 'other'). Backend by-bbox принимает только min_lat/min_lon/max_lat/max_lon/limit/user_iddistrict/vri query-параметры (отправляются в site-finder-api.ts:184-185) FastAPI молча игнорирует. Итог: в проде выбор района/ВРИ → пустая карта. В dev скрыто (MOCK_PARCELS_BBOX, фикстура с реальными district/vri).

Что править:

  • Пока B1 не отдаёт district/vri: НЕ применять клиентский applyFilters по этим осям к адаптированным строкам (оставить только min_area/max_area/status, которые реально известны на клиенте), ЛИБО дизейблить/скрывать VRI-чипы и district-select.
  • Долгосрочно: либо backend отдаёт district/vri в by-bbox + серверная фильтрация, либо адаптер берёт реальные поля.
  • NB: дубликат #1487 (та же находка, frontend-scope). Фиксить одной правкой.

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

  • Код: lib/site-finder-api.ts:202-213, applyFilters:113-131, 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 — верификация (ПОДТВЕРЖДЕНО)** **Текущее состояние кода:** `lib/site-finder-api.ts:202-213` (адаптер by-bbox + `applyFilters`), `applyFilters` `lib/site-finder-api.ts:113-131`, контролы `MapFilterBar.tsx:191-198` (VRI-чипы) и `:211-234` (district select), backend `backend/app/api/v1/parcels.py:924-931`. **Корень:** Non-mock ветка адаптера хардкодит каждому участку `district:"—"` (line 209) и `vri:"other"` (line 210), затем прогоняет `applyFilters(adapted, filters)` (line 213). При выбранном районе условие `applyFilters` lines 121-126 (`p.district==='—' !== filters.district`) отсеивает ВСЕ; при выбранном ВРИ условие line 127 (`p.vri==='other' !== filters.vri`) отсеивает ВСЕ. UI пишет реальные значения (district из непустого `DISTRICTS`, vri ∈ multistory/mixed/individual/office — ни одно не 'other'). Backend `by-bbox` принимает только `min_lat/min_lon/max_lat/max_lon/limit/user_id` — `district`/`vri` query-параметры (отправляются в site-finder-api.ts:184-185) FastAPI молча игнорирует. Итог: в проде выбор района/ВРИ → пустая карта. В dev скрыто (`MOCK_PARCELS_BBOX`, фикстура с реальными district/vri). **Что править:** - Пока B1 не отдаёт district/vri: НЕ применять клиентский `applyFilters` по этим осям к адаптированным строкам (оставить только min_area/max_area/status, которые реально известны на клиенте), ЛИБО дизейблить/скрывать VRI-чипы и district-select. - Долгосрочно: либо backend отдаёт district/vri в by-bbox + серверная фильтрация, либо адаптер берёт реальные поля. - NB: дубликат #1487 (та же находка, frontend-scope). Фиксить одной правкой. **Что посмотреть:** - Код: `lib/site-finder-api.ts:202-213`, `applyFilters:113-131`, `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], не зашипилось).
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#1475
No description provided.