From 1600cc82670cc6cde4e98416b2a923aae60fe257 Mon Sep 17 00:00:00 2001 From: Erik Date: Sat, 29 Nov 2025 12:42:17 -0300 Subject: [PATCH] fix: improve backup GET endpoint error handling and date parsing --- frontend/src/app/api/backup/route.ts | 69 ++++++++++++++++++++++------ 1 file changed, 56 insertions(+), 13 deletions(-) diff --git a/frontend/src/app/api/backup/route.ts b/frontend/src/app/api/backup/route.ts index 0588391..7c37011 100644 --- a/frontend/src/app/api/backup/route.ts +++ b/frontend/src/app/api/backup/route.ts @@ -193,24 +193,65 @@ export async function GET(request: NextRequest) { // ); // } + // Verificar se pasta existe + if (!fs.existsSync(BACKUP_DIR)) { + console.log('[BACKUP] Pasta de backups não existe, criando...'); + fs.mkdirSync(BACKUP_DIR, { recursive: true }); + return NextResponse.json({ + success: true, + backups: [], + count: 0 + }); + } + const files = fs.readdirSync(BACKUP_DIR); const backups: BackupInfo[] = []; for (const file of files) { const filePath = path.join(BACKUP_DIR, file); - const stat = fs.statSync(filePath); + + try { + const stat = fs.statSync(filePath); - if (stat.isFile()) { - const timestamp = file.replace('backup-', '').replace('.tar.gz', ''); - backups.push({ - id: file.replace('.tar.gz', ''), - timestamp: new Date(timestamp.replace(/-/g, ':')).toISOString(), - date: new Date(timestamp.replace(/-/g, ':')).toLocaleDateString('pt-BR'), - size: stat.size, - filename: file, - status: 'success', - message: 'Backup disponível' - }); + if (stat.isFile() && (file.endsWith('.tar.gz') || file.includes('backup-'))) { + // Extrair timestamp do nome do arquivo + const timestamp = file + .replace('backup-', '') + .replace('.tar.gz', '') + .trim(); + + // Tentar fazer parse da data de forma mais robusta + let parsedDate = new Date(); + try { + // Formato esperado: 2025-11-29-10-30-45 + const dateParts = timestamp.split('-'); + if (dateParts.length >= 3) { + const year = parseInt(dateParts[0]); + const month = parseInt(dateParts[1]) - 1; // Mês é 0-indexed + const day = parseInt(dateParts[2]); + const hour = dateParts[3] ? parseInt(dateParts[3]) : 0; + const min = dateParts[4] ? parseInt(dateParts[4]) : 0; + const sec = dateParts[5] ? parseInt(dateParts[5]) : 0; + + parsedDate = new Date(year, month, day, hour, min, sec); + } + } catch (e) { + console.log('[BACKUP] Erro ao fazer parse da data:', timestamp); + parsedDate = new Date(stat.mtime); + } + + backups.push({ + id: file.replace('.tar.gz', ''), + timestamp: parsedDate.toISOString(), + date: parsedDate.toLocaleDateString('pt-BR'), + size: stat.size, + filename: file, + status: 'success', + message: 'Backup disponível' + }); + } + } catch (fileError) { + console.warn('[BACKUP] Erro ao processar arquivo:', file, fileError); } } @@ -227,7 +268,9 @@ export async function GET(request: NextRequest) { return NextResponse.json( { success: false, - error: (error as Error).message + error: (error as Error).message, + backups: [], + count: 0 }, { status: 500 } );