mnemo_cards/mnemo_cards_backend/lib/database/daos/audit_dao.dart
Dmitry ef5d7318e7
Some checks are pending
Backend CI / test (push) Waiting to run
Backend CI / build (push) Blocked by required conditions
Deploy Admin Panel / Deploy Admin Panel (push) Waiting to run
Deploy Admin Panel / Admin Panel Verification (push) Blocked by required conditions
Deploy Mnemo Cards / Deploy Backend (push) Waiting to run
Deploy Mnemo Cards / Deploy Web App (push) Blocked by required conditions
Deploy Mnemo Cards / Final Verification (push) Blocked by required conditions
backend and admin
2025-12-15 00:10:06 +03:00

77 lines
2.9 KiB
Dart

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<AppDatabase> 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<void> log({
required String table,
required String recordId,
required String action,
String? userId,
Map<String, dynamic>? oldData,
Map<String, dynamic>? 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<List<AuditLog>> 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<List<AuditLog>> getRecentLogs({int limit = 100}) {
return (select(auditLogs)
..orderBy([(a) => OrderingTerm.desc(a.createdAt)])
..limit(limit))
.get();
}
}