Добавлены уведомления
This commit is contained in:
@@ -21,6 +21,8 @@ HAN Chat - приложение для мигрантов, где стартов
|
||||
- Вложения чата MVP: **только изображения и PDF** — см. [`arch-04-settings-and-content.md`](arch-04-settings-and-content.md), «Разрешённые типы файлов чата».
|
||||
- SMS OTP вводится поэтапно: до production rollout действует явный mock (`KEYCLOAK_OTP_MOCK_ENABLED=true`); целевой real mode — Keycloak генерирует/локально проверяет OTP и создаёт durable order в `sms-service`, а worker асинхронно вызывает i-Digital Direct. Контракт и gates — [`module-11-idgtl-sms.md`](../modules/module-11-idgtl-sms.md).
|
||||
- Популярный вопрос при выборе **автоматически отправляется как сообщение**; если пользователь не авторизован — сначала согласия и OTP, затем отправка.
|
||||
- Notification Center v1 использует два контура: G — общие read-only гостевые кампании, P — персональные уведомления с состоянием в App DB. Виды, CTA, кнопки и палитра задаются каталогом данных.
|
||||
- Инструкция `install_app` всегда открывается во внешней новой вкладке; iframe/модалка для неё не используется.
|
||||
- Перечень таблиц и миграций App DB проектирует модуль `database` (и владельцы схем других сервисов); arch фиксирует только **разделение схем** PostgreSQL и контракты между сервисами.
|
||||
|
||||
## Пользовательские сценарии
|
||||
@@ -44,6 +46,7 @@ HAN Chat - приложение для мигрантов, где стартов
|
||||
- Keycloak: identity provider, OTP-only авторизация по номеру телефона.
|
||||
- SMS Service: internal durable order API, шаблоны и бессрочный журнал SMS; отдельный worker вызывает i-Digital Direct, callback обновляет только журнал.
|
||||
- api-backend: Python-приложение с REST API, realtime-доставкой сообщений и бизнес-логикой.
|
||||
- Notification producers: сервисы приватной сети, создающие/отменяющие персональные уведомления через Internal API с отдельным Bearer token на `source`; `producer_test` используется только для smoke API.
|
||||
- Nginx Reverse Proxy: единая публичная точка входа, HTTPS termination и маршрутизация на Keycloak/API/frontend web/Bitrix24.
|
||||
- Message Safety Service: отдельный сервис проверки входящих сообщений; вызов из API → `200 allow` | `403 deny` | `203 pending` + `task_id` (при `203` api-backend синхронно поллит task до финального вердикта, без очереди анализа на api-backend).
|
||||
- Bitrix24 Local App: локальное приложение, custom connector `han_mobile_app` для Bitrix24 Open Lines: чат, OAuth, webhook-события, маппинг `dialog_id` ↔ `bitrix_chat_id`.
|
||||
@@ -186,6 +189,9 @@ Frontend не должен:
|
||||
- circuit breaker + timeout budget на вызовы `message-safety` и `bitrix-local-app` (I2);
|
||||
- auth-aware rate limits для сообщений, пользовательских и сервисных операций;
|
||||
- аудит пользовательских действий;
|
||||
- публичный каталог/гостевые кампании, JWT API Notification Center и Internal Create/Cancel; дедупликацию по бессрочной паре `(source, external_id)`;
|
||||
- применение каталога уведомлений без ветвления по `notification_type`, пользовательские действия, документы и события `notification.created|updated|closed`;
|
||||
- expire job и очистку upload drafts. При скрытии TTL задаёт `date_expired` только если оно отсутствует; существующая дата не меняется;
|
||||
- единые ошибки и валидацию входных данных.
|
||||
|
||||
### Bitrix24 Local App
|
||||
@@ -458,11 +464,11 @@ api-backend не решает, sync или async нужна проверка в
|
||||
9. Frontend отображает сообщение оператора в чате.
|
||||
10. При получении от `bitrix-local-app` доменного события `dialog.closed` (Bitrix24 `ONIMCONNECTORDIALOGFINISH`) API переводит `Dialog.status` в `closed`.
|
||||
|
||||
## Документы компании (post-MVP)
|
||||
## Документы компании
|
||||
|
||||
Доставка документов из Bitrix24 в приложение **не входит в MVP** — см. [`!Backlog.md`](../../HAN_chat/!Backlog.md), п. 9.
|
||||
Notification Center v1 регистрирует переданные продюсером объекты `han-chat-documents` в реестре `documents` и связывает их с уведомлением. Это первый действующий канал наполнения будущего общего блока профиля; доставка из Bitrix24 остаётся вне scope.
|
||||
|
||||
В MVP блок профиля «Документы» и API `GET /api/v1/me/documents` зарезервированы; список может быть пустым. Контракт endpoint — в [`arch-02-api-contracts.md`](arch-02-api-contracts.md).
|
||||
Скачивание выполняется owner-only по короткому presigned GET с audit. Для вида с `hide_on_document_download=true` первое скачивание **любого** связанного документа атомарно скрывает уведомление; последующие скачивания не меняют состояние. Если `date_expired` уже задано, оно сохраняется; TTL скрытия устанавливает дату только при её отсутствии.
|
||||
|
||||
## Профиль клиента
|
||||
|
||||
@@ -519,6 +525,7 @@ App DB — **локальный кэш** для UI. Двусторонний syn
|
||||
- Путь входит в `/api/*`; отдельный location `/realtime/*` в nginx **не** нужен.
|
||||
- Fallback: polling `GET /api/v1/dialogs/{dialog_id}/messages?after=...`.
|
||||
- События: новое сообщение, смена `delivery_status` / `safety_status`, смена `Dialog.status`.
|
||||
- Подписка расширена опциональным `notifications` (default `false`); канал пользователя передаёт `notification.created`, `notification.updated`, `notification.closed`, включая эхо инициатору. После reconnect источник истины — REST.
|
||||
|
||||
## Принципы безопасности
|
||||
|
||||
|
||||
Reference in New Issue
Block a user