mirror of
https://github.com/R0m1k3/LogiFlow.git
synced 2026-10-21 14:08:15 +02:00
Merge pull request #327 from R0m1k3/1.1
Ensure daily automatic backups are performed upon user login
This commit is contained in:
3 files changed
+68
-2
No files matched your search
@@ -211,6 +211,46 @@ export class BackupService {
|
|||||||
return Math.round(bytes / Math.pow(1024, i) * 100) / 100 + ' ' + sizes[i];
|
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 {
|
private scheduleAutomaticBackup(): void {
|
||||||
// Check for automatic backup every hour
|
// Check for automatic backup every hour
|
||||||
const checkBackupNeeded = async () => {
|
const checkBackupNeeded = async () => {
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import { storage } from "./storage.js";
|
|||||||
import connectPg from "connect-pg-simple";
|
import connectPg from "connect-pg-simple";
|
||||||
import { scrypt, randomBytes, timingSafeEqual } from "crypto";
|
import { scrypt, randomBytes, timingSafeEqual } from "crypto";
|
||||||
import { promisify } from "util";
|
import { promisify } from "util";
|
||||||
|
import { backupService } from "./backupService.js";
|
||||||
|
|
||||||
const scryptAsync = promisify(scrypt);
|
const scryptAsync = promisify(scrypt);
|
||||||
|
|
||||||
@@ -206,8 +207,20 @@ export function setupLocalAuth(app: Express) {
|
|||||||
return res.status(400).json({ message: info?.message || "Invalid credentials" });
|
return res.status(400).json({ message: info?.message || "Invalid credentials" });
|
||||||
}
|
}
|
||||||
|
|
||||||
req.login(user, (err) => {
|
req.login(user, async (err) => {
|
||||||
if (err) return next(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({
|
res.json({
|
||||||
id: user.id,
|
id: user.id,
|
||||||
username: user.username,
|
username: user.username,
|
||||||
|
|||||||
+14
-1
@@ -7,6 +7,7 @@ import { promisify } from "util";
|
|||||||
import { storage } from "./storage";
|
import { storage } from "./storage";
|
||||||
import { User as SelectUser } from "@shared/schema";
|
import { User as SelectUser } from "@shared/schema";
|
||||||
import connectPg from "connect-pg-simple";
|
import connectPg from "connect-pg-simple";
|
||||||
|
import { backupService } from "./backupService";
|
||||||
|
|
||||||
declare global {
|
declare global {
|
||||||
namespace Express {
|
namespace Express {
|
||||||
@@ -156,8 +157,20 @@ export function setupLocalAuth(app: Express) {
|
|||||||
return res.status(400).json({ message: info?.message || "Invalid credentials" });
|
return res.status(400).json({ message: info?.message || "Invalid credentials" });
|
||||||
}
|
}
|
||||||
|
|
||||||
req.login(user, (err) => {
|
req.login(user, async (err) => {
|
||||||
if (err) return next(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({
|
res.json({
|
||||||
id: user.id,
|
id: user.id,
|
||||||
username: user.username,
|
username: user.username,
|
||||||
|
|||||||
Reference in new issue
Block a user