(high) trade-in/page.tsx восстановление по ?id=: параметры объекта синтезируются нулями → EstimateResult показывает '0 м²', 'Студия', 'Этаж 0 из 0' и чужой адрес #1480

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

Severity: high · Категория: report · Файл: frontend/src/app/trade-in/page.tsx:62-75

frontend/src/app/trade-in/page.tsx:62-75: при открытии shareable-ссылки/перезагрузке (freshResult===null, оценка тянется по urlEstimateId через useEstimate) input для EstimateResult собирается заглушкой { address: analogs[0]?.address ?? '—', area_m2: 0, rooms: 0, floor: 0, total_floors: 0 }. EstimateResult.tsx безусловно печатает эти значения в карточке 'Параметры объекта': ${input.area_m2} м² → '0 м²' (строка 235), input.rooms === 0 ? 'Студия' → 'Студия' (238), ${input.floor} из ${input.total_floors} → 'Этаж 0 из 0' (242), а адрес берётся из первого аналога, а не оцениваемой квартиры. Guard на area_m2===0 / total_floors===0 отсутствует. Импакт: любой открывший сохранённую/расшаренную ссылку видит заведомо ложные характеристики объекта и чужой адрес — некорректный клиентский отчёт. Фикс: бэкенд должен сохранять и возвращать исходный input вместе с оценкой (persist input в БД при создании, отдавать в GET /estimate/{id}), либо EstimateResult должен скрывать секцию 'Параметры объекта' / показывать 'данные не сохранены' когда input синтетический (area_m2===0 и т.п.).

Почему баг: Восстановленная оценка теряет исходные параметры, и EstimateResult безусловно печатает 0/Студия как реальные характеристики объекта. Любой, кто откроет сохранённую ссылку на оценку, увидит заведомо ложные параметры квартиры (0 м², студия, этаж 0 из 0) и чужой адрес — врущий клиентский отчёт. EstimateResult не имеет guard против area_m2===0/total_floors===0.

Как чинить: Хранить/возвращать исходный input вместе с оценкой (backend уже пишет estimate в БД — добавить туда параметры запроса и отдавать в GET), либо не рендерить карточку 'Параметры объекта' и адрес при восстановлении без реального input. Как минимум — guard в EstimateResult, скрывающий поля при нулевых значениях.


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

**Severity:** high · **Категория:** report · **Файл:** `frontend/src/app/trade-in/page.tsx:62-75` frontend/src/app/trade-in/page.tsx:62-75: при открытии shareable-ссылки/перезагрузке (freshResult===null, оценка тянется по urlEstimateId через useEstimate) input для EstimateResult собирается заглушкой `{ address: analogs[0]?.address ?? '—', area_m2: 0, rooms: 0, floor: 0, total_floors: 0 }`. EstimateResult.tsx безусловно печатает эти значения в карточке 'Параметры объекта': `${input.area_m2} м²` → '0 м²' (строка 235), `input.rooms === 0 ? 'Студия'` → 'Студия' (238), `${input.floor} из ${input.total_floors}` → 'Этаж 0 из 0' (242), а адрес берётся из первого аналога, а не оцениваемой квартиры. Guard на area_m2===0 / total_floors===0 отсутствует. Импакт: любой открывший сохранённую/расшаренную ссылку видит заведомо ложные характеристики объекта и чужой адрес — некорректный клиентский отчёт. Фикс: бэкенд должен сохранять и возвращать исходный input вместе с оценкой (persist input в БД при создании, отдавать в GET /estimate/{id}), либо EstimateResult должен скрывать секцию 'Параметры объекта' / показывать 'данные не сохранены' когда input синтетический (area_m2===0 и т.п.). **Почему баг:** Восстановленная оценка теряет исходные параметры, и EstimateResult безусловно печатает 0/Студия как реальные характеристики объекта. Любой, кто откроет сохранённую ссылку на оценку, увидит заведомо ложные параметры квартиры (0 м², студия, этаж 0 из 0) и чужой адрес — врущий клиентский отчёт. EstimateResult не имеет guard против area_m2===0/total_floors===0. **Как чинить:** Хранить/возвращать исходный input вместе с оценкой (backend уже пишет estimate в БД — добавить туда параметры запроса и отдавать в GET), либо не рендерить карточку 'Параметры объекта' и адрес при восстановлении без реального input. Как минимум — guard в EstimateResult, скрывающий поля при нулевых значениях. --- <sub>deep-audit «армия ботов 2» · verify+harden, confidence 0.88 · unit U103</sub>
bot-backend added the
week ревью 1
label 2026-06-15 05:57:44 +00:00
bot-backend added the
scope/frontend
label 2026-06-15 11:02:11 +00:00
Owner

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

Текущее состояние кода: frontend/src/app/trade-in/page.tsx:62-75; печать значений в frontend/src/components/trade-in/EstimateResult.tsx:235,238,242.

Корень: дубликат #1424 (тот же дефект, unit U103 vs U84). При restore по ?id= input для EstimateResult собирается заглушкой { address: analogs[0]?.address ?? "—", area_m2: 0, rooms: 0, floor: 0, total_floors: 0 } (page.tsx:67-73). EstimateResult без guard печатает «0 м²» / «Студия» (input.rooms === 0) / «0 из 0» и адрес первого аналога.

Что править:

  • Persist исходного input на backend + возврат в GET /estimate/{id} (предпочтительно), либо скрытие карточки «Параметры объекта»/адреса при синтетическом input, либо как минимум guard в EstimateResult на area_m2===0/total_floors===0.
  • Рекомендация: закрыть как дубликат #1424 и вести фикс в одном PR.

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

  • Код: page.tsx:58-75, EstimateResult.tsx:233-269, lib/trade-in-api.ts:31-39.
  • Vault: релевантных заметок не найдено.
**🔍 week ревью 1 — верификация (ПОДТВЕРЖДЕНО)** **Текущее состояние кода:** `frontend/src/app/trade-in/page.tsx:62-75`; печать значений в `frontend/src/components/trade-in/EstimateResult.tsx:235,238,242`. **Корень:** дубликат #1424 (тот же дефект, unit U103 vs U84). При restore по `?id=` input для `EstimateResult` собирается заглушкой `{ address: analogs[0]?.address ?? "—", area_m2: 0, rooms: 0, floor: 0, total_floors: 0 }` (page.tsx:67-73). EstimateResult без guard печатает «0 м²» / «Студия» (`input.rooms === 0`) / «0 из 0» и адрес первого аналога. **Что править:** - Persist исходного input на backend + возврат в `GET /estimate/{id}` (предпочтительно), либо скрытие карточки «Параметры объекта»/адреса при синтетическом input, либо как минимум guard в EstimateResult на `area_m2===0`/`total_floors===0`. - Рекомендация: закрыть как дубликат #1424 и вести фикс в одном PR. **Что посмотреть:** - Код: `page.tsx:58-75`, `EstimateResult.tsx:233-269`, `lib/trade-in-api.ts:31-39`. - Vault: релевантных заметок не найдено.
Author
Collaborator

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

Дубликат #1424 (тот же дефект, подтверждено при верификации week ревью 1). Закрываю как duplicate — работа ведётся в #1424.
bot-backend added the
duplicate
label 2026-06-15 11:32:44 +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#1480
No description provided.