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

Identity Agent API — реестр методов и общие правила области

Реестр self-service методов агента (контекст identity, сервис Pin.Identity.Api, area agent): пользователь c ролью agent управляет собственным членством в агентстве и переходом роли — выход из агентства (остаётся независимым) и возврат к инвестору (ADR-0061). Общий дом правил области: модель актора (User = сам агент, self-действие) и общий алгоритм развязки членства. Документы методов ссылаются сюда и описывают дельту; общий конверт — в ../README.md; дома полей — ../../domain/.

Metadata

ПолеЗначение
Сервис/контекстidentity
API areaagent (self-действия агента над своим членством/ролью)
Тип документаapi (area-registry, не единичная операция)
Статусdraft (ADR-0061)
OwnerPIN Platform Core
Область действиячленство агента и переход роли агент→инвестор; приглашения (accept/decline/become-agent) — область investor/; приглашение/отзыв — company-user/; см. ../README.md
Assumptionsнезависимый агент = роль agent в scope Platform без активного AgentMembership (../../domain/agent-membership.md); метрики агента — user-centric (агрегация по AgentUserId), сохраняются при выходе

Реестр методов

Route-префикс области — /api/v1/me/. Все методы — self-действия (UserId из claim sub).

#МетодRouteFeature groupPermissionДокумент
1POST/api/v1/me/agency-membership/leaveagent-membershipauthenticated (self)leave-agency.md
2POST/api/v1/me/become-investoragent-membershipauthenticated (self)become-investor.md

Модель актора и доступ (общий дом)

ПроверкаЗначение
Actor typeUser — сам агент (Bearer JWT, UserId из sub)
Authauthenticated; операции self-scoped — актор меняет только своё членство и свою роль
Authzне требует company-permission: агент распоряжается собственным членством. Исключение — исключение агента руководителем: тот же сценарий выхода, вызванный с правом identity.users.manage (документируется дельтой в leave-agency.md)
Record-levelактивное AgentMembership выбирается по AgentUserId == sub
Tenant isolationна входе не действует (агент/инвестор действует поверх своих кросс-компанийных membership); мутации membership/роли — в scope прежнего Organization

Общий алгоритм развязки членства

Скелет, общий для методов области (метод описывает только дельту):

  1. Контекст и доступ. Операцию выполняет сам агент (UserId из claim sub), self-действие.
  2. Проверка входа и предусловий. Тело обычно пустое; учётка должна быть в статусе Active (иначе IDENTITY_USER_BLOCKED).
  3. Что читаем. Учётка агента; её активное членство AgentMembership по AgentUserId (может отсутствовать у независимого агента); активное назначение роли agent.
  4. Бизнес-правила и переходы. Закрывается членство и/или снимается/перевыпускается роль agent (детали — в документе метода); проставляется actor-stamping. Историческая привязка сделок/лидов/ фиксаций не пересчитывается (снапшоты crm иммутабельны, back-fill запрещён — ADR-0061 п.4).
  5. Что меняется. Обновляются членство, учётка и назначение роли; история членства не удаляется (INV-AM2).
  6. События. Публикуются AgentMembershipChangedKafkaEvent (pin.identity.agent-membership-changed.v1), UserUpsertedKafkaEvent (pin.identity.users.v1), UserAccessChangedKafkaEvent (pin.identity.access.v1). Мутации членства, учётки, назначения и публикация событий — в одном согласованном изменении.
  7. Результат. Модель результата метода (200); при отказе — код ошибки из таблицы ниже.

Интеграционная последовательность и окно согласованности (общий дом)

Что происходит у соседей после развязки членства/роли (эффекты асинхронны, лаг — секунды):

  • crm по AgentMembershipChangedKafkaEvent (Left) убирает агента из активного ростера агентства; историческая привязка сделок/лидов/фиксаций не пересчитывается (снапшоты иммутабельны, back-fill запрещён — ADR-0061 п.4). До применения события агент краткий промежуток ещё виден в прежнем ростере.
  • rewards продолжает начислять по user-centric метрикам (агрегация по AgentUserId) — метрики и достижения переживают выход/смену роли.
  • gateway и потребители прав сбрасывают кэш эффективных прав по UserAccessChangedKafkaEvent; реплики snapshot-полей учётки обновляются по UserUpsertedKafkaEvent (CompanyId = null, Type = Investor при become-investor).
  • notifications уведомляет агента и руководителя по membership-событию.

Порядок гарантирован по ключу UserId (один агент). Все три события — из одного согласованного изменения (либо все зафиксированы, либо ни одного).

Общие коды ошибок области

КодHTTPУсловиеRetry
UNAUTHORIZED401Нет/просрочен JWTno retry
IDENTITY_USER_BLOCKED400user.Status != Activeno retry
IDENTITY_MEMBERSHIP_NOT_ACTIVE404Нет активного членства (leave-agency)no retry
IDENTITY_NOT_AN_AGENT409user.Type != Agent (become-investor)no retry
CONCURRENCY_CONFLICT409Гонка версий с accept/leave вторым запросомretry после перечитки

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