fix(account): show source metadata on empty account and income (WealthLedger/frontend#55) #133

Merged
codex-bot merged 1 commits from fix/55-investment-source-metadata into develop 2026-11-03 06:44:14 +03:00
Owner

Summary

Пустой счёт и страница дохода показывают серверное время и результат последней часовой попытки через существующий SourceSyncStatus. Список access-loss кодов собран в одном предикате.

Linked Issue

Refs WealthLedger/frontend#55 (audit 2026-10-11: FE-001, FE-002, DRY-004, TQ-004, RISK-005, TA-F05).

Решения владельца (расхождение Issue и specs)

frontend-user-feedback и frontend-data-resilience запрещают на этих экранах технические предупреждения о чтении, кнопки повтора и ручное обновление. Поэтому spec побеждает:

  • Делаю только source metadata (время успеха, устаревание, исход последней попытки) там, где её терял код.
  • Не делаю (AC 2 и часть AC 3 из Issue): cached-503 warning и локальный GET retry; это противоречит specs. Они остаются открытыми и описаны в комментарии к Issue.
  • Scope: только пробелы метаданных. Search, секции stock/bond и previews вне этого PR.
  • Access-loss: 3 кода (INVALID_TBANK_TOKEN, NOT_FOUND, TBANK_NOT_CONNECTED) + отдельный UNAUTHORIZED. «Четвёртого» кода в OpenAPI нет. Подмножество Accounts (без NOT_FOUND) не расширялось.

Changes

  • Account: ветка empty теперь несёт source (VM → AccountPage → AccountPageEmpty → SourceSyncStatus). source вынесен в общий AccountPageContent.
  • Income: VM отдаёт source: analytics.meta, loaded view рендерит SourceSyncStatus. Время берётся из meta.lastSuccessfulAt, не из часов браузера.
  • shared/api/problem-details.ts: isBrokerageAccessLoss(code). Использован в client.ts (isPermanentCode = предикат + UNAUTHORIZED), resource-query.ts (invalidate) и AccountPage.vm.ts; локальная копия удалена. Действия по страницам не объединялись.
  • Тесты: тихие проверки заменены на positive-assertions. Негативные селекторы старого label «Данные получены» (которого уже нет) заменены на проверку видимого «Данные на …» после реального settle запроса.

Verification

  • Новые тесты падали на старом коде (4 из них), на фиксе проходят: account empty, income full/empty, предикат кодов.
  • npm run verify: openapi:check, tsc -b, eslint --max-warnings=0, test:lint, vitest coverage (74 файла / 553 теста), knip, depcruise ×2, build, storybook build — exit 0.
  • Не проверено: реальный backend и браузер (только RTL/MSW), a11y вручную, search/detail sections, previews.

Breaking Changes (если есть)

Нет. API-контракт не менялся. UpcomingEventsDto.window из backend#55 отсутствует в snapshot фронта: регенерация типов вне этого PR (отдельная задача T27).

## Summary Пустой счёт и страница дохода показывают серверное время и результат последней часовой попытки через существующий `SourceSyncStatus`. Список access-loss кодов собран в одном предикате. ## Linked Issue Refs WealthLedger/frontend#55 (audit 2026-10-11: FE-001, FE-002, DRY-004, TQ-004, RISK-005, TA-F05). ## Решения владельца (расхождение Issue и specs) `frontend-user-feedback` и `frontend-data-resilience` запрещают на этих экранах технические предупреждения о чтении, кнопки повтора и ручное обновление. Поэтому **spec побеждает**: - Делаю только source metadata (время успеха, устаревание, исход последней попытки) там, где её терял код. - **Не делаю** (AC 2 и часть AC 3 из Issue): cached-503 warning и локальный GET retry; это противоречит specs. Они остаются открытыми и описаны в комментарии к Issue. - Scope: только пробелы метаданных. Search, секции stock/bond и previews вне этого PR. - Access-loss: 3 кода (`INVALID_TBANK_TOKEN`, `NOT_FOUND`, `TBANK_NOT_CONNECTED`) + отдельный `UNAUTHORIZED`. «Четвёртого» кода в OpenAPI нет. Подмножество Accounts (без `NOT_FOUND`) не расширялось. ## Changes - Account: ветка `empty` теперь несёт `source` (VM → `AccountPage` → `AccountPageEmpty` → `SourceSyncStatus`). `source` вынесен в общий `AccountPageContent`. - Income: VM отдаёт `source: analytics.meta`, loaded view рендерит `SourceSyncStatus`. Время берётся из `meta.lastSuccessfulAt`, не из часов браузера. - `shared/api/problem-details.ts`: `isBrokerageAccessLoss(code)`. Использован в `client.ts` (`isPermanentCode` = предикат + `UNAUTHORIZED`), `resource-query.ts` (invalidate) и `AccountPage.vm.ts`; локальная копия удалена. Действия по страницам не объединялись. - Тесты: тихие проверки заменены на positive-assertions. Негативные селекторы старого label «Данные получены» (которого уже нет) заменены на проверку видимого «Данные на …» после реального settle запроса. ## Verification - Новые тесты падали на старом коде (4 из них), на фиксе проходят: account empty, income full/empty, предикат кодов. - `npm run verify`: `openapi:check`, `tsc -b`, eslint `--max-warnings=0`, test:lint, vitest coverage (74 файла / 553 теста), knip, depcruise ×2, build, storybook build — exit 0. - Не проверено: реальный backend и браузер (только RTL/MSW), a11y вручную, search/detail sections, previews. ## Breaking Changes (если есть) Нет. API-контракт не менялся. `UpcomingEventsDto.window` из backend#55 отсутствует в snapshot фронта: регенерация типов вне этого PR (отдельная задача T27).
codex-bot added 1 commit 2026-11-03 06:36:36 +03:00
fix(account): show source metadata on empty account and income (WealthLedger/frontend#55)
Frontend verify / commits (pull_request) Successful in 30s
Frontend verify / security (pull_request) Successful in 9s
Frontend verify / verify (pull_request) Successful in 5m20s
2bb5ee08be
Share the brokerage access-loss predicate across client, resource query and account VM.
codex-bot merged commit 9619dc9791 into develop 2026-11-03 06:44:14 +03:00
codex-bot deleted branch fix/55-investment-source-metadata 2026-11-03 06:44:14 +03:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: WealthLedger/frontend#133