Перейти к содержанию

03 account types

Четыре типа аккаунтов в OneWallet и их права доступа.

Типы аккаунтов

Тип аккаунта хранится в поле accountType таблицы users. Значения из модели (user.spy.yaml): consumer | merchant | agent | wallet.

Тип Кто Доступные операции
consumer Физическое лицо (кошелёк) P2P-переводы, баланс, история, KYC, NFC-тег, mini-apps
wallet Расширенный consumer (агентский пополняемый счёт) Всё что consumer + пополнение счёта агентом (wallet_endpoint)
merchant Юридическое лицо / торговая точка Создание инвойсов, NFC-терминал, запрос settlement
agent Агент / посредник Топап потребителей, создание инвойсов

Как работает guard

Каждый endpoint вызывает requireAccountType(session, [...]) из util/endpoint_guard.dart. Функция:

  1. Проверяет наличие активной сессии (иначе — unauthenticated)
  2. Находит User по authUserId где isArchived = false
  3. Сверяет user.accountType со списком разрешённых типов
  4. При несовпадении выбрасывает NotAuthorizedException с кодом insufficientAccess
flowchart TD
    A[Запрос к endpoint] --> B{Сессия есть?}
    B -- Нет --> E[NotAuthorizedException\nunauthenticated]
    B -- Да --> C{User найден\nи не архивирован?}
    C -- Нет --> E
    C -- Да --> D{accountType\nв списке allowed?}
    D -- Нет --> F[NotAuthorizedException\ninsufficientAccess]
    D -- Да --> G[Возврат User\nвыполнение endpoint]

Некоторые endpoints допускают несколько типов: payment_endpoint разрешает ['consumer', 'wallet', 'agent'] для части методов.

Приложения по типу

Приложение appId Разрешённые accountType
OneWallet кошелёк wallet consumer, wallet
Closeloop closeloop consumer
Merchant POS merchant merchant, agent

Разделение на уровне appId не проверяется сервером автоматически — гарантируется только через requireAccountType в каждом endpoint. Полная привязка токена к appId является запланированным улучшением [PLAN].

FCM роутинг

Уведомления направляются по appId, который приложение передаёт при регистрации FCM-токена:

appId Flutter-приложение FCM-топик
wallet onewallet_base_flutter wallet
closeloop closeloop_app_flutter [PLAN] closeloop
merchant merchant_app_flutter [PLAN] merchant