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 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 = 'db_backup_$timeString.sql'; final to = '${backupDir}$filename'; final dir = Directory(backupDir)..createSync(recursive: true); await _deleteOldBackups(dir); // TODO: Implement PostgreSQL backup // await database.backupToFile(to); // print('$name database backup saved to $to'); } Future _deleteOldBackups(Directory dir) async { final now = DateTime.now(); final backups = dir.listSync().whereType(); 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; }