From ea482b745ed8e71226b0df3a1456ddbea91fda68 Mon Sep 17 00:00:00 2001 From: Eric Gullickson <16152721+ericgullickson@users.noreply.github.com> Date: Thu, 1 Jan 2026 13:11:51 -0600 Subject: [PATCH] fix: Backup and restore fixes --- .../features/backup/data/backup.repository.ts | 16 ++++++++++++++-- .../backup/domain/backup-archive.service.ts | 4 +++- .../src/features/backup/domain/backup.service.ts | 2 ++ docs/PROMPTS.md | 5 +---- 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/backend/src/features/backup/data/backup.repository.ts b/backend/src/features/backup/data/backup.repository.ts index ec8e9c9..95214f5 100644 --- a/backend/src/features/backup/data/backup.repository.ts +++ b/backend/src/features/backup/data/backup.repository.ts @@ -287,6 +287,8 @@ export class BackupRepository { databaseTablesCount: number; documentsCount: number; metadata: BackupMetadata; + filename?: string; + filePath?: string; } ): Promise { const result = await this.pool.query( @@ -296,10 +298,20 @@ export class BackupRepository { database_tables_count = $2, documents_count = $3, metadata = $4, + filename = COALESCE($5, filename), + file_path = COALESCE($6, file_path), completed_at = NOW() - WHERE id = $5 + WHERE id = $7 RETURNING *`, - [data.fileSizeBytes, data.databaseTablesCount, data.documentsCount, JSON.stringify(data.metadata), id] + [ + data.fileSizeBytes, + data.databaseTablesCount, + data.documentsCount, + JSON.stringify(data.metadata), + data.filename || null, + data.filePath || null, + id, + ] ); return result.rows.length > 0 ? this.mapHistoryRow(result.rows[0]) : null; } diff --git a/backend/src/features/backup/domain/backup-archive.service.ts b/backend/src/features/backup/domain/backup-archive.service.ts index b77bb86..3757942 100644 --- a/backend/src/features/backup/domain/backup-archive.service.ts +++ b/backend/src/features/backup/domain/backup-archive.service.ts @@ -145,8 +145,10 @@ export class BackupArchiveService { const postgresqlVersion = versionOutput.trim().split(' ')[1] || 'unknown'; // Export database using pg_dump + // --clean: Output DROP statements before CREATE (required for restore to work on existing DB) + // --if-exists: Add IF EXISTS to DROP statements (prevents errors on fresh installs) await execAsync( - `pg_dump -h ${dbHost} -p ${dbPort} -U ${dbUser} -d ${dbName} --format=plain -f "${sqlPath}"`, + `pg_dump -h ${dbHost} -p ${dbPort} -U ${dbUser} -d ${dbName} --format=plain --clean --if-exists -f "${sqlPath}"`, { env: pgEnv } ); diff --git a/backend/src/features/backup/domain/backup.service.ts b/backend/src/features/backup/domain/backup.service.ts index c5635bb..b13a2ca 100644 --- a/backend/src/features/backup/domain/backup.service.ts +++ b/backend/src/features/backup/domain/backup.service.ts @@ -82,6 +82,8 @@ export class BackupService { fileSizeBytes: result.sizeBytes, databaseTablesCount: result.manifest.contents.database.tablesCount, documentsCount: result.manifest.contents.documents.totalFiles, + filename, + filePath: result.archivePath, metadata: { ...result.manifest.metadata, filename, diff --git a/docs/PROMPTS.md b/docs/PROMPTS.md index b643c2c..d4238b4 100644 --- a/docs/PROMPTS.md +++ b/docs/PROMPTS.md @@ -31,10 +31,7 @@ You are a senior software engineer specializsing in NodeJS, Typescript, front en - Research this code base and ask iterative questions to compile a complete plan. - We will pair troubleshoot this. Tell me what logs and things to run and I will - There is a backup system built into the admin settings. -- Schedules have been configured but it doesn't appear to be removing old backups -- The hourly schedule is set to retain 8 backups but it has over 9 saved. -- It is also creating multiple backups per run. - +- Uploading a backup to restore throws a 400 API error. *** ROLE ***