# Тестовые данные и тестовая БД

Чтобы было на чём проверять интерфейс и API, в репозитории есть генератор
тестовых данных: виртуальные пользователи, страны/города, комнаты (group/direct,
с паролями), сообщения, транскрипты, файлы, записи, свои роли, compliance-анализ
и аудит-события. Данные создаются через **публичный/admin API** развёрнутого
стенда (не напрямую в БД) и складываются локально в тестовую SQLite-базу.

## 1. Запуск

```bash
# ключ тенанта demo (админский)
export AGIL_ADMIN_KEY=$(ssh root@95.182.94.7 "grep -oP '(?<=ADMIN_KEY=).*' /root/agil-admin-key.txt")
node scripts/seed.mjs --url https://calls.guardify.ru --rooms=12 --users=80
# или: npm run seed
```

Что будет создано:
- **12 комнат** (`group`/`direct`, часть с паролем), имена «… · seed N»;
- **80 виртуальных пользователей** (имена, email, роль, страна/город) —
  подключаются к комнатам через join + WebSocket (58 фактических подключений
  при 12 комнатах);
- **геоданные**: участники входят с `x-agil-country` (RU/KZ/BY/AM/GE/DE/US/AE/TR/RS),
  сервер (`AGIL_GEO_PROVIDER=header`) сохраняет `participant.location`/`country`,
  это видно в дашборде и аудите;
- **чат/транскрипт**: по 1–3 сообщения и 2–3 caption-сегмента на подключение
  (сохраняются в истории комнаты и транскрипте);
- **файлы** (протоколы `.txt`) и **записи** (webm-заглушки) в rooms;
- **свои роли** `streamer`/`operator`/`viewer`, часть входов — с `roleId`
  (проверка кастомных прав и бейджа роли);
- **compliance-анализ**: локальные правила «конкурент»/«бюджет» → findings;
- **аудит**: joins, ошибки паролей и т.п.;
- **тестовая БД**: `seed/agil-test.db` (SQLite) + `seed/agil-test-data.json`.

## 2. Тестовая БД (SQLite)

`seed/agil-test.db` создаётся Node `node:sqlite` (экспериментальный модуль Node 23)
со схемой:

| Таблица | Колонки |
|---|---|
| `users` | id, name, email, country, city, role |
| `rooms` | id, tenant, name, mode, media_mode, max_participants, password_protected, created_at |
| `room_participants` | room_id, user_id, name, role, country, joined_at |
| `messages` | id, room_id, user_id, text, ts |
| `transcript` | id, room_id, user_id, text, ts |
| `audit` | id, type, severity, room_id, country, message, ts |

Запросы для аналитики/тестов:
```bash
sqlite3 seed/agil-test.db "select country, count(*) from users group by country order by 2 desc;"
sqlite3 seed/agil-test.db "select r.name, count(*) from room_participants p join rooms r on r.id=p.room_id group by r.name;"
```

`seed/agil-test-data.json` — тот же датасет в JSON (users/rooms/participants/
messages/transcript), удобно для unit-тестов и импорта в другую БД.

## 3. Где посмотреть в интерфейсе

- **Дашборд** `https://calls.guardify.ru/dashboard/` (ключ тенанта demo):
  «Обзор» — комнаты/участники/страны; «Комнаты» — 12 seeded-комнат, типы
  direct/group, пароли; «Комната» — участники с странами, чат, транскрипт,
  заметки/compliance, записи; «Аудит» — события; «Доступы» — секция «Роли»
  (streamer/operator/viewer); «Записи» — seeded-записи.
- **Демо** `/` и `/guardify.html` — можно создать свою комнату и сравнить.
- **API**: `GET /v1/admin/rooms`, `/v1/admin/audit`, `/v1/admin/recordings`,
  `/v1/admin/roles`, `GET /v1/admin/rooms/:id/transcript`.

## 4. Повторный запуск / очистка

- Повторный `seed.mjs` добавляет новые комнаты (имена с суффиксом seed), данные
  накапливаются. Комнаты живут в памяти: после рестарта контейнера они
  исчезают, а файлы/записи/конфиг/аудит остаются в volume `.data`.
- Удалить seeded-комнаты: `DELETE /v1/admin/rooms/:id` (x-api-key) или
  перезапуск контейнера (комнаты in-memory).
- Файлы/записи: `GET /v1/admin/files`, `GET /v1/admin/recordings`,
  `DELETE /v1/admin/recordings/:id`.
- Тестовые роли: `DELETE /v1/admin/roles/:id` (streamer/operator/viewer).
- **Не запускайте seed на production-тенанте клиента** — только на demo/staging.

## 5. Настройки тенанта, которые меняет seed

`PATCH /v1/tenants/demo/config`:
- `features.fileShare=true`, `features.recording=true`, `features.captions=true`,
  `features.aiCompliance=true`;
- `session.fileShare.enabled/storeOnServer`, `session.recording.enabled/storeOnServer`;
- `aiAgent.enabled=true, mode='local'` + правила `competitor`/`budget`;
- создаёт роли через `POST /v1/admin/roles` (не перезаписывает существующие).

Чтобы вернуть «чистый» демо-конфиг — восстановите из бэкапа или
`PUT /v1/tenants/demo/config` дефолтным конфигом (см. `docs/contract.md` §3).

## 6. Ограничения

- Данные создаются через API, поэтому лимиты/права соблюдаются (не «магия в БД»).
- Комнаты/WS — in-memory (MVP): после рестарта нужен повторный seed, если важны
  именно активные комнаты; файлы/записи/аудит/конфиг персистятся в `.data`.
- Гео берётся из заголовка `x-agil-country` (демо-режим `AGIL_GEO_PROVIDER=header`);
  в проде — CDN/WAF-заголовки или `ipapi`.
- Тестовая SQLite — локальный артефакт для тестов, не подключена к серверу.
