mnemo_cards/mnemo_cards_backend/lib/cron/backup.dart
Dmitry 306b2fdca7
Some checks are pending
Backend CI / test (push) Waiting to run
Backend CI / build (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
Deploy Telegram Bot / Deploy Telegram Bot (push) Waiting to run
fixes
2025-12-13 17:48:00 +03:00

60 lines
1.8 KiB
Dart

import 'dart:io';
import 'package:mnemo_cards_backend/cron/task.dart';
import '../main.dart';
class Backup with Task {
final backupDir;
static const _maxBackups = 6;
static const _maxBackupAgeDays = 2;
Backup(String dir) : backupDir = dir.endsWith('/') ? dir : '$dir/';
@override
String get name => 'backup';
@override
Future<void> task() async {
print('$name waiting 5 seconds for other tasks to complete');
await Future.delayed(Duration(seconds: 5));
final t = DateTime.now();
final timeString =
'${t.year}_${t.month.toString().padLeft(2, '0')}_${t.day.toString().padLeft(2, '0')}_'
'${t.hour.toString().padLeft(2, '0')}_${t.minute.toString().padLeft(2, '0')}';
final filename = 'isar_$timeString.isar';
final to = '${backupDir}$filename';
final dir = Directory(backupDir)..createSync(recursive: true);
await _deleteOldBackups(dir);
// await database.copyToFile(to);
// print('$name isar saved to $to');
}
Future<void> _deleteOldBackups(Directory dir) async {
final now = DateTime.now();
final backups = dir.listSync().whereType<File>();
if (backups.length > _maxBackups) {
final oldBackups = backups
.where(
(f) =>
now.difference(f.lastModifiedSync()).inDays > _maxBackupAgeDays,
)
.toList();
if (oldBackups.length != backups.length) {
oldBackups.sort(
(a, b) => a.lastModifiedSync().compareTo(b.lastModifiedSync()));
oldBackups.take(backups.length - _maxBackups).forEach((b) {
try {
b.deleteSync();
} catch (e) {
print('$name error when deleting backup file $e');
}
});
}
}
}
@override
int get intervalSeconds => 60 * 60 * 12;
}