feat(22k): object page — full exposure 9 blocks (sales/quartirography/metro/photos/docs/specs/checks) #310

Merged
lekss361 merged 1 commit from fix/22k-frontend-exposure into main 2026-05-17 15:56:40 +00:00
Owner

Summary

Issue #297 sub-task 22k (Phase 6 — Wave C final). Frontend exposure всех данных из Wave A+B на per-object drill-in page /analytics/objects/[id].

Backend

backend/app/services/analytics_queries.py + backend/app/api/v1/analytics.py:

  • object_full_detail() — extended SELECT с 30 new cols из 113_22begh (building specs, yard, OVZ, catalog UI, metro, scores, dev_group_name)
  • object_flats_quartirography() — GROUP BY rooms from domrf_kn_flats
  • object_obj_checks() — SELECT from domrf_obj_checks (22f)
  • object_documents() — SELECT from domrf_kn_documents (22i)
  • 4 new endpoints: /object/{id}/full, /quartirography, /checks, /documents

Frontend (5 new components + page restructure)

  • ObjectSpecsTable.tsx — 30+ spec rows (conditional, nulls hidden)
  • ObjectQuartirographyTable.tsx — rooms × count/free/area/price
  • ObjectChecksBadges.tsx — 6 badge pills (passed/failed)
  • ObjectDocumentsList.tsx — PDF links grouped by doc_type with safeUrl()
  • ObjectMetroList.tsx — top3 metro entries with line color dot
  • page.tsx — 9 блоков incl. DOM.РФ scores KPI row, checks, documents, specs

Blocks

  1. SalesGraph (sale_graph)
  2. 3 KPI Распроданность (sales_agg)
  3. Квартирография table
  4. Ход строительства gallery
  5. Документы list (22i)
  6. Все характеристики 30+ fields (22e)
  7. 3 ближайших метро (22h)
  8. DOM.РФ scores (3 cards)
  9. 6 «Проверено» badges (22f)

Test plan

  • npx tsc --noEmit passes
  • ruff check backend/app/api/v1/analytics.py backend/app/services/analytics_queries.py
  • Manual smoke: /analytics/objects/65136 (Малевич) — все 9 блоков render

Closes #297 (Phase 6 — 22k frontend exposure) → issue #297 complete (все 11 sub-tasks 22a-22k merged).

## Summary Issue #297 sub-task **22k** (Phase 6 — Wave C final). Frontend exposure всех данных из Wave A+B на per-object drill-in page `/analytics/objects/[id]`. ## Backend `backend/app/services/analytics_queries.py` + `backend/app/api/v1/analytics.py`: - `object_full_detail()` — extended SELECT с 30 new cols из `113_22begh` (building specs, yard, OVZ, catalog UI, metro, scores, dev_group_name) - `object_flats_quartirography()` — GROUP BY rooms from `domrf_kn_flats` - `object_obj_checks()` — SELECT from `domrf_obj_checks` (22f) - `object_documents()` — SELECT from `domrf_kn_documents` (22i) - 4 new endpoints: `/object/{id}/full`, `/quartirography`, `/checks`, `/documents` ## Frontend (5 new components + page restructure) - `ObjectSpecsTable.tsx` — 30+ spec rows (conditional, nulls hidden) - `ObjectQuartirographyTable.tsx` — rooms × count/free/area/price - `ObjectChecksBadges.tsx` — 6 badge pills (passed/failed) - `ObjectDocumentsList.tsx` — PDF links grouped by `doc_type` with `safeUrl()` - `ObjectMetroList.tsx` — top3 metro entries with line color dot - `page.tsx` — 9 блоков incl. DOM.РФ scores KPI row, checks, documents, specs ## Blocks 1. SalesGraph (sale_graph) 2. 3 KPI Распроданность (sales_agg) 3. Квартирография table 4. Ход строительства gallery 5. Документы list (22i) 6. Все характеристики 30+ fields (22e) 7. 3 ближайших метро (22h) 8. DOM.РФ scores (3 cards) 9. 6 «Проверено» badges (22f) ## Test plan - [ ] `npx tsc --noEmit` passes - [ ] `ruff check backend/app/api/v1/analytics.py backend/app/services/analytics_queries.py` - [ ] Manual smoke: `/analytics/objects/65136` (Малевич) — все 9 блоков render Closes #297 (Phase 6 — 22k frontend exposure) → **issue #297 complete (все 11 sub-tasks 22a-22k merged)**.
lekss361 added 1 commit 2026-05-17 15:51:33 +00:00
Adds backend queries + 4 API endpoints + 5 frontend components to expose all
Wave A+B data on the per-object drill-in page (/analytics/objects/[id]).

Backend (analytics_queries.py + analytics.py):
- object_full_detail(): extended SELECT with all 30 new cols from 113_22begh
  (building specs, yard, OVZ, catalog UI, metro, scores, dev_group_name)
- object_flats_quartirography(): GROUP BY rooms from domrf_kn_flats
- object_obj_checks(): SELECT from domrf_obj_checks (22f)
- object_documents(): SELECT from domrf_kn_documents (22i)
- 4 new endpoints: /object/{id}/full, /quartirography, /checks, /documents

