GET /api/investors/me/referral-links — Список моих реферальных ссылок (getMyReferralLinks)
Назначение
Постраничный список собственных реферальных ссылок текущего пользователя с числом регистраций по
каждой (registrationsCount). Основная таблица страницы /profile/partner (управление каналами:
создать/изменить/удалить, метрики). Общий конверт и paging-модели — README.md.
| Поле | Значение |
|---|
| Сервис/контекст | referral |
| API area | public |
| Feature group | referral-links |
| Статус | approved |
| Документ | docs/06-services/referral/api/public/get-my-referral-links.md |
Актор и доступ
| Проверка | Значение |
|---|
| Actor type | User |
| Auth policy / Permissions | authenticated; permission referral.links.view-self |
| Scope (RBAC) | self |
| Record-level | фильтр OwnerUserId == UserId — чужие ссылки в выборку не попадают |
HTTP-контракт
| Поле | Значение |
|---|
| Method | GET |
| Route | /api/investors/me/referral-links |
| Success status | 200 |
| Correlation | сквозной trace через заголовок traceparent |
Входные данные / параметры запроса
| Поле | Источник | Тип | Обязательность | Валидация / Ограничения | Безопасность |
|---|
UserId | identity claims (sub) | Guid | Да | валидный токен | 401 при отсутствии |
Offset | query | int | Да | min 0, max 2147483647 | — |
Take | query | int | Да | min 1, max 1000 | ограничение размера выдачи |
Модель ответа GetMyReferralLinksQueryResult
| Поле | Тип | Обязательность | Источник | Masking | Описание |
|---|
page | ReferralLinkListItemPagingResult | Да | projection | — | Страница: meta (total/take/offset — README.md) + items. |
Модель ReferralLinkListItem (дом item-модели)
| Поле | Тип | Обязательность | Источник | Masking | Описание |
|---|
id | string (Guid) | Да | ReferralLinkEntity.Id | — | Идентификатор ссылки. |
url | string | Да | ReferralLinkEntity.Url | — | Slug. |
description | string? | Нет | ReferralLinkEntity.Description | — | Описание. |
channel | string (enum ReferralChannel) | Да | ReferralLinkEntity.Channel | — | Канал распространения (дом enum — referral-link.md). |
visitsCount | long | Да | ReferralLinkEntity.VisitsCount | — | Число переходов по ссылке. |
createdAt | string (ISO 8601) | Да | ReferralLinkEntity.CreatedAt | — | Момент создания. |
registrationsCount | number (int) | Да | computed (производный — referral-link.md) | — | Число регистраций по ссылке. |
Предусловия и постусловия
- Предусловия. Пользователь авторизован.
registrationsCount производный (COUNT по журналу,
referral-link.md) — свеж с точностью до лага привязки (< 1 мин,
README.md).
- Постусловия. Состояние не меняется (чтение); события не публикуются;
VisitsCount не растёт.
Алгоритм
Тривиальное фильтрованное чтение. Пользователь авторизован, требуется permission
referral.links.view-self (иначе FORBIDDEN); paging-параметры проверяются на диапазон (иначе
ValidationError). Возвращается страница собственных не удалённых ссылок владельца (OwnerUserId == UserId, DeletedAt пусто), упорядоченная по дате создания (свежие сверху), при равенстве CreatedAt
— по Id (детерминированный tie-break: одна и та же ссылка не пропадает и не дублируется между
соседними страницами при Offset/Take-пагинации). Для каждой ссылки подставляется число регистраций
(registrationsCount), недостающее значение трактуется как 0. meta содержит полное число записей
под фильтром, размер и смещение страницы. Смещение за пределы выборки (Offset >= meta.total) — не
ошибка: items пуст, meta.total актуален. Soft-deleted ссылки в выборку не попадают (в отличие от
статистики канала). Чтение не блокирует конкурентную привязку — для registrationsCount допустимо
расхождение на единицы (eventually consistent).
Критерии приёмки
- Given владелец с несколькими не удалёнными ссылками, When запрос первой страницы, Then
200, items упорядочены по createdAt desc, у каждой ссылки заполнен registrationsCount,
meta.total = число всех не удалённых ссылок владельца.
- Given ссылка без регистраций, When запрос, Then её
registrationsCount = 0.
- Given
Offset больше meta.total, When запрос, Then 200 с пустым items и корректным
meta.total (не 404).
- Given
Take вне 1..1000 или Offset < 0, When запрос, Then ValidationError (400).
- Given отсутствует/невалиден токен, When запрос, Then
401.
- Given soft-deleted ссылка владельца, When запрос, Then она в выборку не входит.
- Given у владельца несколько ссылок с одинаковым
createdAt, When последовательный обход
страниц (Offset += Take), Then каждая ссылка встречается ровно один раз (tie-break по Id):
без пропусков и дублей на границах страниц.
Ошибки и failure modes
| Код | HTTP status | Условие | Сообщение | Retry |
|---|
| — (auth) | 401 | Нет/невалиден токен | «Требуется авторизация» | re-login |
ValidationError | 400 | Offset/Take вне диапазона | перечень полей | исправить |
Совместимость и наблюдаемость
- Контракт стабилен. Новые optional поля item-а — additive; удаление/переименование/смена типа
полей — breaking (migration + rollout).
- Logs:
UserId, размер страницы (take/offset) — без PII; metrics:
referral_my_links_requests_total, histogram referral_stats_query_duration_seconds (стоимость —
COUNT регистраций на страницу); traces — сквозной trace через traceparent. Dashboard —
referral-overview; алерт на p95 > 300 мс (SLO public API, README.md).
Обратные ссылки
Автоссылки: где используется этот документ.
- API (10): GET /api/admin/referrals/links — Все реферальные ссылки платформы (admin, getReferralLinks), GET /api/investors/me/referral-links/{id}/registrations — Обезличенный журнал одной ссылки (getLinkRegistrations), GET /api/investors/me/referral-links/lookup — Пагинированный lookup своих ссылок, GET /api/investors/me/referral-links/lookup/{id} — Резолв реф-ссылки по id, GET /api/investors/me/referral-links/registrations — Обезличенный журнал по всем моим ссылкам (getAllRegistrations), GET /api/investors/me/referrer — свой реферер пользователя, GET /api/v1/partner/stats — Партнёрская сводка по каналам, GET /api/v1/referral-links/{referralLinkId}/stats — Статистика одной реферальной ссылки, POST /api/v1/referral-links — Создание реферальной ссылки (с каналом), Referral API — реестр операций и общие контрактные модели
- Use Cases (1): UC-REF-001. Создание реферальной ссылки с каналом и шаринг
- registries (1): Реестр API-методов PIN
Связанные документы