Реализованы сервисы ВМ2 - проверка сообщений и синхронизация с Б24 (деплой еще без перевода в боевой режим)

This commit is contained in:
mi
2026-08-13 18:52:42 +03:00
parent 5100ba9fc3
commit 99605b1c77
144 changed files with 15295 additions and 1120 deletions
@@ -85,8 +85,8 @@
|---|---|---|---|
| **IdP user** | Keycloak (`keycloak` schema) | Realm user, phone verified, sessions, tokens | Keycloak |
| **UserIdentity** | App DB `user_identities` | Локальный `user_id`, связь `keycloak_sub`, кэш auth-телефона, `last_login_at` | Keycloak для телефона/`sub`; App DB для бизнес-FK |
| **ClientProfile** | App DB `client_profiles` | Кэш полей UI + `bitrix_contact_id` | UI-поля — последнее успешно синхронизированное значение (входящий поток MVP — Bitrix24); auth-телефон инициирует sync, но master телефона — Keycloak |
| **Bitrix Contact** | CRM Bitrix24 | Карточка клиента в CRM | Bitrix24 для CRM-полей; связь через `bitrix_contact_id` / `entity_external_mapping` |
| **ClientProfile** | App DB `client_profiles` | Кэш полей UI без CRM-идентификаторов | UI-поля — последнее успешно синхронизированное значение (входящий поток MVP — Bitrix24); auth-телефон инициирует sync, но master телефона — Keycloak |
| **Bitrix Contact** | CRM Bitrix24 | Карточка клиента в CRM | Bitrix24 для CRM-полей; связь `user_id ↔ b24_id` хранится только в `bitrix_sync.entity_external_mapping` |
| **Гость** | Только устройство | UI-state, локальные согласия до OTP, опционально `guest_session_id` | Нет серверной записи |
**Инвариант:** один verified phone ↔ один active Keycloak `sub`. Один `sub` ↔ одна active `UserIdentity`. Один `user_id` ↔ один `ClientProfile`.
@@ -266,8 +266,9 @@
| `sub` / существование IdP user | Keycloak | `user_identities.keycloak_sub` |
| Auth-телефон | Keycloak | `user_identities.phone_number`, seed `client_profiles.russian_phone` |
| Согласия (версия + accepted) | App DB `user_consents` | — |
| ФИО, гражданство, email, foreign_phone | Последний успешный sync (MVP: Bitrix → App) | `client_profiles` |
| `bitrix_contact_id` | Результат `bitrix-sync` | `client_profiles` |
| ФИО, гражданство, email | Последний успешный sync (MVP: Bitrix → App) | `client_profiles` |
| `foreign_phone` | Не синхронизируется в первом релизе | `client_profiles` |
| Связь с Contact | `bitrix-sync` | Только `bitrix_sync.entity_external_mapping`; в App DB не кэшируется |
| Tokens / auth session | Keycloak | secure storage на клиенте |
| `ux_session_id` | App DB + память клиента | заголовок запросов |
@@ -293,7 +294,7 @@ Application-код **не** пишет в `sync_queue`: задачи созда
| `phone_number` | Auth-телефон E.164 |
| `guest_session_id` | Локальный UUID устройства; не auth |
| `ux_session_id` | Аналитическая сессия |
| `bitrix_contact_id` | Contact в CRM (после sync) |
| `b24_id` | Внутренний идентификатор Contact; используется только `bitrix-sync` |
| `device_id` | Opaque id устройства в bootstrap / session-start; в audit/log не копируется как PII |
Публичные id — **UUID** (в App DB предпочтительно UUID v7, как в остальных доменах).
@@ -395,7 +396,6 @@ Unique `(user_id, consent_type, document_version)`. Записи immutable.
|---|---|---|
| `id` | uuid PK | |
| `user_id` | uuid UNIQUE FK | 1:1 с identity |
| `bitrix_contact_id` | varchar/nullable | После успешного map |
| `full_name` | varchar NULL | |
| `citizenship` | varchar NULL | |
| `russian_phone` | varchar NULL | Seed из auth-телефона |
@@ -404,7 +404,7 @@ Unique `(user_id, consent_type, document_version)`. Записи immutable.
| `source_updated_at` | timestamptz NULL | Метка источника sync |
| common fields | обязательны | |
Partial unique на `bitrix_contact_id` среди active. PII не попадает в логи и generic audit payload.
CRM Contact ID и mapping в `client_profiles` отсутствуют. PII не попадает в логи и generic audit payload.
### 10.4. `ux_sessions`
@@ -427,7 +427,8 @@ Partial unique на `bitrix_contact_id` среди active. PII не попада
|---|---|---|
| OTP challenge / counters / expiry | Keycloak SPI | До появления App user |
| SMS order / delivery journal | `sms-service` | Только доставка кода |
| `contact.map_or_create` / `contact.update` | `bitrix-sync` | После bootstrap / изменения профиля |
| `contact.map_or_create` / `contact.update` / `contact.deactivate` | `bitrix-sync` | После bootstrap / изменения телефона / деактивации |
| `contact.rebind` | `bitrix-sync` | Audited административное исправление ошибочного mapping |
| Token refresh / logout | Frontend + Keycloak | Не трогает App DB identity |
| Retention UX-сессий (если введён) | ops / module | Не удаляет `UserIdentity` |
@@ -445,7 +446,7 @@ Partial unique на `bitrix_contact_id` среди active. PII не попада
В audit **нет:** полного phone/email/name в свободном тексте логов общего контура, OTP raw code, tokens, presigned URL.
Метрики (минимум): число bootstrap/сутки, доля `consents_required`, доля `phone_claim_missing`, latency map Contact, доля пользователей без `bitrix_contact_id` спустя N минут после входа.
Метрики (минимум): число bootstrap/сутки, доля `consents_required`, доля `phone_claim_missing`. Latency map Contact и доля пользователей без active mapping спустя N минут считаются `bitrix-sync` по собственной схеме.
---