Frontend:
- ObjectSpecsTable.tsx — 30+ spec rows, conditional (nulls hidden)
- ObjectQuartirographyTable.tsx — rooms x count/free/area/price
- ObjectChecksBadges.tsx — 6 badge pills (passed/failed)
- ObjectDocumentsList.tsx — PDF links grouped by doc_type with safeUrl()
- ObjectMetroList.tsx — top3 metro entries with line color dot
- page.tsx: 9 blocks incl. DOM.RF scores KPI row, checks, documents, specs

Closes #297 (Phase 6 — 22k frontend exposure)
lekss361 merged commit f8c382f885 into main 2026-05-17 15:56:40 +00:00
Author
Owner

Deep code review — verdict APPROVE, merged.

Backend (analytics_queries.py + analytics.py):

  • Все 30 названий колонок в object_full_detail() SELECT сверены с 113_22begh_kn_schema_extension.sql — match
  • domrf_obj_checks (check_type, passed, checked_at) и domrf_kn_documents (doc_type, doc_num, posted_at, file_url, size_bytes) — match со схемами 111_22f / 112_22i
  • :obj named binds везде, нет :param::type (CAST trap чист), нет f-string SQL — psycopg v3 compliant
  • 404 на /full consistent с существующим object_detail
  • object_flats_quartirography() — latest-snapshot CTE предотвращает дубли через множественные снимки; FILTER (WHERE price_rub > 0) корректно исключает нули из MIN/MAX

Frontend (5 новых компонентов + restructure):

  • safeUrl() в ObjectDocumentsList.tsx — protocol allowlist (http/https), fallback на # — XSS prevention OK
  • target="_blank" rel="noopener noreferrer" на PDF links — корректно
  • Все типы в types/analytics.ts strict, nullable правильно прокинуто
  • ObjectSpecsTablevalue !== null filter скрывает пустые строки (30+ полей, conditional render)
  • useQuery hooks с enabled: !!objId guard
  • Conditional Sections для metro/checks/documents/scores при no data
  • Стабильные key props (room_label, check_type, type+doc_num)

Minor (non-blocking):

  • 4 параллельных API calls — TanStack Query parallels автоматически, acceptable
  • metro_top3 typed как массив — UI корректно handles current 1-element payload

Cross-file impact:

  • useObjectDetail остаётся exported в analytics-api.ts (не удалена, просто не используется на этой странице) — additive change, OK
  • Schema dependencies (PR #303 22f, #305 22i, #306 22begh) уже merged — column existence гарантирована

Smoke test plan:

  • /analytics/objects/65136 (Малевич) — все 9 блоков render
  • obj без metro (22h null) → блок скрыт
  • obj без checks (22f empty) → блок скрыт
  • obj без documents (22i empty) → блок скрыт

Closes #297все 11 sub-tasks 22a–22k merged. Phase 6 Wave C финализирован.

Merged via deep-code-reviewer.

Deep code review — verdict APPROVE, merged. **Backend (analytics_queries.py + analytics.py):** - Все 30 названий колонок в `object_full_detail()` SELECT сверены с `113_22begh_kn_schema_extension.sql` — match - `domrf_obj_checks` (`check_type`, `passed`, `checked_at`) и `domrf_kn_documents` (`doc_type`, `doc_num`, `posted_at`, `file_url`, `size_bytes`) — match со схемами 111_22f / 112_22i - `:obj` named binds везде, нет `:param::type` (CAST trap чист), нет f-string SQL — psycopg v3 compliant - 404 на `/full` consistent с существующим `object_detail` - `object_flats_quartirography()` — latest-snapshot CTE предотвращает дубли через множественные снимки; `FILTER (WHERE price_rub > 0)` корректно исключает нули из MIN/MAX **Frontend (5 новых компонентов + restructure):** - `safeUrl()` в `ObjectDocumentsList.tsx` — protocol allowlist (http/https), fallback на `#` — XSS prevention OK - `target="_blank" rel="noopener noreferrer"` на PDF links — корректно - Все типы в `types/analytics.ts` strict, nullable правильно прокинуто - `ObjectSpecsTable` — `value !== null` filter скрывает пустые строки (30+ полей, conditional render) - `useQuery` hooks с `enabled: !!objId` guard - Conditional Sections для metro/checks/documents/scores при no data - Стабильные `key` props (room_label, check_type, type+doc_num) **Minor (non-blocking):** - 4 параллельных API calls — TanStack Query parallels автоматически, acceptable - `metro_top3` typed как массив — UI корректно handles current 1-element payload **Cross-file impact:** - `useObjectDetail` остаётся exported в `analytics-api.ts` (не удалена, просто не используется на этой странице) — additive change, OK - Schema dependencies (PR #303 22f, #305 22i, #306 22begh) уже merged — column existence гарантирована **Smoke test plan:** - `/analytics/objects/65136` (Малевич) — все 9 блоков render - obj без metro (22h null) → блок скрыт - obj без checks (22f empty) → блок скрыт - obj без documents (22i empty) → блок скрыт Closes #297 — **все 11 sub-tasks 22a–22k merged**. Phase 6 Wave C финализирован. Merged via deep-code-reviewer.
Sign in to join this conversation.
No reviewers
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#310
No description provided.