public HomeController(ILogger <HomeController> logger, IConfigRepository configRepository, IDatabaseBackupRepository databaseBackupRepository, IBackupFilePurger backupFilePurger, IBackupAuditRepository backupAuditRepository) { _logger = logger; _configRepository = configRepository; _databaseBackupRepository = databaseBackupRepository; _backupFilePurger = backupFilePurger; _backupAuditRepository = backupAuditRepository; }
private async Task BackupDbAsync(IDatabaseBackupRepository databaseBackupRepository, DatabaseBackup dbBackup, string backupPath, IBackupAuditRepository backupAuditRepository) { if (!File.Exists(dbBackup.DatabasePath)) { _logger.LogWarning($"Database file [{dbBackup.DatabasePath}] does not exist, cannot perform backup"); await backupAuditRepository.AuditEventAsync(dbBackup, "Backup failed: database file does not exist"); return; } var backupTime = DateTime.UtcNow; var backupFilename = GetBackupFilename(dbBackup, backupPath, backupTime); if (File.Exists(backupFilename)) { _logger.LogError($"Backup file named [{backupFilename}] already exists, cannot perform backup"); await backupAuditRepository.AuditEventAsync(dbBackup, "Backup failed: file already exists"); return; } if (!Directory.Exists(backupPath)) { Directory.CreateDirectory(backupPath); } using var dbToBackupConn = new SQLiteConnection($"Data Source={dbBackup.DatabasePath};FailIfMissing=True;"); await dbToBackupConn.OpenAsync(); using var dbCommand = dbToBackupConn.CreateCommand(); dbCommand.CommandType = CommandType.Text; dbCommand.CommandText = $"vacuum into @vacuumInto"; var dbParam = dbCommand.CreateParameter(); dbParam.ParameterName = "@vacuumInto"; dbParam.Value = backupFilename; dbCommand.Parameters.Add(dbParam); await dbCommand.ExecuteNonQueryAsync(); _logger.LogInformation($"Successfully backed up database: {dbBackup.DatabasePath}"); dbBackup.LastBackupTime = backupTime; await databaseBackupRepository.UpdateAsync(dbBackup); }