import 'dart:convert'; import 'package:drift/drift.dart'; import '../database.dart'; import '../tables/audit.dart'; part 'audit_dao.g.dart'; @DriftAccessor(tables: [AuditLogs]) class AuditDao extends DatabaseAccessor with _$AuditDaoMixin { AuditDao(super.db); /// Записать событие в audit log /// /// ⚠️ ВАЖНО: Пока не используется в коде. Инфраструктура создана для будущего использования. /// /// Параметры: /// - table: имя таблицы (например, 'Users', 'Payments') /// - recordId: ID записи, которая изменилась /// - action: тип операции ('INSERT', 'UPDATE', 'DELETE', 'SOFT_DELETE', 'RESTORE') /// - userId: ID пользователя, который сделал изменение (null для системных операций) /// - oldData: данные до изменения (для UPDATE, DELETE) /// - newData: данные после изменения (для INSERT, UPDATE) /// - ipAddress: IP адрес пользователя /// - userAgent: User-Agent браузера Future log({ required String table, required String recordId, required String action, String? userId, Map? oldData, Map? newData, String? ipAddress, String? userAgent, }) async { await into(auditLogs).insert( AuditLogsCompanion.insert( table: table, recordId: recordId, action: action, userId: Value(userId), oldData: Value(oldData != null ? jsonEncode(oldData) : null), newData: Value(newData != null ? jsonEncode(newData) : null), ipAddress: Value(ipAddress), userAgent: Value(userAgent), ), ); } /// Получить историю изменений для конкретной записи /// /// Возвращает список записей audit log, отсортированных по дате создания (новые первыми) Future> getLogsByRecord({ required String table, required String recordId, int? limit, }) { final query = select(auditLogs) ..where((a) => a.table.equals(table) & a.recordId.equals(recordId)) ..orderBy([(a) => OrderingTerm.desc(a.createdAt)]); if (limit != null) { query.limit(limit); } return query.get(); } /// Получить последние события (для мониторинга) /// /// Возвращает последние N записей audit log, отсортированных по дате создания (новые первыми) Future> getRecentLogs({int limit = 100}) { return (select(auditLogs) ..orderBy([(a) => OrderingTerm.desc(a.createdAt)]) ..limit(limit)) .get(); } }