# Журнал аудита (152-ФЗ) ## Что уже есть в БД (`db/schema.sql`) - Таблица **`audit_log`** — append-only (UPDATE/DELETE отозваны у `app_rw` → неизменяемость). - БД-триггеры `trg_audit` пишут изменения операционных таблиц: `application`, `document`, `document_review`, `payment` (actor берётся из `current_setting('app.account_id')`, снимки before/after). - Таблица `login_audit` — события входа. ## Что добавлено на уровне приложения (этот инкремент) Дополняет триггеры **без изменения схемы и без миграции** — пишет в ту же `audit_log`. - **`AuditService`** (`src/audit/audit.service.ts`, raw-SQL): - `record()` — append-only вставка события (actor/action/entity_type/entity_id/ip/after); `after` хранит HTTP-контекст `{method, path, requestId, role}`; ПДн в снимки не кладём. - `list()` — чтение журнала с фильтрами и пагинацией. - **`@Audit({action, entityType, idParam|idFromResult})`** + глобальный **`AuditInterceptor`**: пишет запись после успешного выполнения помеченного обработчика (entityId — из параметра маршрута или из поля результата). - **Админ-API:** `GET /api/v1/admin/audit` (роль `admin`) — фильтры `actor`, `action`, `entityType`, `entityId`, `from`, `to` и пагинация `limit`/`offset`. ### Аудируемые события приложения (пробелы, не покрытые триггерами) | Действие | action | entity_type | |---|---|---| | Приглашение сотрудника | `account.invite` | account | | Блокировка/разблокировка аккаунта | `account.block` | account | | Решение по общежитию | `dorm.decide` | dorm_application | | Создание/обновление визы | `visa.create` / `visa.update` | visa | | Ответ/смена статуса обращения | `support.reply` / `support.status` | support_ticket | > application/document/payment **намеренно не дублируются** — их пишут БД-триггеры. ## Эксплуатация - Миграция не требуется: таблица и триггеры — в `db/schema.sql` (применяется при инициализации БД). - Приложение подключается ролью с правами `app_rw` (INSERT/SELECT на `audit_log`; UPDATE/DELETE запрещены). - 152-ФЗ: журнал неизменяем (привилегии БД); в снимках минимизировать ПДн; для `ip` (inet) предусмотреть срок хранения/анонимизацию по политике оператора.