Перейти к основному содержимому

GET /api/v1/my/wallet — Мой кошелёк (балансы счетов)

Назначение

Отдаёт пользователю балансы всех его счетов кошелька: AgentCommission (агентские комиссии по сделкам) и ReferralCommission (реферальные вознаграждения) — раздельно, без смешения (ADR-0065). Агент видит, сколько ему причитается и ещё не выплачено по сделкам; партнёр — сколько накоплено по реферальной программе; один пользователь может иметь оба баланса одновременно.

Metadata

ПолеЗначение
Сервис/контекстwallet
API areauser
Feature groupmy-wallet
Статусdraft
Документdocs/06-services/wallet/api/user/get-my-wallet.md

Актор и доступ

ПроверкаЗначение
Actor typeUser (агент / партнёр / любой пользователь-холдер)
Auth policy / Permissionswallet.balance.view-own
Scope (RBAC)платформа (личные данные пользователя)
Record-levelтолько счета с HolderUserId = текущий пользователь

HTTP-контракт

ПолеЗначение
MethodGET
Route/api/v1/my/wallet
Success status200
Correlationсквозной trace через заголовок traceparent

Входные данные / параметры запроса

ПолеИсточникТипОбязательностьВалидация / Ограничения
UserIdidentity claimsGuidДатекущий пользователь — единственный критерий выборки

Модель ответа MyWalletModel

ПолеТипОбязательностьИсточникОписание
HolderDisplayNamestring?Нетdisplay-реплика (DisplayName по UserId)ФИО холдера для подписи ЛК; резолв из локальной реплики, без синхронного identity (user-display-replica.md). null — реплика ещё не наполнена (клиент подставляет имя из своего профиля/JWT).
AccountsIReadOnlyList<WalletBalanceModel>Да (может быть пуст)счета пользователяБалансы по видам счетов; дом модели — ../README.md.

Возвращаются только пользовательские виды счетов (AgentCommission, ReferralCommission) — не более одного счёта каждого вида (уникальность «холдер + вид», ../../domain/wallet-account.md). Счета создаются lazy при первой кредитующей проводке: пустой список / отсутствие вида означает нулевой баланс — клиент показывает 0.

Алгоритм

Тривиальное чтение: выбрать счета с HolderUserId = текущий пользователь, спроецировать в WalletBalanceModel и подтянуть HolderDisplayName из display-реплики (без синхронного identity; отсутствие строки → null). Отдаётся хранимый баланс (быстрые чтения ЛК); он периодически сверяется с пересчётом из журнала — расхождение является инцидентом рассинхрона (ADR-0021), а не поводом отдать иное значение. Свежесть — по общему правилу eventual-consistency (../README.md).

Ошибки и failure modes

Только общие ошибки области (../README.md): UNAUTHORIZED (401), FORBIDDEN (403 — нет permission). Отсутствие счетов ошибкой не является — 200 с пустым списком.

Совместимость и наблюдаемость

  • Новые optional-поля модели ответа и новые значения AccountKind — additive; клиент игнорирует неизвестные виды счетов.
  • Logs: запрос без сумм (UserId, число счетов); metrics: латентность p95; traces — traceparent.

Обратные ссылки

Автоссылки: где используется этот документ.

Связанные документы