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

GET /api/v1/handbook/{countries,regions,cities,currencies,languages} — Публичный lookup справочников

Назначение

Консолидированный документ пяти read-only lookup-операций над справочниками платформы: страны, регионы, города, валюты, языки. Отдаёт фронтам (включая гостя до регистрации) неархивные записи для подстановки в фильтры каталога, гео-поля форм и денежные/языковые селекторы.

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

Источник данных

Наполнение справочников — синк Talent Handbook (ADR-0063); ведения данных через это API нет.

Metadata

ПолеЗначение
Сервис/контекстhandbook
API areapublic
Feature grouplookup
Статусdraft
Документdocs/06-services/handbook/api/public/lookup-references.md

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

ПроверкаЗначение
Actor typeAnonymous — авторизация не требуется (гость видит фильтры каталога до регистрации)
Auth policy / Permissionsnone
Scope (RBAC)не применяется — справочники платформенные, публичные
Tenant isolationне применяется
Auditне пишется (публичные не-PII данные); защита от злоупотреблений — кэшируемость ответов + платформенный rate limit анонимных запросов

HTTP-контракт

ПолеЗначение
MethodGET (все 5)
Routes/api/v1/handbook/countries · /api/v1/handbook/regions?countryId= · /api/v1/handbook/cities?countryId=&regionId=&search=&page=&pageSize= · /api/v1/handbook/currencies · /api/v1/handbook/languages
Success status200 (в т.ч. пустой список)
КэшированиеCache-Control: public, max-age=300 на всех ответах — данные меняются редко, устаревание до 5 минут допустимо
Correlationсквозной trace через заголовок traceparent

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

Страны, валюты, языки — без параметров (выдаются целиком: десятки строк).

Регионы:

ПолеИсточникТипОбязательностьВалидация / Ограничения
countryIdqueryshortДастрана, регионы которой запрашиваются; несуществующий id → пустой список (не ошибка)

Города (единственный постраничный справочник — тысячи строк):

ПолеИсточникТипОбязательностьВалидация / Ограничения
countryIdqueryshort?Нетфильтр по стране; несуществующий id → пустой список
regionIdquerylong?Нетфильтр по региону; сочетается с countryId конъюнктивно
searchquerystring?Нетtrim; если задан — 2..256 символов; подстрока имени, case-insensitive
pagequeryintНет (default 1)>= 1
pageSizequeryintНет (default 50)1..200

Сортировка всех выдач — по Name (возр., case-insensitive), при равенстве — по Id; фиксирована на сервере, клиент порядок не задаёт.

Модели ответа

Проекции реплик; дома полей — ../../domain/, здесь только выдаваемая дельта. Служебные поля (IsArchived, ReplicaVersion/LastEventAt, штампы) наружу не выдаются — в выдаче только неархивные записи (INV-HND-5). Непагинированные списки — контейнер { Items: [...] }; города — постраничный контейнер { Items, Page, PageSize, TotalCount }.

CountryLookupItem (/countries)

ПолеТипОбязательностьИсточникОписание
IdshortДаCountryEntity.IdИдентификатор страны (подставляется в CountryId контрактов).
NamestringДаCountryEntity.FullNameDisplay-имя (конвенция Name = FullName, country.md).
ShortNamestring?Нет.ShortNameКраткое название («Россия»).
IsoCode2stringДа.IsoCode2ISO 3166-1 alpha-2 (RU) — флаги, внешние интеграции.
IsoCode3stringДа.IsoCode3ISO 3166-1 alpha-3 (RUS).
DefaultCurrencyIdshort?Нет.DefaultCurrencyIdВалюта страны по умолчанию.
DefaultLanguageIdshort?Нет.DefaultLanguageIdЯзык страны по умолчанию.

RegionLookupItem (/regions)

ПолеТипОбязательностьИсточникОписание
IdlongДаRegionEntity.IdИдентификатор региона.
CountryIdshortДа.CountryIdСтрана региона (эхо фильтра).
NamestringДа.NameНазвание региона («Самарская область»).

CityLookupItem (/cities)

ПолеТипОбязательностьИсточникОписание
IdlongДаCityEntity.IdИдентификатор города.
CountryIdshortДа.CountryIdСтрана города.
RegionIdlong?Нет.RegionIdРегион города; null — город вне региона (напр., федерального значения).
NamestringДа.NameНазвание города («Самара»).

CurrencyLookupItem (/currencies)

