feat: enhance backup management in AdvancedSettingsPage
- Added backup management functionality to `AdvancedSettingsPageClient`, including creating and verifying backups. - Updated `package.json` with new backup-related scripts. - Improved UI to display backup status and next scheduled backup time. - Updated `.gitignore` to exclude backup files. - Enhanced server-side data fetching to include backup data and database statistics.
This commit is contained in:
136
services/backup-scheduler.ts
Normal file
136
services/backup-scheduler.ts
Normal file
@@ -0,0 +1,136 @@
|
||||
import { backupService, BackupConfig } from './backup';
|
||||
|
||||
export class BackupScheduler {
|
||||
private timer: NodeJS.Timeout | null = null;
|
||||
private isRunning = false;
|
||||
|
||||
/**
|
||||
* Démarre le planificateur de sauvegarde automatique
|
||||
*/
|
||||
start(): void {
|
||||
if (this.isRunning) {
|
||||
console.log('⚠️ Backup scheduler is already running');
|
||||
return;
|
||||
}
|
||||
|
||||
const config = backupService.getConfig();
|
||||
|
||||
if (!config.enabled) {
|
||||
console.log('📋 Automatic backups are disabled');
|
||||
return;
|
||||
}
|
||||
|
||||
const intervalMs = this.getIntervalMs(config.interval);
|
||||
|
||||
// Première sauvegarde immédiate (optionnelle)
|
||||
// this.performScheduledBackup();
|
||||
|
||||
// Planifier les sauvegardes suivantes
|
||||
this.timer = setInterval(() => {
|
||||
this.performScheduledBackup();
|
||||
}, intervalMs);
|
||||
|
||||
this.isRunning = true;
|
||||
console.log(`✅ Backup scheduler started with ${config.interval} interval`);
|
||||
}
|
||||
|
||||
/**
|
||||
* Arrête le planificateur
|
||||
*/
|
||||
stop(): void {
|
||||
if (this.timer) {
|
||||
clearInterval(this.timer);
|
||||
this.timer = null;
|
||||
}
|
||||
|
||||
this.isRunning = false;
|
||||
console.log('🛑 Backup scheduler stopped');
|
||||
}
|
||||
|
||||
/**
|
||||
* Redémarre le planificateur (utile lors des changements de config)
|
||||
*/
|
||||
restart(): void {
|
||||
this.stop();
|
||||
this.start();
|
||||
}
|
||||
|
||||
/**
|
||||
* Vérifie si le planificateur fonctionne
|
||||
*/
|
||||
isActive(): boolean {
|
||||
return this.isRunning && this.timer !== null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Effectue une sauvegarde planifiée
|
||||
*/
|
||||
private async performScheduledBackup(): Promise<void> {
|
||||
try {
|
||||
console.log('🔄 Starting scheduled backup...');
|
||||
const result = await backupService.createBackup('automatic');
|
||||
|
||||
if (result.status === 'success') {
|
||||
console.log(`✅ Scheduled backup completed: ${result.filename}`);
|
||||
} else {
|
||||
console.error(`❌ Scheduled backup failed: ${result.error}`);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('❌ Scheduled backup error:', error);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Convertit l'intervalle en millisecondes
|
||||
*/
|
||||
private getIntervalMs(interval: BackupConfig['interval']): number {
|
||||
const intervals = {
|
||||
hourly: 60 * 60 * 1000, // 1 heure
|
||||
daily: 24 * 60 * 60 * 1000, // 24 heures
|
||||
weekly: 7 * 24 * 60 * 60 * 1000, // 7 jours
|
||||
};
|
||||
|
||||
return intervals[interval];
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtient le prochain moment de sauvegarde
|
||||
*/
|
||||
getNextBackupTime(): Date | null {
|
||||
if (!this.isRunning || !this.timer) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const config = backupService.getConfig();
|
||||
const intervalMs = this.getIntervalMs(config.interval);
|
||||
|
||||
return new Date(Date.now() + intervalMs);
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtient les stats du planificateur
|
||||
*/
|
||||
getStatus() {
|
||||
const config = backupService.getConfig();
|
||||
|
||||
return {
|
||||
isRunning: this.isRunning,
|
||||
isEnabled: config.enabled,
|
||||
interval: config.interval,
|
||||
nextBackup: this.getNextBackupTime(),
|
||||
maxBackups: config.maxBackups,
|
||||
backupPath: config.backupPath,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// Instance singleton
|
||||
export const backupScheduler = new BackupScheduler();
|
||||
|
||||
// Auto-start du scheduler
|
||||
// Démarrer avec un délai pour laisser l'app s'initialiser
|
||||
setTimeout(() => {
|
||||
console.log('🚀 Auto-starting backup scheduler...');
|
||||
backupScheduler.start();
|
||||
}, 5000); // 5 secondes en dev, pour faciliter les tests
|
||||
|
||||
Reference in New Issue
Block a user