GET /api/v1/developers/lookup/{banks,hoteliers} — Lookup справочников банков/отельеров
Назначение
Консолидированный документ 4 read-only lookup-операций над платформенными справочниками
BankEntity и HotelierEntity: список и карточка по id
на каждый справочник. Даёт застройщику (area developers) и агенту (area agents) справочники для подстановки
при оформлении финансирования проекта (эскроу/ипотечные банки в ProjectFinancingDocument, INV-PRJ-7) и
сделок (банк эскроу-счёта в crm; отельер апарт-отеля в карточке проекта). Только чтение активных записей
(название + лого) с поиском по имени и пагинацией. Наполнение справочников — Admin API
(banks-crud.md, hoteliers-crud.md), не здесь.
Area developers и agents обслуживаются одной и той же логикой: различие — только маршрут (/developers/…
vs /agents/…) и авторизационная policy эндпойнта (см. «Актор и доступ»).
Metadata
| Поле | Значение |
|---|---|
| Сервис/контекст | chessboard |
| API area | developers (зеркалируется в agents) |
| Feature group | references |
| Статус | draft |
| Документ | docs/06-services/chessboard/api/developers/references-lookup.md |
Актор и доступ
| Проверка | Значение |
|---|---|
| Actor type | User — менеджер застройщика (developers area) или агент (agents area) |
| Auth policy / Permissions | chessboard.references.lookup (единый permission для обеих area; policy эндпойнта различает area — permission.md) |
| Scope (RBAC) | платформа — справочники платформенные, видимость решается permission-ом, не tenant-scope |
| Tenant isolation | не применяется — BankEntity/HotelierEntity платформенные (ADR-0052 п.3); tenant актора на выборку не влияет |
| Audit | read (не sensitive) — публичные данные (название/лого), access-audit не пишется |
HTTP-контракт
| Поле | Значение |
|---|---|
| Method | GET (все 4) |
| Routes (developers) | /api/v1/developers/lookup/banks, /api/v1/developers/lookup/banks/{bankId}, /api/v1/developers/lookup/hoteliers, /api/v1/developers/lookup/hoteliers/{hotelierId} |
| Routes (agents mirror) | те же пути с префиксом /api/v1/agents/lookup/… |
| Success status | 200 (список — всегда 200, в т.ч. пустой; by-id — 200 при найденной активной записи) |
| Correlation | сквозной trace через заголовок traceparent |
Входные данные / параметры запроса
Списочные запросы (banks / hoteliers):
| Поле | Источник | Тип | Обязательность | Валидация / Ограничения | Безопасность |
|---|---|---|---|---|---|
Search | query | string? | Нет | trim; 0..256; фильтр по Name (case-insensitive contains) | — |
Paging | query | PagingQuery | Да | Page >= 1 (default 1); PageSize 1..100 (default 20) | — |
By-id запросы (bank / hotelier):
| Поле | Источник | Тип | Обязательность | Валидация / Ограничения | Безопасность |
|---|---|---|---|---|---|
BankId / HotelierId | route | Guid | Да | != Guid.Empty (иначе VALIDATION_FAILED); существование и активность — на выборке | — |
TenantId в запрос не входит (платформенный справочник). Сортировка списков — по Name (возр.), фиксирована
на сервере (клиент порядок не задаёт).
Модель ответа ReferenceLookupItem
Проекция сущности справочника; дом полей — bank.md / hotelier.md, здесь только выдаваемая дельта.
| Поле | Тип | Обязательность | Источник | Masking | Описание |
|---|---|---|---|---|---|
Id | Guid | Да | BankEntity.Id / HotelierEntity.Id | — | Идентификатор записи справочника (подставляется в Financing/сделку). |
Name | string | Да | .Name | — | Название банка/отельера. |
LogoFileId | Guid? | Нет | .LogoFileId | — | Файл логотипа; выдача presign-ссылки — граница storage/CDN (здесь только FileId). |
Списочный контейнер — постраничный: Items: IReadOnlyList<ReferenceLookupItem>, TotalCount: long,
Page: int, PageSize: int. Служебные поля (CreatedAt, Version, DeletedAt, аудит) наружу не выдаются.
Предусловия
- Пользователь авторизован (developers или agents area); у актора есть permission
chessboard.references.lookup. - Справочники
BankEntity/HotelierEntityнаполняются администратором платформы (Admin API); lookup только читает активные (DeletedAt == null) записи. - Полученный
Idиспользуется вызывающими сценариями как ссылка: банк — вProjectFinancingDocument(INV-PRJ-7) и в эскроу-счёте сделкиcrm; отельер — вProject.HotelierId. Актуальность имени/лого на стороне потребителя обеспечивается повторным lookup (справочник меняется редко).
Алгоритм
Ветвление: [L] — списочные запросы, [B] — карточка по id. Операция read-only, доменных событий не публикует.
- Контекст и доступ. Операцию выполняет
Userс permissionchessboard.references.lookup(проверяется до чтения). Справочники платформенные — tenant-проверок нет. - Проверка входа.
[L]:Searchдлина0..256;Paging.Page >= 1,PageSize ∈ 1..100— иначеVALIDATION_FAILED;[B]:BankId/HotelierId != Guid.Empty; существование и активность — на выборке (шаг 3).
- Выборка. Архивные записи исключены фильтром
DeletedAt == null(INV-BNK-2 / INV-HTL ArchiveKeepsReferences).[L]: страница активных записей по фильтру имени (Search), сортировка поName. Пустой результат — валиден (не ошибка).[B]: запись по id; отсутствие (нет записи или она архивирована) — ожидаемый бизнес-исход →CHESSBOARD_BANK_NOT_FOUND/CHESSBOARD_HOTELIER_NOT_FOUND(404). Поля —Id,Name,LogoFileId.
- Результат.
[L]— постраничный список →200;[B]— карточка →200(или*_NOT_FOUND→404).
Диаграмма
Побочные эффекты
| Тип | Детали |
|---|---|
| Кэш | опц. кэширование TTL 60 c по ключу chessboard:lookup:{banks|hoteliers}:{search}:{page} (справочник меняется редко); presign логотипа — отдельный вызов storage/CDN на стороне клиента по LogoFileId |
Ошибки и failure modes
| Код | HTTP status | Условие | Сообщение | Retry |
|---|---|---|---|---|
VALIDATION_FAILED | 400 | [L] PageSize/Page вне диапазона, Search > 256; [B] Id == Guid.Empty | «Проверьте параметры запроса» | no retry |
CHESSBOARD_BANK_NOT_FOUND | 404 | [B] банк не найден или архивирован (DeletedAt != null) | «Банк не найден» | no retry |
CHESSBOARD_HOTELIER_NOT_FOUND | 404 | [B] отельер не найден или архивирован | «Отельер не найден» | no retry |
FORBIDDEN | 403 | нет permission chessboard.references.lookup | «Недостаточно прав» | no retry |
Пустой список — не ошибка: 200 с Items = [], TotalCount = 0.
Acceptance Criteria
- Список банков. Given непустой активный справочник банков; When
GET .../lookup/banks?search=<имя>&page=1; Then200, постраничный список активных банков, отсортированный поName, поляId/Name/LogoFileId. - Пустой список. Given
Searchбез совпадений или пустой справочник; When список; Then200,Items = [],TotalCount = 0(не ошибка). - Карточка по id. Given существующий активный
bankId; WhenGET .../lookup/banks/{bankId}; Then200с карточкой; для отельеров симметрично. - Архивированная запись. Given
bankIdархивирован (DeletedAt != null) или не существует; When by-id; Then404CHESSBOARD_BANK_NOT_FOUND(для отельеров —CHESSBOARD_HOTELIER_NOT_FOUND). - Пустой id. Given
bankId == Guid.Empty; When by-id; Then400VALIDATION_FAILED. - Agents-зеркало. Given тот же запрос по маршруту
/api/v1/agents/lookup/…с агентской policy; When запрос; Then результат идентичен developers-области (общая логика). - Нет права. Given нет
chessboard.references.lookup; When любой запрос; Then403FORBIDDEN.
Совместимость и наблюдаемость
- Проекция
ReferenceLookupItemминимальна (Id/Name/LogoFileId); новые optional поля — additive без breaking. Удаление/переименование/смена типа поля или маршрута — breaking (migration + rollout). - Agents area — контрактная копия developers: изменения проекции применяются к обеим сразу.
- Logs:
references-lookup requested(area, kind=bank|hotelier,searchприсутствие,resultCount); metrics:chessboard_references_lookup_total{area,kind,mode}, latency p95; traces — OTel (traceparent); dashboardchessboard-overview; runbook — не требуется (read-only, деградация = пустой/404-ответ).
Обратные ссылки
Автоссылки: где используется этот документ.
- Домен (CQRS) (2): Entity / Aggregate: BankEntity, Entity / Aggregate: HotelierEntity
- API (4): Admin CRUD банков — создание / список / карточка / правка / архив / lookup, Admin CRUD отельеров (создание / список / карточка / правка / архив / lookup) — область admin, Chessboard API — реестр операций областей Developers и Admin, GET /api/v1/developers/projects/{projectId} — Карточка проекта застройщика
- Use Cases (1): UC-CHS-007. Администратор ведёт справочники банков и отельеров
- registries (1): Реестр API-методов PIN
Связанные документы
- Сущности (дом полей): bank.md, hotelier.md;
использование в проекте — project.md (
Financing,HotelierId). - Admin CRUD (наполнение справочников): banks-crud.md, hoteliers-crud.md.
- Permission
chessboard.references.lookup: permission.md. - Карта операций и area: README.md.