|
7 | 7 | import { environment } from '../../environments/environment'; |
8 | 8 | import { Table } from '../../types'; |
9 | 9 | import { SelectedDatabaseService } from '../database/selected-database.service'; |
| 10 | +import { downloadBlob } from '../utils/downloadBlob'; |
10 | 11 | import { fetchJson } from '../utils/fetchJson'; |
11 | 12 |
|
12 | 13 | @Injectable({ |
@@ -77,26 +78,25 @@ export class TablesService { |
77 | 78 | } |
78 | 79 | try { |
79 | 80 | let downloadUrl: string; |
| 81 | + let filename: string; |
80 | 82 |
|
81 | 83 | // Use new streaming endpoints for all download types |
82 | 84 | if (type === 'pgdump') { |
83 | 85 | downloadUrl = environment.apiContextPath + |
84 | 86 | `/database/${databaseName}/backup/${selectedBackup}/pgdump`; |
| 87 | + filename = selectedBackup.replace('.zip', '.pgdump'); |
85 | 88 | } else if (type === 'plain') { |
86 | 89 | downloadUrl = environment.apiContextPath + |
87 | 90 | `/database/${databaseName}/backup/${selectedBackup}/sql`; |
| 91 | + filename = selectedBackup.replace('.zip', '.sql'); |
88 | 92 | } else { |
89 | 93 | downloadUrl = environment.apiContextPath + |
90 | 94 | `/database/${databaseName}/backup/${selectedBackup}/archive`; |
| 95 | + filename = selectedBackup; |
91 | 96 | } |
92 | 97 |
|
93 | | - // Trigger download by creating a temporary link |
94 | | - const link = document.createElement('a'); |
95 | | - link.href = downloadUrl; |
96 | | - link.download = ''; // Browser will use filename from Content-Disposition header |
97 | | - document.body.appendChild(link); |
98 | | - link.click(); |
99 | | - document.body.removeChild(link); |
| 98 | + // Use HttpClient to make authenticated request and download blob |
| 99 | + await downloadBlob(this.http, downloadUrl, filename); |
100 | 100 | } catch (error) { |
101 | 101 | dispatchEvent(new ErrorNotificationEvent('Could not download backup.')); |
102 | 102 | } |
|
0 commit comments