diff --git a/next.config.ts b/next.config.ts index 20ed16e..0348038 100644 --- a/next.config.ts +++ b/next.config.ts @@ -43,6 +43,7 @@ const nextConfig: NextConfig = { ], }, turbopack: { + root: process.cwd(), rules: { '*.sql': ['raw'], }, diff --git a/package.json b/package.json index 2c6fe92..1046540 100644 --- a/package.json +++ b/package.json @@ -4,8 +4,9 @@ "private": true, "scripts": { "dev": "next dev --turbopack", - "build": "next build --turbopack", + "build": "prisma generate && next build --turbopack", "start": "next start", + "postinstall": "prisma generate", "lint": "eslint", "backup:create": "pnpm tsx scripts/backup-manager.ts create", "backup:list": "pnpm tsx scripts/backup-manager.ts list", diff --git a/scripts/backup-manager.ts b/scripts/backup-manager.ts index ca7d1e9..eebcb9d 100644 --- a/scripts/backup-manager.ts +++ b/scripts/backup-manager.ts @@ -270,7 +270,7 @@ OPTIONS: } private async showConfig(): Promise { - const config = backupService.getConfig(); + const config = await backupService.getConfig(); const status = backupScheduler.getStatus(); console.log('⚙️ Configuration des sauvegardes:\n'); diff --git a/src/app/api/backups/route.ts b/src/app/api/backups/route.ts index a1107ea..bc5528c 100644 --- a/src/app/api/backups/route.ts +++ b/src/app/api/backups/route.ts @@ -30,7 +30,7 @@ export async function GET(request: NextRequest) { console.log('🔄 API GET /api/backups called'); // Test de la configuration d'abord - const config = backupService.getConfig(); + const config = await backupService.getConfig(); console.log('✅ Config loaded:', config); // Test du scheduler @@ -111,7 +111,7 @@ export async function POST(request: NextRequest) { return NextResponse.json({ success: true, message: 'Configuration updated', - data: backupService.getConfig(), + data: await backupService.getConfig(), }); case 'scheduler': diff --git a/src/app/layout.tsx b/src/app/layout.tsx index e0d7496..06df6ec 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -30,6 +30,9 @@ export const metadata: Metadata = { description: 'Tour de controle (Kanban, tache, daily, ...)', }; +// Force dynamic rendering (no static generation) +export const dynamic = 'force-dynamic'; + export default async function RootLayout({ children, }: Readonly<{ diff --git a/src/app/settings/advanced/page.tsx b/src/app/settings/advanced/page.tsx index 2947fa0..2c7f524 100644 --- a/src/app/settings/advanced/page.tsx +++ b/src/app/settings/advanced/page.tsx @@ -37,7 +37,7 @@ export default async function AdvancedSettingsPage() { // Compose backup data like the API does const backups = await backupService.listBackups(); const schedulerStatus = backupScheduler.getStatus(); - const config = backupService.getConfig(); + const config = await backupService.getConfig(); const backupData = { backups, diff --git a/src/app/settings/backup/page.tsx b/src/app/settings/backup/page.tsx index da9460e..70efdd5 100644 --- a/src/app/settings/backup/page.tsx +++ b/src/app/settings/backup/page.tsx @@ -9,7 +9,7 @@ export default async function BackupSettingsPage() { // Fetch data server-side const backups = await backupService.listBackups(); const schedulerStatus = backupScheduler.getStatus(); - const config = backupService.getConfig(); + const config = await backupService.getConfig(); const backupStats = await backupService.getBackupStats(30); const initialData = { diff --git a/src/services/data-management/backup-scheduler.ts b/src/services/data-management/backup-scheduler.ts index 335a8f3..63cc0e8 100644 --- a/src/services/data-management/backup-scheduler.ts +++ b/src/services/data-management/backup-scheduler.ts @@ -14,7 +14,7 @@ export class BackupScheduler { return; } - const config = backupService.getConfig(); + const config = backupService.getConfigSync(); if (!config.enabled) { console.log('📋 Automatic backups are disabled'); @@ -104,7 +104,7 @@ export class BackupScheduler { return null; } - const config = backupService.getConfig(); + const config = backupService.getConfigSync(); const intervalMs = this.getIntervalMs(config.interval); return addMinutes(getToday(), Math.floor(intervalMs / (1000 * 60))); @@ -114,7 +114,7 @@ export class BackupScheduler { * Obtient les stats du planificateur */ getStatus() { - const config = backupService.getConfig(); + const config = backupService.getConfigSync(); return { isRunning: this.isRunning, diff --git a/src/services/data-management/backup.ts b/src/services/data-management/backup.ts index 706acbd..5744961 100644 --- a/src/services/data-management/backup.ts +++ b/src/services/data-management/backup.ts @@ -41,19 +41,22 @@ export class BackupService { } private config: BackupConfig; + private configLoaded: boolean = false; constructor(config?: Partial) { this.config = { ...this.defaultConfig, ...config }; - // Charger la config depuis la DB de manière asynchrone - this.loadConfigFromDB().catch(() => { - // Ignorer les erreurs de chargement initial - }); + // Ne pas charger la config depuis la DB dans le constructeur + // pour éviter les erreurs pendant le build + // La config sera chargée de manière lazy quand nécessaire } /** - * Charge la configuration depuis la base de données + * Charge la configuration depuis la base de données (lazy loading) */ private async loadConfigFromDB(): Promise { + if (this.configLoaded) { + return; // Déjà chargé + } try { // Pour le service de backup, on utilise un userId par défaut // car il n'a pas accès à la session @@ -70,11 +73,14 @@ export class BackupService { this.config = { ...this.defaultConfig, ...backupConfig }; } } + this.configLoaded = true; } catch (error) { console.warn( 'Could not load backup config from DB, using defaults:', error ); + // Marquer comme chargé même en cas d'erreur pour éviter de réessayer + this.configLoaded = true; } } @@ -593,9 +599,23 @@ export class BackupService { } /** - * Obtient la configuration actuelle + * Obtient la configuration actuelle (synchrone) + * Retourne la config par défaut si elle n'a pas encore été chargée depuis la DB */ - getConfig(): BackupConfig { + getConfigSync(): BackupConfig { + return { + ...this.config, + backupPath: this.getCurrentBackupPath(), + }; + } + + /** + * Obtient la configuration actuelle + * Charge la config depuis la DB si ce n'est pas déjà fait + */ + async getConfig(): Promise { + // Charger la config depuis la DB si ce n'est pas déjà fait + await this.loadConfigFromDB(); // Retourner une config avec le chemin à jour return { ...this.config,