From 1ccfc740b4b96a934bd3b5fbd3c0b92976204b9c Mon Sep 17 00:00:00 2001 From: michaelschal <35957947-michaelschal@users.noreply.replit.com> Date: Tue, 2 Sep 2025 17:54:11 +0000 Subject: [PATCH] Ensure daily automatic backups are performed upon user login Introduce a daily automatic backup check and execution triggered upon successful user login, ensuring data consistency and safety across the platform. This includes a new `checkAndPerformDailyBackup` method in `backupService.ts` and its integration into the login process in `localAuth.ts` and `localAuth.production.ts`. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 8e57b9d9-f2b2-427d-ba7a-757427e9b079 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/8e57b9d9-f2b2-427d-ba7a-757427e9b079/BLTvIk5 --- server/backupService.ts | 40 ++++++++++++++++++++++++++++++++++ server/localAuth.production.ts | 15 ++++++++++++- server/localAuth.ts | 15 ++++++++++++- 3 files changed, 68 insertions(+), 2 deletions(-) diff --git a/server/backupService.ts b/server/backupService.ts index 2d37d8d..3a02fc6 100644 --- a/server/backupService.ts +++ b/server/backupService.ts @@ -211,6 +211,46 @@ export class BackupService { return Math.round(bytes / Math.pow(1024, i) * 100) / 100 + ' ' + sizes[i]; } + // Nouvelle méthode : Vérifier et effectuer une sauvegarde quotidienne si nécessaire + async checkAndPerformDailyBackup(userId: string = 'system'): Promise<{ backupPerformed: boolean; message: string }> { + try { + const today = new Date().toISOString().split('T')[0]; // Format YYYY-MM-DD + + // Vérifier s'il y a déjà une sauvegarde automatique aujourd'hui + const existingBackupToday = await db.select() + .from(databaseBackups) + .where(eq(databaseBackups.backupType, 'automatic')) + .orderBy(desc(databaseBackups.createdAt)) + .limit(1); + + const lastBackup = existingBackupToday[0]; + const lastBackupDate = lastBackup ? lastBackup.createdAt.toISOString().split('T')[0] : null; + + // Si aucune sauvegarde automatique aujourd'hui, en créer une + if (lastBackupDate !== today) { + console.log('🔄 Première connexion du jour - Création de la sauvegarde automatique...'); + await this.createBackup('automatic', userId); + console.log('✅ Sauvegarde quotidienne effectuée avec succès'); + return { + backupPerformed: true, + message: 'Sauvegarde quotidienne effectuée avec succès' + }; + } else { + console.log('ℹ️ Sauvegarde quotidienne déjà effectuée aujourd\'hui'); + return { + backupPerformed: false, + message: 'Sauvegarde quotidienne déjà effectuée aujourd\'hui' + }; + } + } catch (error) { + console.error('❌ Erreur lors de la vérification de sauvegarde quotidienne:', error); + return { + backupPerformed: false, + message: `Erreur: ${error instanceof Error ? error.message : 'Erreur inconnue'}` + }; + } + } + private scheduleAutomaticBackup(): void { // Check for automatic backup every hour const checkBackupNeeded = async () => { diff --git a/server/localAuth.production.ts b/server/localAuth.production.ts index d00ecef..7afa4b6 100644 --- a/server/localAuth.production.ts +++ b/server/localAuth.production.ts @@ -6,6 +6,7 @@ import { storage } from "./storage.js"; import connectPg from "connect-pg-simple"; import { scrypt, randomBytes, timingSafeEqual } from "crypto"; import { promisify } from "util"; +import { backupService } from "./backupService.js"; const scryptAsync = promisify(scrypt); @@ -206,8 +207,20 @@ export function setupLocalAuth(app: Express) { return res.status(400).json({ message: info?.message || "Invalid credentials" }); } - req.login(user, (err) => { + req.login(user, async (err) => { if (err) return next(err); + + // Vérifier et effectuer une sauvegarde quotidienne si nécessaire + try { + const backupResult = await backupService.checkAndPerformDailyBackup(user.id); + if (backupResult.backupPerformed) { + console.log('💾 Sauvegarde quotidienne effectuée lors de la connexion de', user.username); + } + } catch (error) { + console.error('⚠️ Erreur lors de la vérification de sauvegarde:', error); + // Ne pas faire échouer la connexion si la sauvegarde échoue + } + res.json({ id: user.id, username: user.username, diff --git a/server/localAuth.ts b/server/localAuth.ts index 69f4aa1..ca83906 100644 --- a/server/localAuth.ts +++ b/server/localAuth.ts @@ -7,6 +7,7 @@ import { promisify } from "util"; import { storage } from "./storage"; import { User as SelectUser } from "@shared/schema"; import connectPg from "connect-pg-simple"; +import { backupService } from "./backupService"; declare global { namespace Express { @@ -156,8 +157,20 @@ export function setupLocalAuth(app: Express) { return res.status(400).json({ message: info?.message || "Invalid credentials" }); } - req.login(user, (err) => { + req.login(user, async (err) => { if (err) return next(err); + + // Vérifier et effectuer une sauvegarde quotidienne si nécessaire + try { + const backupResult = await backupService.checkAndPerformDailyBackup(user.id); + if (backupResult.backupPerformed) { + console.log('💾 Sauvegarde quotidienne effectuée lors de la connexion de', user.username); + } + } catch (error) { + console.error('⚠️ Erreur lors de la vérification de sauvegarde:', error); + // Ne pas faire échouer la connexion si la sauvegarde échoue + } + res.json({ id: user.id, username: user.username,