GET /api/developers/v1/ranking-rules — Список правил ранжирования застройщика
Назначение
Возвращает менеджеру застройщика список его правил ранжирования
(DeveloperRankingRule, ranking-rule.md) с контекстом целей
(название проекта/объекта недвижимости из карточек витрины) — экран «Ранжирование» ЛК застройщика:
управление приоритетом отображения своих объектов в рамках своих объектов.
Metadata
| Поле | Значение |
|---|---|
| Сервис/контекст | catalog |
| API area | developers |
| Feature group | ranking |
| Статус | draft |
| Документ | docs/06-services/catalog/api/developers/list-ranking-rules.md |
Актор и доступ
| Проверка | Значение |
|---|---|
| Actor type | User (менеджер застройщика — JWT identity) |
| Auth policy / Permissions | permission catalog.ranking.view в scope организации или группы проектов/проекта (Scoped-RBAC — identity/domain/permission.md) |
| Scope (RBAC) | организация (компания-застройщик) и ниже |
| Tenant isolation | TenantId = CompanyId застройщика из identity claims (ADR-0052); выборка catalog.ranking_rules автоматически режется по TenantId |
HTTP-контракт
| Поле | Значение |
|---|---|
| Method | GET |
| Route | /api/developers/v1/ranking-rules |
| Success status | 200 |
| Idempotency header | не применяется (чтение) |
| Correlation | сквозной trace через traceparent |
Входные данные / параметры запроса
| Поле | Источник | Тип | Обязательность | Валидация / Ограничения | Безопасность |
|---|---|---|---|---|---|
TenantId | identity claims | Guid | Да | Required (= CompanyId застройщика) | tenant isolation |
TargetKind | query | string? (enum RankingTargetKind) | Нет | ∈ {Project, PropertyObject}; null — оба вида | — |
Status | query | string? (enum RankingRuleStatus) | Нет | ∈ {Active, Disabled}; null — все | — |
TargetProjectId | query | Guid? | Нет | != Guid.Empty при заполнении; фильтр «правила одного проекта» (проектное правило + правила объектов недвижимости проекта) | — |
Page | query | int | Нет (default 1) | >= 1 | — |
PageSize | query | int | Нет (default 50) | 1..200 | — |
Модель ответа — пагинированный список RankingRuleListItem
Пагинированный контейнер (Items, TotalCount, Page, PageSize).
Модель RankingRuleListItem
| Поле | Тип | Обязательность | Источник | Masking | Описание |
|---|---|---|---|---|---|
Id | Guid | Да | DeveloperRankingRule.Id | — | Правило. |
TargetKind | string (enum RankingTargetKind) | Да | DeveloperRankingRule.TargetKind | — | Project / PropertyObject. |
TargetId | Guid | Да | DeveloperRankingRule.TargetId | — | Цель. |
TargetName | string | Да | CatalogProjectCard.Name / CatalogPropertyObjectCard.Title (батч-джойн шага 3) | — | Отображаемое имя цели. |
TargetProjectId | Guid | Да | TargetId (Project) / CatalogPropertyObjectCard.ProjectId (PropertyObject) | — | Проект цели (для группировки в UI). |
TargetCardStatus | string (enum PropertyObjectCardStatus/ProjectCardStatus) | Да | карточка цели | — | Видимость цели (правило по Delisted-цели показывается с пометкой). |
Priority | int | Да | DeveloperRankingRule.Priority | — | 0..1000. |
Status | string (enum RankingRuleStatus) | Да | DeveloperRankingRule.Status | — | Active / Disabled. |
UpdatedAt | DateTimeOffset | Да | DeveloperRankingRule.UpdatedAt | — | Последняя правка. |
UpdatedByUserId | Guid? | Нет | UpdatedByUserId ?? CreatedByUserId | — | Автор последней правки. |
Version | long | Да | DeveloperRankingRule.Version | — | Для optimistic-check мутаций. |
Алгоритм
- Контекст и доступ. Актор — менеджер застройщика (JWT + permission
catalog.ranking.view);TenantIdиз claims. Идемпотентность не применяется (чтение). - Проверка входа. enum-значения
TargetKind/Status, границыPage/PageSize→ValidationError. - Что читаем. Правила застройщика по фильтрам (
TargetKind/Status/TargetProjectId) с пагинацией; к выборке автоматически добавляетсяTenantId = CompanyId; приTargetProjectId— проектное правило этого проекта + правила объектов недвижимости этого проекта. ФильтрTargetProjectId, указывающий на чужой/несуществующий проект, режется тем жеTenantIdи даёт пустую страницу (200,Items = []), а не404/403— чужие цели неотличимы от отсутствующих. Сортировка детерминирована и стабильна между страницами:TargetKind,Priority desc,UpdatedAt desc, финальный tie-breakId(иначе правила с равнымиPriority/UpdatedAtдрейфовали бы между страницами при keyset/offset-обходе). Затем батч-загрузка целей (карточки проектов и объектов недвижимости) — дляTargetName/TargetProjectId/TargetCardStatus. - Маппинг. Поля правила → одноимённые поля item-а;
TargetName← название проекта/объекта недвижимости; цель не найдена в карточках (делистинг + retention-очистка) →TargetName = "(объект удалён)",TargetCardStatus = Delisted(правило показывается — застройщик должен видеть «висящее» правило, чтобы удалить его). - Результат. Пагинированный список
RankingRuleListItem(200); нет ни одного правила (у застройщика нет настроек ранжирования либо фильтр сузил до нуля) →200сItems = [],TotalCount = 0(не ошибка); страница за пределамиTotalCount→ пустойItems,TotalCountнеизменен. Freshness — source of truth этого контекста (лага нет).
Диаграмма
Ошибки и failure modes
| Код | HTTP status | Условие | Сообщение | Retry |
|---|---|---|---|---|
ValidationError | 400 | Невалидные enum/paging | Ошибка валидации запроса | no retry |
UNAUTHORIZED | 401 | Нет/просрочен JWT | Требуется авторизация | no retry |
FORBIDDEN | 403 | Нет permission catalog.ranking.view в scope | Доступ запрещён | no retry |
200 с Items = [], TotalCount = 0 — у застройщика нет правил ранжирования либо фильтр сузил выборку
до нуля; сюда же попадает TargetProjectId, указывающий на чужой/несуществующий проект (режется тем же
TenantId — чужая цель неотличима от отсутствующей). Страница за пределами TotalCount — тот же пустой
Items, TotalCount не меняется. 404/403 за отсутствие/чужеродность цели в этой операции не используются.
Совместимость и наблюдаемость
- Новые optional поля item-а — additive; удаление/переименование — breaking (migration + rollout).
- Logs:
ranking-rules-listed(tenantId, фильтры, count); metrics:catalog_developers_operations_total{operation="list-ranking-rules"}, duration; traces: span приёма → span обработки → span обращения к хранилищу; correlation — сквозной trace черезtraceparent. Dashboard catalog-overview.
Обратные ссылки
Автоссылки: где используется этот документ.
- API (5): Catalog Developers API — реестр методов и общие правила области, DELETE /api/developers/v1/ranking-rules/{ruleId} — Удаление правила ранжирования, POST /api/developers/v1/ranking-rules — Создание правила ранжирования, POST /api/developers/v1/ranking-rules/{ruleId}/enable — Включение правила ранжирования, PUT /api/developers/v1/ranking-rules/{ruleId}/priority — Изменение приоритета правила
- registries (1): Реестр API-методов PIN
Связанные документы
- Сущность: ranking-rule.md (дом полей, enum-ы, формула ленты).
- Мутации: create-ranking-rule.md, update-ranking-rule-priority.md, enable-ranking-rule.md, delete-ranking-rule.md.
- ADR-0052 (tenant = компания застройщика).