perf(directories): SQL-фильтрация/пагинация справочников, N+1, лимиты column-values
Шаги 1.1 и 1.2 плана production-готовности: - getDataTableRowsPaged: фильтры/поиск/сортировка/пагинация в SQL (values->>N) - getDataTablesWithAccess и list_directories без N+1 - /column-values: limit (дефолт 20, кап 1000), убраны debug-логи с горячего пути - tree-режим и legacy-путь TableEditor сохранены 1:1 - 10 новых тестов (88/88)
This commit is contained in:
@@ -180,3 +180,27 @@
|
||||
- Как проверялось: vitest 78/78 (дедуп по Idempotency-Key, повторный webhook не зачисляет дважды, изоляция организаций, 404 confirm-test при не-mock, 401 по подписи); `npm run check` чисто.
|
||||
- Влияние на поиск/UX: нет.
|
||||
- Подводные камни: на проде PAYMENT_PROVIDER не задан → mock активен, кнопка «Подтвердить (тест)» видна админам организаций — это и есть поставка шага; при подключении реального провайдера кнопка скроется автоматически. Подключение реального провайдера: новый класс в server/billing/ + case в фабрике + env (см. отчёт в коде payment-provider.ts).
|
||||
|
||||
---
|
||||
|
||||
## [1.1] Data-tables: фильтрация на уровне SQL
|
||||
|
||||
- Статус: ✅ done
|
||||
- Зачем: справочники не грузят все строки/таблицы ради фильтрации в JS (Фаза 1).
|
||||
- Что изменено:
|
||||
- `server/storage/data-tables-core.storage.ts` — `getDataTablesWithAccess` без N+1 (2 запроса вместо 1+N); новый `getDataTableRowsPaged` (SQL: фильтры `values->>N ILIKE ESCAPE`, поиск `values::text ILIKE`, сортировка lower()+тай-брейкер position/id, LIMIT/OFFSET); `getDataTableRowCounts` (один GROUP BY); `moveDataTableRow` — siblings SQL-запросом.
|
||||
- `server/utils/data-table-rows-query.ts` — escapeIlikePattern, капы limit (дефолт 100, макс 1000)/offset.
|
||||
- `server/routes/data-tables.routes.ts` — GET /rows с limit/offset/search → SQL-путь `{rows, total}`; без параметров — прежний JS-путь (сортировка localeCompare('ru') сохранена 1:1 для текущего фронта).
|
||||
- `server/mcp.ts` — list_directory_rows (flat) на SQL-пагинацию; list_directories rowCount одним запросом.
|
||||
- Tree-режим сознательно не тронут: дерево строится из всех строк, пагинация неприменима.
|
||||
- Как проверялось: vitest 88/88 (10 новых тестов хелперов); `npm run check` чисто.
|
||||
- Влияние на поиск/UX: нет (TableEditor попадает в legacy-ветку).
|
||||
- Подводные камни: `/api/directories/:id/column-values` всё ещё грузит все строки (прерывается на 20) — кандидат на следующий заход (SELECT DISTINCT values->>N LIMIT); фронт TableEditor пока не использует SQL-пагинацию (эндпоинт готов).
|
||||
|
||||
## [1.2] /column-values: лимиты и чистка горячего пути
|
||||
|
||||
- Статус: ✅ done
|
||||
- Зачем: cap выборки, убрать console.log с горячего пути (Фаза 1).
|
||||
- Что изменено: `server/routes/task-crud-list.routes.ts` — убраны 7 debug-логов на запрос + per-task лог contract-number; параметр limit (дефолт 20, кап 1000).
|
||||
- Как проверялось: выборка покрыта индексом tasks_org_id_form_id_idx — новый индекс не нужен; vitest 88/88.
|
||||
- Влияние на поиск/UX: нет.
|
||||
|
||||
Reference in New Issue
Block a user