From b940d39946baae78ab14a10b9f71ef15153e9604 Mon Sep 17 00:00:00 2001 From: Sergey Krylov Date: Sun, 13 Sep 2026 13:54:24 +0300 Subject: [PATCH] docs: record backend refactor and close P1-12 --- development/audit-remediation.md | 27 ++++++++++++++++--- domains/instruments/bonds.md | 6 +++-- domains/instruments/stocks.md | 5 ++-- domains/portfolio/all-accounts.md | 2 +- domains/portfolio/flows/portfolio-loading.md | 4 +-- .../how-to/investigate-discrepancy.md | 6 ++--- integrations/moex.md | 2 +- integrations/nkr.md | 2 +- integrations/tbank.md | 2 +- 9 files changed, 40 insertions(+), 16 deletions(-) diff --git a/development/audit-remediation.md b/development/audit-remediation.md index a6066ae..30ef043 100644 --- a/development/audit-remediation.md +++ b/development/audit-remediation.md @@ -76,11 +76,11 @@ remediation change создаётся после выбора владельце | FE26-09 | Убрать механическое обязательное дробление каждого component. | [FE-G] F-07 | already-covered | done | 06.09.2026; [FE26-E]. [UI pattern](../../frontend/.ai/conventions/frontend-ui.md) сохраняет semantic ownership и допускает tightly-coupled renderers; это guidance, а не line-count gate. Конкретное разделение крупных modules учтено отдельно FE26-13. | | FE26-10 | Объединить protected query policy и endpoint query identity ownership. | [FE-G] F-08; [FE-S] F-05 | already-covered | done | 06.09.2026; [FE26-E]. [App defaults](../../frontend/src/app/ui/App.tsx), [T-Bank VM](../../frontend/src/features/tbank-connection/ui/TbankConnectionSection.vm.ts) и entity-owned options operations/portfolio; status использует общий authenticated query seam. | | FE26-11 | Централизовать test cleanup и auth reset. | [FE-S] F-02 | already-covered | done | 06.09.2026; [FE26-E]. [Test setup](../../frontend/src/test/setup.ts): RTL cleanup, auth reset, MSW handler reset в общем afterEach. | -| FE26-12 | Убрать повтор server identity из Income view/model. | [FE-S] F-03 | confirmed | done | 06.09.2026; [FE26-E]. [Backend income service](../../backend/src/tbank/income-analytics.service.ts) передаёт instrumentKey; [Income VM](../../frontend/src/pages/account-income/ui/AccountIncomePage.vm.ts) проверяет и группирует готовую связь, не вычисляя identity. | +| FE26-12 | Убрать повтор server identity из Income view/model. | [FE-S] F-03 | confirmed | done | 06.09.2026; [FE26-E]. [Backend income service](../../backend/src/modules/investments/income/income-analytics.service.ts) передаёт instrumentKey; [Income VM](../../frontend/src/pages/account-income/ui/AccountIncomePage.vm.ts) проверяет и группирует готовую связь, не вычисляя identity. | | FE26-13 | Выделить самостоятельные ответственности семи крупных TSX modules. | [FE-S] F-04 | already-covered | done | 06.09.2026; [FE26-E]. Income/Events/Accounts/Account state views, [route fallback](../../frontend/src/app/routes/RouteFallback.tsx), [guards](../../frontend/src/app/routes/RouteGuards.tsx), breadcrumbs и T-Bank loaded section выделены во frontend `c97f62b`. | | FE26-14 | Устранить повтор test client policy и нестабильный cache lifetime. | [FE-S] F-06 | confirmed | done | 06.09.2026; [FE26-E]. [Test query factory](../../frontend/src/test/query.tsx) используется оставшимися auth/T-Bank harnesses; [auth test](../../frontend/src/features/auth/model/auth.test.tsx) проверяет сохранение client и seeded cache при rerender. | | FE26-15 | Перенести компонентные стили из global CSS к владельцам. | [FE-S] F-08 | already-covered | done | 06.09.2026; [FE26-E]. [Global styles](../../frontend/src/shared/theme/styles.css) содержат базовые правила; AppShell, breadcrumbs и auth используют CSS Modules, StateView — Mantine props. | -| FE26-16 | Исправить source connectedAt contract вместо String coercion. | [FE-S] F-09 | already-covered | done | 06.09.2026; [FE26-E]. [Backend DTO](../../backend/src/tbank/tbank-connection.dto.ts) задаёт nullable date-time string; [frontend consumer](../../frontend/src/features/tbank-connection/ui/TbankConnectionSectionLoaded.tsx) не скрывает неверный transport type через String. | +| FE26-16 | Исправить source connectedAt contract вместо String coercion. | [FE-S] F-09 | already-covered | done | 06.09.2026; [FE26-E]. [Backend DTO](../../backend/src/modules/investments/tbank-connection/tbank-connection.dto.ts) задаёт nullable date-time string; [frontend consumer](../../frontend/src/features/tbank-connection/ui/TbankConnectionSectionLoaded.tsx) не скрывает неверный transport type через String. | | FE26-17 | Перенести auth validation и payment invariants из JSX к model owners. | [FE-S] F-10 | already-covered | done | 06.09.2026; [FE26-E]. [Auth validation](../../frontend/src/features/auth/model/validation.ts), [ledger display](../../frontend/src/entities/broker-operation/model/display.ts) владеют соответствующими правилами. | | FE26-18 | Удалить redundant position modes и test-only proxy exports. | [FE-S] F-11 | already-covered | done | 06.09.2026; [FE26-E]. [PositionCard](../../frontend/src/pages/account/ui/components/PositionCard.view.tsx) выводит mode из kind; [StateView](../../frontend/src/shared/ui/StateView.tsx) не экспортирует Mantine Button; page barrels сохраняют product surface. | @@ -253,6 +253,27 @@ authority. Terminal evidence добавляется сюда только после завершения соответствующего change. +### 2026-09-13 — P1-12: backend responsibilities + +Статус: `done`. Backend commit `8ba0053`. + +BankCards разделён на services карт, операций и категорий, сценарий сводки и +конкретный repository. Общая transaction/retry boundary, ownership, idempotency, +optimistic concurrency и ограничения возвратов сохранены. Stock/bond services +разделены по каталогу, рынку и доходам; связные operations и T-Bank client +сохранены. Business modules отделены от integrations; сложные modules используют +слои ответственности, компактные остаются плоскими. + +- `npm run verify` — passed: lint, app/test typecheck, 35 suites / 257 tests, build. +- Восемь существующих HTTP/e2e suites выполнены временным runner + `/tmp/wl-modular-http.cjs`: отдельная SQLite DB на suite, migrations с + `RUST_LOG=info`, configured HTTP, 118 tests passed. OpenAPI совпадает с frontend + snapshot. Общий e2e blocker и статус задачи 03 этим не закрываются. +- Финальный перенос 47 файлов проверен сравнением 142 исходников/tests: + различий кроме относительных путей и форматирования нет. +- Formatter, docs `npm run verify`, lint backend conventions и `git diff --check` + прошли. Новые dependencies и architecture tests не добавлены. + ### 2026-09-13 — P1-11: реальная SQLite P1-11 поставлена в backend commit `7fde3ec`. Дополнено доказательство @@ -294,7 +315,7 @@ WL-P2-03; статус общего e2e WL-P2-05 не меняется. Кома принадлежит Nest/class-transformer, ответные DTO описывают возвращаемые объекты. `declare` не генерирует поля со значением `undefined` и не подменяет проверку входных данных. Optional/nullable-типы, декораторы и валидация сохранены. -В [TbankClient](../../backend/src/tbank/tbank.client.ts) +В [TbankClient](../../backend/src/integrations/tbank/tbank.client.ts) `getOpenAccounts` и `getDividends` задают тип результата на `call`, как соседние RPC; тип параметра `.then` выводится из этого результата. diff --git a/domains/instruments/bonds.md b/domains/instruments/bonds.md index 64c04cc..f0e4b87 100644 --- a/domains/instruments/bonds.md +++ b/domains/instruments/bonds.md @@ -136,7 +136,9 @@ HTML-источник, общий кэш и поведение при измен и [журнала](../../../specs/openspec/specs/brokerage-account-ledger/spec.md) описывают исходные финансовые понятия. Отдельная основная спецификация страницы облигации в текущем OpenSpec Store не найдена; условия вычислений -подтверждены [сервисом облигаций](../../../backend/src/tbank/bond.service.ts) -и его [проверками](../../../backend/src/tbank/bond.service.spec.ts). +подтверждены [каталогом](../../../backend/src/modules/investments/instruments/bonds/application/bond-catalog.service.ts), +[рыночными данными](../../../backend/src/modules/investments/instruments/bonds/application/bond-market.service.ts), +[выплатами](../../../backend/src/modules/investments/instruments/bonds/application/bond-income.service.ts) +и [проверками](../../../backend/src/modules/investments/instruments/bonds/application/bond.spec.ts). Границы источников описаны в [разделе интеграций](../../integrations/README.md), сходное разделение рыночных и личных данных — в [акциях](stocks.md). diff --git a/domains/instruments/stocks.md b/domains/instruments/stocks.md index 6c8bcf4..aaababa 100644 --- a/domains/instruments/stocks.md +++ b/domains/instruments/stocks.md @@ -173,6 +173,7 @@ TTM означает последние 12 месяцев, MRQ — послед и [журнала](../../../specs/openspec/specs/brokerage-account-ledger/spec.md) задают исходные финансовые понятия. Отдельная основная спецификация страницы акции в текущем OpenSpec Store не найдена; описанные механизмы проверяются -по [сервису акций](../../../backend/src/tbank/stock.service.ts) и его -[проверкам](../../../backend/src/tbank/stock.service.spec.ts). +по [каталогу](../../../backend/src/modules/investments/instruments/stocks/application/stock-catalog.service.ts), +[рыночным данным](../../../backend/src/modules/investments/instruments/stocks/application/stock-market.service.ts), +[выплатам](../../../backend/src/modules/investments/instruments/stocks/application/stock-income.service.ts) и [проверкам](../../../backend/src/modules/investments/instruments/stocks/application/stock.spec.ts). Сопоставление с облигациями — на [странице облигаций](bonds.md). diff --git a/domains/portfolio/all-accounts.md b/domains/portfolio/all-accounts.md index afa8d30..0edf18b 100644 --- a/domains/portfolio/all-accounts.md +++ b/domains/portfolio/all-accounts.md @@ -114,6 +114,6 @@ Backend публикует статические маршруты под `/api/ [дохода](../../../specs/openspec/specs/brokerage-account-income-analytics/spec.md) и [событий](../../../specs/openspec/specs/brokerage-account-upcoming-events/spec.md) описывают отдельный счёт. Общий режим подтверждён действующими маршрутизаторами, -сервисами и [проверками агрегации](../../../backend/src/tbank/all-accounts.spec.ts), +сервисами и [проверками агрегации](../../../backend/src/modules/investments/all-accounts.spec.ts), но не выделен в самостоятельную основную спецификацию. Не следует считать описание общего режима изменением требований к отдельному счёту. diff --git a/domains/portfolio/flows/portfolio-loading.md b/domains/portfolio/flows/portfolio-loading.md index b0c553f..875818c 100644 --- a/domains/portfolio/flows/portfolio-loading.md +++ b/domains/portfolio/flows/portfolio-loading.md @@ -79,8 +79,8 @@ sequenceDiagram | Метаданные инструмента | Успешный поиск или подтверждённое отсутствие | Свежими считаются 24 часа; общий кэш на 500 ключей UID/FIGI, ошибки не сохраняются | Это параметры текущей реализации, а не самостоятельная политика этого -документа: [снимки](../../../../backend/src/tbank/portfolio.service.ts), -[метаданные](../../../../backend/src/tbank/instrument-metadata.service.ts) и +документа: [снимки](../../../../backend/src/modules/investments/portfolio/application/portfolio.service.ts), +[метаданные](../../../../backend/src/integrations/tbank/instrument-metadata.service.ts) и [клиентский запрос](../../../../frontend/src/entities/portfolio/api/usePortfolio.ts). Пять минут — предельный возраст успешного снимка, а не дополнительные diff --git a/domains/portfolio/how-to/investigate-discrepancy.md b/domains/portfolio/how-to/investigate-discrepancy.md index 09f94d5..ce48d7d 100644 --- a/domains/portfolio/how-to/investigate-discrepancy.md +++ b/domains/portfolio/how-to/investigate-discrepancy.md @@ -43,9 +43,9 @@ и реализации. Для адресной проверки исходников владельцами служат -[сервис снимков](../../../../backend/src/tbank/portfolio.service.ts), -[валютные итоги](../../../../backend/src/tbank/portfolio-totals.ts), -[структура](../../../../backend/src/tbank/portfolio-structure.ts) и +[сервис снимков](../../../../backend/src/modules/investments/portfolio/application/portfolio.service.ts), +[валютные итоги](../../../../backend/src/modules/investments/portfolio/infrastructure/tbank-portfolio.mapper.ts), +[структура](../../../../backend/src/modules/investments/portfolio/domain/portfolio-structure.ts) и [подготовка экрана](../../../../frontend/src/pages/account/ui/AccountPage.vm.ts). Это точки продолжения расследования; смысл вычислений изложен выше. diff --git a/integrations/moex.md b/integrations/moex.md index b682f9e..65328a1 100644 --- a/integrations/moex.md +++ b/integrations/moex.md @@ -50,4 +50,4 @@ HTTP-запрос ограничен таймаутом. Сеть, неуспе Условия обработки источника в прогнозе закреплены в [спецификации будущих событий](../../specs/openspec/specs/brokerage-account-upcoming-events/spec.md#requirement-upcoming-events-use-complete-source-results). Точный механизм транспорта, разбора и сопоставления реализован в -[клиенте MOEX](../../backend/src/tbank/moex.client.ts). +[клиенте MOEX](../../backend/src/integrations/moex/moex.client.ts). diff --git a/integrations/nkr.md b/integrations/nkr.md index 2fb325a..3711f41 100644 --- a/integrations/nkr.md +++ b/integrations/nkr.md @@ -36,7 +36,7 @@ ISIN, даты и ссылки на выпуск. Изменение табли После ошибки новая загрузка ограничена минутным интервалом; внутри одного HTTP-запроса повторных попыток нет. Обновление запускается следующим обращением после истечения кэша, без фонового задания. Точный механизм и сроки принадлежат -[клиенту НКР](../../backend/src/tbank/ncr-ratings.client.ts). +[клиенту НКР](../../backend/src/integrations/ncr/ncr-ratings.client.ts). При отказе реестра показатели облигации отмечают недоступность рейтинга, сохраняя остальные доступные показатели. Готовый ответ метрик имеет diff --git a/integrations/tbank.md b/integrations/tbank.md index f34331c..73f3963 100644 --- a/integrations/tbank.md +++ b/integrations/tbank.md @@ -139,7 +139,7 @@ Backend хранит token в шифротексте AES-256-GCM с новым n отсутствие инструмента, а не временный сбой. Остальные RPC при полной очереди завершаются сразу. Параметры попыток принадлежат -[T-Bank client](../../backend/src/tbank/tbank.client.ts) (workspace-ссылка); +[T-Bank client](../../backend/src/integrations/tbank/tbank.client.ts) (workspace-ссылка); решение об ограниченных повторах — [ADR 005](../adr/005-tbank-upstream-resilience.md). Большое число ранее неизвестных инструментов требует отдельных запросов