GET /api/public/notifications/settings — Мои настройки уведомлений
Назначение
Авторизованный пользователь читает свои настройки уведомлений
(UserNotificationSettingsEntity) — per-Kind per-Channel
opt-in/out, тихие часы и локаль — для экрана «Уведомления». Возвращаются эффективные настройки: явные
переопределения пользователя, наложенные на дефолты политики по каждому Kind. Owning-контекст —
notifications, feature group settings.
Metadata
| Поле | Значение |
|---|---|
| Сервис/контекст | notifications |
| API area | public (JWT пользователя) |
| Feature group | settings |
| Статус | draft |
| Документ | docs/06-services/notifications/api/public/get-my-notification-settings.md |
Актор и доступ
| Проверка | Значение |
|---|---|
| Actor type | User |
| Auth policy / Permissions | notifications.settings.manage (own) — чтение собственных настроек |
| Record-level | владелец = UserId (актор) |
| Tenant isolation | TenantId = компания пользователя или null (инвестор), из claims |
| Audit | read (не sensitive) |
HTTP-контракт
| Поле | Значение |
|---|---|
| Method | GET |
| Route | /api/public/notifications/settings |
| Success status | 200 |
| Idempotency header | не применяется |
| Correlation | сквозной trace через заголовок traceparent |
Входные данные / параметры запроса
| Поле | Источник | Тип | Обязательность | Валидация / Ограничения | Безопасность |
|---|---|---|---|---|---|
UserId | identity claims (JWT sub) | Guid | Да | не Guid.Empty | владелец записи |
TenantId | identity claims | Guid? | Нет | компания или null | tenant scope |
Модель ответа NotificationSettingsModel
Проекция UserNotificationSettingsEntity.
| Поле | Тип | Обязательность | Источник | Masking | Описание |
|---|---|---|---|---|---|
Locale | string | Да | Settings.Locale | — | Предпочитаемая локаль. |
GlobalMute | bool | Да | Settings.GlobalMute | — | Полное «тихо» (кроме Critical). |
QuietHours | QuietHoursModel? | Нет | Settings.QuietHours | — | Окно тишины ({ Start, End, TimeZoneId }) или null. |
Preferences | IReadOnlyList<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 |
|---|---|---|---|---|
UNAUTHENTICATED | 401 | нет/невалидный 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
401UNAUTHENTICATED.
Обратные ссылки
Автоссылки: где используется этот документ.
- Домен (CQRS) (1): Entity / Aggregate: UserNotificationSettingsEntity
- API (1): PUT /api/public/notifications/settings — Обновить мои настройки уведомлений
- Use Cases (1): UC-NTF-001. Пользователь настраивает уведомления
- index.md (1): Notifications Service
- registries (1): Реестр API-методов PIN
Связанные документы
- Сущность: user-notification-settings.md; обновление — update-my-notification-settings.md; README контекста.