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

GET /api/public/notifications/settings — Мои настройки уведомлений

Назначение

Авторизованный пользователь читает свои настройки уведомлений (UserNotificationSettingsEntity) — per-Kind per-Channel opt-in/out, тихие часы и локаль — для экрана «Уведомления». Возвращаются эффективные настройки: явные переопределения пользователя, наложенные на дефолты политики по каждому Kind. Owning-контекст — notifications, feature group settings.

Metadata

ПолеЗначение
Сервис/контекстnotifications
API areapublic (JWT пользователя)
Feature groupsettings
Статусdraft
Документdocs/06-services/notifications/api/public/get-my-notification-settings.md

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

ПроверкаЗначение
Actor typeUser
Auth policy / Permissionsnotifications.settings.manage (own) — чтение собственных настроек
Record-levelвладелец = UserId (актор)
Tenant isolationTenantId = компания пользователя или null (инвестор), из claims
Auditread (не sensitive)

HTTP-контракт

ПолеЗначение
MethodGET
Route/api/public/notifications/settings
Success status200
Idempotency headerне применяется
Correlationсквозной trace через заголовок traceparent

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

ПолеИсточникТипОбязательностьВалидация / ОграниченияБезопасность
UserIdidentity claims (JWT sub)GuidДане Guid.Emptyвладелец записи
TenantIdidentity claimsGuid?Неткомпания или nulltenant scope

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

Проекция UserNotificationSettingsEntity.

ПолеТипОбязательностьИсточникMaskingОписание
LocalestringДаSettings.LocaleПредпочитаемая локаль.
GlobalMuteboolДаSettings.GlobalMuteПолное «тихо» (кроме Critical).
QuietHoursQuietHoursModel?НетSettings.QuietHoursОкно тишины ({ Start, End, TimeZoneId }) или null.
PreferencesIReadOnlyList<PreferenceModel>Даэффективные (дефолты + явные)Список { Kind, Channel, IsEnabled, IsDefault }.

PreferenceModel — вложенная модель { Kind, Channel, IsEnabled, IsDefault } (IsDefault = true, если значение взято из дефолта политики, а не из явного переопределения). QuietHoursModel{ Start (TimeOnly), End (TimeOnly), TimeZoneId }.

Алгоритм

Операцию выполняет авторизованный пользователь (UserId из JWT; нет валидного JWT → UNAUTHENTICATED); доступ — только к собственным настройкам. Если записи настроек у пользователя ещё нет — это не ошибка: возвращается эффективная модель, построенная из дефолтов политики по всем Kind/Channel (IsDefault = true). Если запись есть — её явные Preferences накладываются поверх дефолтов, и возвращается результирующая эффективная модель.

Ошибки и failure modes

КодHTTP statusУсловиеСообщениеRetry
UNAUTHENTICATED401нет/невалидный JWT«Требуется авторизация»no retry

Отсутствие записи настроек — не ошибка: возвращается эффективная модель из дефолтов.

Формирование эффективной модели

  • Preferences в ответе — эффективные: для каждой пары (Kind, Channel) берётся явное переопределение пользователя (IsDefault = false), а при его отсутствии — дефолт политики для Kind (IsDefault = true). Так фронт видит полную решётку Kind × Channel без домысливания дефолтов.
  • Виды Urgency = Critical показываются включёнными независимо от переопределений — их opt-out игнорируется (INV-UNS-4); клиент вправе отобразить их как неотключаемые.
  • GlobalMute = true не стирает Preferences, а сигнализирует, что доставляются только Critical; UI показывает это как глобальный тумблер поверх решётки.
  • Отсутствие записи настроек — не ошибка (см. Алгоритм): вся модель строится из дефолтов (IsDefault = true), запись создаётся лишь при первом сохранении (update-my-notification-settings.md).

Пред- и постусловия

  • Предусловие. Пользователь авторизован (валидный JWT); читает только свои настройки.
  • Постусловие. Состояние не меняется (чтение); возвращается эффективная модель на момент запроса.

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

  • Новые поля модели — additive (без breaking change).
  • Logs: settings-read (UserId); metrics: notifications_settings_read_total.

Acceptance criteria

  • Given пользователь без сохранённых настроек, when запрашивает настройки, then 200 с моделью из дефолтов (IsDefault = true во всех Preferences), GlobalMute = false, QuietHours = null.
  • Given пользователь с явными переопределениями, when запрос, then переопределённые пары имеют IsDefault = false, остальные — дефолт; Critical-виды показаны включёнными.
  • Given отсутствует/просрочен JWT, when запрос, then 401 UNAUTHENTICATED.

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

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

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