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

GET /api/investors/me/referral-links/registrations — Обезличенный журнал по всем моим ссылкам (getAllRegistrations)

Назначение

Сводный постраничный журнал регистраций по всем реферальным ссылкам текущего пользователя — единая лента «кто и когда пришёл по моим ссылкам», обезличенная (без ФИО/телефона приглашённого). Питает блок истории регистраций на партнёрской странице /profile/partner (в отличие от get-link-registrations.md — журнала одной конкретной ссылки). Общий конверт и paging-модели — README.md.

Metadata

ПолеЗначение
Сервис/контекстreferral
API areapublic
Feature groupreferral-registrations
Статусapproved
Документdocs/06-services/referral/api/public/get-all-registrations.md

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

ПроверкаЗначение
Actor typeUser
Auth policy / Permissionsauthenticated; permission referral.registrations.view-self (каталог — permission.md)
Scope (RBAC)self-service
Record-levelфильтр ReferrerUserId == actor.UserId по денормализованному владельцу журнала — чужие записи в выборку не попадают (нет user enumeration)

HTTP-контракт

ПолеЗначение
MethodGET
Route/api/investors/me/referral-links/registrations?Offset&Take
Success status200
Correlationсквозной trace через заголовок traceparent

Маршрутизация: статический сегмент registrations имеет приоритет над route-параметром {id} того же уровня (правило маршрутизации) — конфликта нет (README.md, раздел «Реестр операций»).

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

ПолеИсточникТипОбязательностьВалидация / ОграниченияБезопасность
UserIdidentity claims (sub)GuidДавалидный токенrecord-level фильтр ReferrerUserId; 401 при отсутствии
OffsetqueryintДаmin 0, max 2147483647
TakequeryintДаmin 1, max 1000ограничение размера выдачи

Body и route-параметры отсутствуют. Paging-ограничения — единый дом README.md («Query-параметры paging»).

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

Контейнер offset-paging; тот же результат, что у get-link-registrations.md.

ПолеТипОбязательностьИсточникMaskingОписание
metaPagingResultMetaДаcomputedtotal / take / offsetREADME.md.
itemsReferralRegistrationItem[]ДаprojectionобезличеноЗаписи журнала, registeredAt desc.

Item-модель принадлежит операции-владельцу getLinkRegistrations; здесь приведена как выход сводного журнала. Поля — проекция сущности referral-registration.md, обезличенная (только referredInvestorId, без ФИО/телефона).

ПолеТипОбязательностьИсточник (ReferralRegistrationEntity)MaskingОписание
registeredAtstring (ISO 8601)ДаRegisteredAtМомент регистрации/привязки; ключ сортировки (desc).
referralLinkIdstring (Guid)ДаReferralLinkIdПо какой из ссылок владельца пришёл пользователь.
linkUrlstringДаLinkUrl (денормализация на момент записи)Исторический slug ссылки — показывается даже после её переименования/удаления.
referredInvestorIdstring (Guid)ДаReferredUserIdPII-минимизация: только idПриглашённый пользователь. ФИО/телефон — только admin-выдача (referral.registrations.view-all).
registrationTypestring (enum ReferralRegistrationType: Initial | Rebind)ДаRegistrationTypeТип записи журнала (дом enum — referral-registration.md).

ReferrerUserId в выдачу не включается — он тождественно равен актору (сводный журнал именно его ссылок).

Алгоритм

Обезличенное фильтрованное чтение. Пользователь авторизован, требуется permission referral.registrations.view-self (иначе FORBIDDEN); paging-параметры проверяются на диапазон (иначе ValidationError). Возвращается страница записей журнала, отобранных по денормализованному владельцу (ReferrerUserId == UserId) и упорядоченных по дате регистрации RegisteredAt desc, при равных значениях — по Id (стабильный tie-break; правило порядка/консистентности — README.md); в выборку попадают записи обоих типов — Initial и Rebind. Журнал append-only: исторические страницы стабильны, новые записи появляются только в «голове» ленты. Обезличивание — на уровне проекции: ФИО/телефон приглашённого не отдаются (ReferralUserReplica не присоединяется). meta содержит полное число записей под фильтром, размер и смещение страницы.

Ошибки и failure modes

КодHTTP statusУсловиеСообщениеRetry
ValidationError400Offset/Take вне диапазонаперечень полейисправить параметры
UNAUTHORIZED401Нет/просрочен access-токен«Требуется авторизация»retry после refresh-token
FORBIDDEN403Нет permission referral.registrations.view-self«Недостаточно прав»no retry

Доменных REFERRAL_*-ошибок нет: операция не резолвит сущности по id (нет 404) и не меняет состояние.

Постусловие

Состояние не изменяется (обезличенное чтение): журнал, ссылки и реплика не трогаются, PII не отдаётся, события не публикуются.

Acceptance Criteria

  • Given авторизованный пользователь с записями журнала по его ссылкам, When GET …/referral-links/registrations, Then 200 со страницей ReferralRegistrationItem (registeredAt desc), обезличенной (только referredInvestorId, без ФИО/телефона), включающей записи обоих типов Initial и Rebind.
  • Given у пользователя нет ни одной регистрации, When запрос, Then 200 с meta.total = 0, items = [].
  • Given в выборку теоретически попадают чужие записи, When запрос, Then они отфильтрованы по ReferrerUserId == actor.UserId (нет user enumeration); ReferrerUserId в выдачу не включается.
  • Given актор без referral.registrations.view-self, When запрос, Then 403 FORBIDDEN; без токена — 401; Offset/Take вне диапазона — 400 ValidationError.
  • Given записи с равным registeredAt, When постраничный обход, Then порядок стабилен по вторичному ключу Id (append-only журнал — исторические страницы не смещаются, README.md).

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

  • Контракт стабилен. Новые optional поля item-а — additive; удаление/переименование/смена типа registeredAt/referralLinkId/linkUrl/referredInvestorId/registrationType — breaking (migration + rollout). Раскрытие ФИО/телефона в этой public-выдаче запрещено (обезличенность — инвариант безопасности, README.md, «Общие правила безопасности»).
  • Unknown registrationType при чтении — не возникает (значения пишет referral); внешние потребители трактуют неизвестное строковое значение как проигнорированное (unknown-enum handling).
  • Logs: UserId, размер страницы, длительность запроса (без PII); metrics: referral_all_registrations_get_total{result}, histogram длительности; traces — сквозной trace через traceparent. Dashboard — referral-overview; алерт на p95 > 300 мс (SLO public API, README.md).

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

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

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