ПолеТипОбязательностьИсточникОписание
IdshortДаCurrencyEntity.IdИдентификатор валюты (подставляется в CurrencyId контрактов).
NamestringДа.NameНазвание («Российский рубль»).
IsoCodestringДа.IsoCodeКод ISO-4217 (RUB).
Signstring?Нет.SignЗнак валюты («₽»).

LanguageLookupItem (/languages)

ПолеТипОбязательностьИсточникОписание
IdshortДаLanguageEntity.IdИдентификатор языка.
NamestringДа.NameНазвание («Русский»).
IsoCode2stringДа.IsoCode2ISO 639-1 (ru).
IsoCode3stringДа.IsoCode3ISO 639-2/3 (rus).
FlagIsoCode2string?Нет.FlagIsoCode2ISO-код страны для отрисовки флага языка.

Алгоритм

Операции read-only, событий не публикуют, данных не меняют.

  1. Проверка входа. Регионы: countryId задан — иначе VALIDATION_FAILED. Города: page >= 1, pageSize ∈ 1..200, search (если задан) после trim — 2..256 символов — иначе VALIDATION_FAILED. Остальные операции параметров не имеют.
  2. Выборка. Только неархивные записи справочника (IsArchived = false, INV-HND-5); фильтры — конъюнкция заданных параметров (countryId, regionId, подстрока search case-insensitive по имени). Несуществующее значение фильтра (нет такой страны/региона) — пустой результат, не ошибка. Сортировка — по имени.
  3. Результат. 200 + контейнер Items (города — с Page/PageSize/TotalCount); заголовок Cache-Control: public, max-age=300. Пустой список валиден. Архивная запись в выдачу не попадает — резолв архивных по id доступен только внутренним сервисам (resolve-references.md).

Ошибки и failure modes

КодHTTP statusУсловиеСообщениеRetry
VALIDATION_FAILED400регионы: countryId не задан или не является числом«Проверьте параметры запроса»no retry
VALIDATION_FAILED400города: page < 1 либо pageSize вне 1..200«Проверьте параметры запроса»no retry
VALIDATION_FAILED400города: search задан и после trim короче 2 символов либо длиннее 256«Поисковая строка — от 2 до 256 символов»no retry
Пустой результат — не ошибка

200 c Items = [] (у городов — TotalCount = 0). 404 в списочных операциях не используется.

Acceptance Criteria

  • Страны. Given справочник стран с архивной записью; When GET /api/v1/handbook/countries; Then 200, Items содержит только неархивные страны, отсортированные по имени, с полями Id/Name/ShortName/IsoCode2/IsoCode3/DefaultCurrencyId/DefaultLanguageId; архивной страны в выдаче нет.
  • Регионы по стране. Given страна countryId = 1 с регионами; When GET /regions?countryId=1; Then 200 и только неархивные регионы этой страны.
  • Регионы без страны. Given запрос без countryId; When GET /regions; Then 400 VALIDATION_FAILED.
  • Города: дефолтная страница. Given тысячи городов; When GET /cities?countryId=1; Then 200, Page = 1, PageSize = 50, TotalCount = числу неархивных городов страны.
  • Города: поиск подстрокой. Given город «Самара»; When GET /cities?search=мар; Then 200, «Самара» в выдаче (case-insensitive подстрока).
  • Города: короткий поиск. Given search=с (1 символ); When запрос; Then 400 VALIDATION_FAILED.
  • Города: предел страницы. Given pageSize=201; When запрос; Then 400 VALIDATION_FAILED; Given pageSize=200 — Then 200.
  • Несуществующий фильтр. Given countryId=999 отсутствует в справочнике; When GET /cities?countryId=999; Then 200, Items = [], TotalCount = 0 (не ошибка).
  • Кэшируемость. Given любой успешный ответ; Then заголовок Cache-Control: public, max-age=300.
  • Анонимный доступ. Given запрос без токена авторизации; When любая из 5 операций; Then 200 (авторизация не требуется).

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

Breaking changes

Новые optional-поля lookup-моделей — additive без breaking; удаление/переименование/смена типа поля или маршрута — breaking (согласованный rollout с фронтами). Состав выдачи стабилен: только неархивные записи — инвариант контракта (INV-HND-5), а не деталь реализации.

  • Клиент обязан переживать рост числа записей (новые страны/валюты источника появляются без изменения контракта).
  • Logs: handbook-lookup requested (kind = country|region|city|currency|language, наличие фильтров, resultCount) — без параметров поиска в открытом виде не требуется, PII нет; metrics: handbook_lookup_total{kind}, latency p95; traces — OTel (traceparent); dashboard handbook-overview. Runbook не требуется: read-only, деградация = устаревшая (≤ max-age) или пустая выдача.

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

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

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