Реализованы задачи бэклога 1-5 (1я не до конца)

This commit is contained in:
mi
2026-07-21 12:50:46 +03:00
parent 3b71caf7b3
commit 0d7f7a819f
105 changed files with 7185 additions and 38 deletions
+4 -4
View File
@@ -302,7 +302,7 @@ require required consents accepted
BEGIN
INSERT UserIdentity(keycloak_sub, phone_number, last_login_at)
ON CONFLICT(keycloak_sub) DO UPDATE phone_number, last_login_at
INSERT ClientProfile(user_id) ON CONFLICT(user_id) DO NOTHING
INSERT ClientProfile(user_id, russian_phone=phone) ON CONFLICT(user_id) DO NOTHING
INSERT immutable UserConsent rows for submitted versions
INSERT audit auth.bootstrap
COMMIT
@@ -334,7 +334,7 @@ Request:
{"ux_session_id":"uuid","started_at":"2026-07-08T12:00:00Z"}
```
Создаёт `UxSession` и audit `session_start` атомарно. Не влияет на auth. `device_id` хешируется перед сохранением; raw значение в лог не попадает.
Создаёт `UxSession` и audit `session_start` атомарно. Не влияет на auth. Параметры устройства, включая исходный `device_id`, сохраняются в `UxSession` и в snapshot `UserConsent.device_json`; в audit/log значение не копируется.
### 6.4. Profile и documents
@@ -352,7 +352,7 @@ Request:
"personal_data": {
"full_name": null,
"citizenship": null,
"russian_phone": null,
"russian_phone": "+79991234567",
"foreign_phone": null,
"email": null
},
@@ -579,7 +579,7 @@ JWKS cache имеет positive TTL и short negative TTL для неизвест
### 9.3. `ux_sessions`
`id` = `ux_session_id`; `user_id` FK; `start_reason` CHECK; `platform`, `app_version`, `device_id_hash`; `started_at`; common fields.
`id` = `ux_session_id`; `user_id` FK; `start_reason` CHECK; `platform`, `app_version`, `device_id`; legacy `device_id_hash` nullable; `started_at`; common fields.
Индексы: `(user_id, started_at DESC)`, `(started_at)` для retention.
+2 -1
View File
@@ -84,7 +84,8 @@ OTP вводится на странице/теме Keycloak. В MVP Keycloak с
- карточка: статус, сообщения, composer, attachment;
- сообщения сортируются по `created_at asc`, дубли объединяются по `message_id`;
- `waiting_for_company`, `waiting_for_client`, `closed` отображаются русскими подписями;
- closed dialog readonly; создание нового — только через контракт backend;
- экран истории содержит CTA «Новый диалог» через `POST /dialogs`;
- closed dialog readonly и содержит CTA «Начать новый диалог»;
- промежуточный safety `203` клиенту не показывается: send request остаётся в progress до финального ответа.
### 5.4. Профиль
+1 -2
View File
@@ -477,11 +477,10 @@ OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317
Дополнительные Keycloak-standard env version-specific (`KC_DB`, hostname/proxy/health/metrics/pool) фиксируются в `.env.example` после выбора image. Секреты только root `.env`/secret mounts с минимальными permissions.
Product limits `otp.phone.*` не дублируются env. OTP TTL/max verify attempts — security technical config provider-а; их имена нужно добавить в arch-04 до реализации, например:
Product limits `otp.phone.*`, включая `otp.phone.max_verify_attempts`, не дублируются env и поступают через settings bridge. OTP TTL остаётся security technical config provider-а:
```text
KEYCLOAK_OTP_TTL_SEC=300
KEYCLOAK_OTP_MAX_VERIFY_ATTEMPTS=5
KEYCLOAK_OTP_SETTINGS_MAX_STALE_SEC=300
KEYCLOAK_OTP_HMAC_KEY=<secret>
```