2025-12-14 20:36:05 +00:00
|
|
|
|
import 'package:drift/drift.dart';
|
|
|
|
|
|
import 'package:drift_postgres/drift_postgres.dart';
|
|
|
|
|
|
import '../converters.dart' show generateUuid;
|
|
|
|
|
|
|
|
|
|
|
|
/// Таблица AuditLogs - audit trail для отслеживания изменений
|
2025-12-20 18:26:15 +00:00
|
|
|
|
///
|
2025-12-14 20:36:05 +00:00
|
|
|
|
/// ⚠️ ВАЖНО: Инфраструктура создается, но пока НЕ используется в коде.
|
|
|
|
|
|
/// Вызовы auditDao.log() будут добавлены позже, когда определим
|
|
|
|
|
|
/// какие операции нужно логировать.
|
2025-12-20 18:26:15 +00:00
|
|
|
|
///
|
2025-12-14 20:36:05 +00:00
|
|
|
|
/// Планируемые операции для логирования:
|
|
|
|
|
|
/// - Критичные: платежи, удаления пользователей, изменения подписок
|
|
|
|
|
|
/// - Retention policy: автоматическая очистка записей старше 90 дней
|
|
|
|
|
|
class AuditLogs extends Table {
|
|
|
|
|
|
// ID как String, но фактически UUID (генерируется PostgreSQL на стороне БД)
|
2025-12-20 18:26:15 +00:00
|
|
|
|
TextColumn get id =>
|
|
|
|
|
|
text().withDefault(const CustomExpression('gen_random_uuid()::text'))();
|
|
|
|
|
|
|
2025-12-14 20:36:05 +00:00
|
|
|
|
// Какая таблица и запись изменена
|
|
|
|
|
|
// например: 'Users', 'Payments'
|
2025-12-14 21:10:06 +00:00
|
|
|
|
TextColumn get table => text()();
|
2025-12-14 20:36:05 +00:00
|
|
|
|
// ID записи, которая изменилась
|
|
|
|
|
|
TextColumn get recordId => text()();
|
2025-12-20 18:26:15 +00:00
|
|
|
|
|
2025-12-14 20:36:05 +00:00
|
|
|
|
// Тип операции: 'INSERT', 'UPDATE', 'DELETE', 'SOFT_DELETE', 'RESTORE'
|
|
|
|
|
|
TextColumn get action => text()();
|
2025-12-20 18:26:15 +00:00
|
|
|
|
|
2025-12-14 20:36:05 +00:00
|
|
|
|
// Кто сделал изменение
|
|
|
|
|
|
// ID пользователя (null для системных операций)
|
|
|
|
|
|
TextColumn get userId => text().nullable()();
|
2025-12-20 18:26:15 +00:00
|
|
|
|
|
2025-12-14 20:36:05 +00:00
|
|
|
|
// Данные до и после (JSON as TEXT)
|
|
|
|
|
|
// JSON данные до изменения
|
|
|
|
|
|
TextColumn get oldData => text().nullable()();
|
|
|
|
|
|
// JSON данные после изменения
|
|
|
|
|
|
TextColumn get newData => text().nullable()();
|
2025-12-20 18:26:15 +00:00
|
|
|
|
|
2025-12-14 20:36:05 +00:00
|
|
|
|
// Дополнительная информация
|
|
|
|
|
|
TextColumn get ipAddress => text().nullable()();
|
|
|
|
|
|
TextColumn get userAgent => text().nullable()();
|
2025-12-20 18:26:15 +00:00
|
|
|
|
|
2025-12-14 20:36:05 +00:00
|
|
|
|
// Audit
|
2025-12-20 18:26:15 +00:00
|
|
|
|
Column<PgDateTime> get createdAt =>
|
|
|
|
|
|
customType(PgTypes.timestampWithTimezone).withDefault(now())();
|
|
|
|
|
|
|
2025-12-14 20:36:05 +00:00
|
|
|
|
@override
|
|
|
|
|
|
Set<Column> get primaryKey => {id};
|
|
|
|
|
|
}
|