Первый upstream UNAUTHENTICATED/PERMISSION_DENIED на online search/detail/ticker/company/screener теперь возвращает 400 / INVALID_TBANK_TOKEN вместо 500. Временная недоступность остаётся 503 / TBANK_UNAVAILABLE.
TbankAccessService.onlineToken и current заменены одним online(userId, run): он берёт токен и выполняет run внутри существующего translateInvalidToken. Токен вне замыкания получить нельзя, поэтому новый online-вызов не сможет обойти перевод. Новых классов ошибок и зависимостей нет.
Не затронуто
Durable-ветки (tokenForAttempt, rejectMembershipToken, их catches) и attempt-aware invalidation.
Current-revision isolation: revision по-прежнему приходит из того же чтения connection.
Online-отказ ничего не пишет в БД: invalidToken и revision остаются прежними.
Тесты
Новый describe в test/stocks.e2e-spec.ts и test/bonds.e2e-spec.ts (хелпер test/online-upstream.ts). Реальные сервисы и SQLite, подменён только gRPC-транспорт, поэтому статус проходит через настоящий маппинг TbankClient.
Share: 5 entrypoints x {UNAUTHENTICATED, PERMISSION_DENIED} x {первый RPC, поздний RPC} + UNAVAILABLE.
Bond: search/detail/ticker (company и screener у bond нет).
Тело ответа строго {code, status}: без raw-текста ошибки и токена; invalidToken=false, revision не изменился.
Мутации: без translateInvalidToken в online падают 20 из 48 кейсов stocks; обход перевода в screener роняет ровно 4 screener-кейса.
Gates
npm run verify: exit 0, 40 suites, 288 tests.
npm run test:e2e: exit 0, все 22 suites PASS.
openapi:check не запускался: wire contract и Swagger не менялись.
Consumer proof (frontend GET не ретраит 400/INVALID_TBANK_TOKEN) вынесен в отдельный frontend PR.
Refs WealthLedger/backend#59
## Что
Первый upstream `UNAUTHENTICATED`/`PERMISSION_DENIED` на online search/detail/ticker/company/screener теперь возвращает `400 / INVALID_TBANK_TOKEN` вместо `500`. Временная недоступность остаётся `503 / TBANK_UNAVAILABLE`.
`TbankAccessService.onlineToken` и `current` заменены одним `online(userId, run)`: он берёт токен и выполняет `run` внутри существующего `translateInvalidToken`. Токен вне замыкания получить нельзя, поэтому новый online-вызов не сможет обойти перевод. Новых классов ошибок и зависимостей нет.
## Не затронуто
- Durable-ветки (`tokenForAttempt`, `rejectMembershipToken`, их catches) и attempt-aware invalidation.
- Current-revision isolation: `revision` по-прежнему приходит из того же чтения connection.
- Online-отказ ничего не пишет в БД: `invalidToken` и `revision` остаются прежними.
## Тесты
Новый `describe` в `test/stocks.e2e-spec.ts` и `test/bonds.e2e-spec.ts` (хелпер `test/online-upstream.ts`). Реальные сервисы и SQLite, подменён только gRPC-транспорт, поэтому статус проходит через настоящий маппинг `TbankClient`.
- Share: 5 entrypoints x {UNAUTHENTICATED, PERMISSION_DENIED} x {первый RPC, поздний RPC} + UNAVAILABLE.
- Bond: search/detail/ticker (company и screener у bond нет).
- Тело ответа строго `{code, status}`: без raw-текста ошибки и токена; `invalidToken=false`, `revision` не изменился.
Мутации: без `translateInvalidToken` в `online` падают 20 из 48 кейсов stocks; обход перевода в screener роняет ровно 4 screener-кейса.
## Gates
- `npm run verify`: exit 0, 40 suites, 288 tests.
- `npm run test:e2e`: exit 0, все 22 suites PASS.
- `openapi:check` не запускался: wire contract и Swagger не менялись.
Consumer proof (frontend GET не ретраит 400/`INVALID_TBANK_TOKEN`) вынесен в отдельный frontend PR.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Refs WealthLedger/backend#59
Что
Первый upstream
UNAUTHENTICATED/PERMISSION_DENIEDна online search/detail/ticker/company/screener теперь возвращает400 / INVALID_TBANK_TOKENвместо500. Временная недоступность остаётся503 / TBANK_UNAVAILABLE.TbankAccessService.onlineTokenиcurrentзаменены однимonline(userId, run): он берёт токен и выполняетrunвнутри существующегоtranslateInvalidToken. Токен вне замыкания получить нельзя, поэтому новый online-вызов не сможет обойти перевод. Новых классов ошибок и зависимостей нет.Не затронуто
tokenForAttempt,rejectMembershipToken, их catches) и attempt-aware invalidation.revisionпо-прежнему приходит из того же чтения connection.invalidTokenиrevisionостаются прежними.Тесты
Новый
describeвtest/stocks.e2e-spec.tsиtest/bonds.e2e-spec.ts(хелперtest/online-upstream.ts). Реальные сервисы и SQLite, подменён только gRPC-транспорт, поэтому статус проходит через настоящий маппингTbankClient.{code, status}: без raw-текста ошибки и токена;invalidToken=false,revisionне изменился.Мутации: без
translateInvalidTokenвonlineпадают 20 из 48 кейсов stocks; обход перевода в screener роняет ровно 4 screener-кейса.Gates
npm run verify: exit 0, 40 suites, 288 tests.npm run test:e2e: exit 0, все 22 suites PASS.openapi:checkне запускался: wire contract и Swagger не менялись.Consumer proof (frontend GET не ретраит 400/
INVALID_TBANK_TOKEN) вынесен в отдельный frontend PR.