B21: план мультипоиска и многопользовательского доступа (масштаб на республику)

Требование Виктора: несколько одновременных поисков, много пользователей
(каждое ЦОУ = аккаунты), КОНТУР подключается к каждому поиску. За основу —
админка РВС (RBAC + сессии + аудит, паттерн проверен в проде).

План: search_operations (надстройка над cases, не дубль SEARCH_OPERATION
КОНТУРа) + cou_units (справочник ЦОУ с иерархией) + RBAC 4 роли +
гео-скоуп (отличие от РВС) + дашборд активных поисков + contour_operation_id
для B20. Этапы E1 RBAC-ядро → E2 скоуп/аудит → E3 операции → E4 КОНТУР →
E5 B17-ингестия. Границы и критерии приёмки внутри.

СТАТУС: план на ревью, не код.
This commit is contained in:
2026-09-09 20:50:30 +03:00
parent 5794cb74a9
commit 3a986b0b7c
+121
View File
@@ -952,3 +952,124 @@ sed -i 's/sar_mchs/vector_mchs/g; s#/root/sar-mchs#/root/vector#g' DEPLOY.md
| Отдельный проект | B19 «Контур» (ATAK+Meshtastic, полевая система) | отдельный репо/спецификация | | Отдельный проект | B19 «Контур» (ATAK+Meshtastic, полевая система) | отдельный репо/спецификация |
**Рекомендуемый порядок:** B14 (чистый движок) → B15 (слои данных) → **B20 (контракт Вектор↔Контур)** → B16 (GIS) и B17 (Field Data) параллельно → B18 (итеративность + queue). B12 (ISRID) разблокируется внешне (правовой статус) и подключается как источник априорных к B18. B19 «Контур» — отдельный проект (свой репо); со стороны Вектора: B17+B18+B20. Коэффициенты (B1) — под ревью человека на каждом шаге. **Рекомендуемый порядок:** B14 (чистый движок) → B15 (слои данных) → **B20 (контракт Вектор↔Контур)** → B16 (GIS) и B17 (Field Data) параллельно → B18 (итеративность + queue). B12 (ISRID) разблокируется внешне (правовой статус) и подключается как источник априорных к B18. B19 «Контур» — отдельный проект (свой репо); со стороны Вектора: B17+B18+B20. Коэффициенты (B1) — под ревью человека на каждом шаге.
---
## B21 — Мультипоиск и многопользовательский доступ (масштаб на республику)
> Статус: ПЛАН на ревью Виктора. Основа — паттерн админки РВС
> (rbac-admin-schema-pattern: RBAC + сессии + аудит) и домен КОНТУРа
> (SEARCH_OPERATION + OPERATION_MEMBERSHIP). Написан 2026-09-09.
### 1. Контекст и требование
ВЕКТОР как программное средство на всю республику МЧС:
- **Несколько поисков одновременно** — сегодня API работает с произвольным
case_id, но UI предполагает «текущий поиск»: дашборд, карта, анализ
привязаны к одному кейсу без понятия «операция».
- **Много пользователей** — каждое ЦОУ (областное/районное) = аккаунты;
республиканский штаб видит все поиски, ЦОУ — свои.
- **КОНТУР подключается к каждому поиску** — outbound-контракт B20
операционно: зоны по конкретной операции, не «в абстракт».
Основа: админка РВС (RBAC 4 роли × 9 прав, server-side sessions,
audit 90 дней, password policy) — паттерн проверен в проде РВС.
### 2. Модель данных (новые таблицы + алиасы)
**2.1 Поисковая операция (мультипоиск)**
```
search_operations:
id uuid PK
title text -- «Поиск: Иванов П., Минский р-н»
case_id fk → cases -- карточка (матмодель живёт в cases)
status enum(planned, active, paused, completed, archived)
cou_id fk → cou_units -- ответственное ЦОУ
contour_operation_id uuid null -- заполняется при первой отправке зон в КОНТУР
created_by fk → users
created_at / updated_at / closed_at
```
Решение по «case vs operation»: НЕ дублируем SEARCH_OPERATION из КОНТУРа —
`cases` остаётся карточкой+расчётом (B15-слои на месте), `search_operations`
— надстройка со статусом/владением/участниками. КОНТУР-маппинг: поле
`contour_operation_id`, заполняется при первой отправке зон.
**2.2 Пользователи и ЦОУ (RBAC по образцу РВС)**
```
cou_units: -- справочник ЦОУ
id uuid PK, name, region (область), kind (oblast|raion|resp), parent_id null
users (расширение существующей):
+ cou_id fk → cou_units, null -- принадлежность ЦОУ (admin=null)
+ position text
+ status enum(active, locked, disabled)
+ failed_login_count, locked_until, must_change_password
+ created_by, created_at, updated_at
roles / user_roles / role_permissions / permissions -- как в РВС
sessions (server-side, token, ip, ua, expires_at, idle_timeout)
auth_events (login/logout/lockout, indexed DESC)
audit_events + audit_changes (field-level old→new, immutable, retention 90d)
security_settings (password policy, lockout, timeouts)
```
Роли (стартовые, is_system):
- `admin` — республиканский штаб: все права, все операции
- `coordinator` — областное ЦОУ: все поиски своей области, управление
пользователями своих райЦОУ
- `operator` — районное ЦОУ: свои поиски (create/update)
- `observer` — только просмотр (старшие смены, аналитика)
**2.2.1 Скоуп данных (отличие от РВС)**
К функциональным правам РВС добавляется **географический скоуп**: какие
поиски видны. Фильтр по `cou_id ∈ {своё ЦОУ + подчинённые}` (дерево
cou_units); admin — без фильтра. Тот же скоуп в cases/analyze/water.
### 3. Мультипоиск в UI
- **Дашборд «Активные поиски»** (главная после логина): карточки активных
операций (title, ЦОУ, elapsed, статус), фильтры по статусу/области,
счётчики. Клик → рабочее пространство операции (`/op/{id}/…`).
- **Создание поиска** = CaseForm + шаг «операция» (title, ЦОУ — по умолчанию
ЦОУ создателя).
- **Завершение**: статус completed + поля исхода (переезд из cases).
### 4. КОНТУР-интеграция (мультипоиск)
- Импорт зон готов на КОНТУРе (этап 9): operation_id задаётся параметром
импорта; ВЕКТОР хранит contour_operation_id и передаёт при отправке.
- Отправка зон: кнопка/авто при новой версии модели → POST /api/v1/vector/zones.
- Обратный поток: GET /api/v1/vector/areas-checked — «проверенные квадраты»
на карте ВЕКТОРа.
- Межсервисный токен — в secrets, не в репо.
### 5. Этапы внедрения
| # | Этап | Состав | Зависимости |
|---|------|--------|-------------|
| E1 | RBAC-ядро | cou_units, расширение users, роли/права, сессии, auth-журнал, seed; логин по пользователям, /me, смена пароля | паттерн РВС |
| E2 | Скоуп и аудит | гео-скоуп в эндпоинтах, audit_events, security_settings, админ-панель пользователей (как РВС) | E1 |
| E3 | Операции | search_operations + статусная машина, дашборд активных поисков, переключение | E1 |
| E4 | КОНТУР-мультипоиск | contour_operation_id, отправка зон, areas-checked на карте | E3 |
| E5 | B17 (лёгкий) | ингестия field_observations от КОНТУРа (tracks/areas_checked) | E4 |
### 6. Границы (НЕ делать сейчас)
- Саморегистрация ЦОУ — аккаунты создаёт админ/координатор.
- SSO/ActiveDirectory — после пилота.
- B18/B19 — отдельные задачи.
- WebSockets для списка поисков — polling на старте.
### 7. Критерии приёмки (сводно)
- Два одновременных активных поиска у двух ЦОУ: республиканский админ видит
оба, райЦОУ — только свой; переключение без потери контекста.
- Вход через server-side сессии; аудит фиксирует входы и админ-действия,
ретенция 90 дней.
- Зоны операции уезжают в КОНТУР и видны в штаб-панели CT130:8080 под своим
operation_id; вторая операция не смешивается.