diff --git a/src/app/interfaces/api/api-call-directory.interface.ts b/src/app/interfaces/api/api-call-directory.interface.ts index af87001505d..06904a9cbe3 100644 --- a/src/app/interfaces/api/api-call-directory.interface.ts +++ b/src/app/interfaces/api/api-call-directory.interface.ts @@ -62,7 +62,13 @@ import { ChartReleaseUpgradeParams, } from 'app/interfaces/chart-release.interface'; import { Choices } from 'app/interfaces/choices.interface'; -import { CloudBackup, CloudBackupSnapshot, CloudBackupUpdate } from 'app/interfaces/cloud-backup.interface'; +import { + CloudBackup, + CloudBackupSnapshot, + CloudBackupSnapshotDirectoryListing, + CloudBackupSnapshotDirectoryParams, + CloudBackupUpdate, +} from 'app/interfaces/cloud-backup.interface'; import { CloudSyncDirectoryListing, CloudSyncListDirectoryParams, @@ -389,6 +395,7 @@ export interface ApiCallDirectory { 'cloud_backup.create': { params: [CloudBackupUpdate]; response: CloudBackup }; 'cloud_backup.delete': { params: [id: number]; response: boolean }; 'cloud_backup.list_snapshots': { params: [id: number]; response: CloudBackupSnapshot[] }; + 'cloud_backup.list_snapshot_directory': { params: CloudBackupSnapshotDirectoryParams; response: CloudBackupSnapshotDirectoryListing[] }; 'cloud_backup.query': { params: [id?: QueryParams]; response: CloudBackup[] }; 'cloud_backup.update': { params: [id: number, update: CloudBackupUpdate]; response: CloudBackup }; diff --git a/src/app/interfaces/cloud-backup.interface.ts b/src/app/interfaces/cloud-backup.interface.ts index bf4d7e1394e..9f783839993 100644 --- a/src/app/interfaces/cloud-backup.interface.ts +++ b/src/app/interfaces/cloud-backup.interface.ts @@ -62,6 +62,23 @@ export type CloudBackupRestoreParams = [ }, ]; +export enum CloudBackupSnapshotDirectoryFileType { + File = 'file', + Dir = 'dir', +} + +export type CloudBackupSnapshotDirectoryParams = [ + id: number, + snapshot_id: string, + path: string, +]; + +export interface CloudBackupSnapshotDirectoryListing { + name: string; + path: string; + type: CloudBackupSnapshotDirectoryFileType; +} + export interface BackupTile { title: string; totalSend: number; diff --git a/src/app/pages/data-protection/cloud-backup/cloud-backup-details/cloud-backup-restore-form-snapshot-form/cloud-backup-restore-from-snapshot-form.component.html b/src/app/pages/data-protection/cloud-backup/cloud-backup-details/cloud-backup-restore-form-snapshot-form/cloud-backup-restore-from-snapshot-form.component.html index 9785b4c0513..8aa1402ed48 100644 --- a/src/app/pages/data-protection/cloud-backup/cloud-backup-details/cloud-backup-restore-form-snapshot-form/cloud-backup-restore-from-snapshot-form.component.html +++ b/src/app/pages/data-protection/cloud-backup/cloud-backup-details/cloud-backup-restore-form-snapshot-form/cloud-backup-restore-from-snapshot-form.component.html @@ -18,11 +18,10 @@ @@ -37,19 +36,18 @@ diff --git a/src/app/pages/data-protection/cloud-backup/cloud-backup-details/cloud-backup-restore-form-snapshot-form/cloud-backup-restore-from-snapshot-form.component.ts b/src/app/pages/data-protection/cloud-backup/cloud-backup-details/cloud-backup-restore-form-snapshot-form/cloud-backup-restore-from-snapshot-form.component.ts index 2e24820f01b..01de51856b3 100644 --- a/src/app/pages/data-protection/cloud-backup/cloud-backup-details/cloud-backup-restore-form-snapshot-form/cloud-backup-restore-from-snapshot-form.component.ts +++ b/src/app/pages/data-protection/cloud-backup/cloud-backup-details/cloud-backup-restore-form-snapshot-form/cloud-backup-restore-from-snapshot-form.component.ts @@ -9,11 +9,16 @@ import { TranslateService } from '@ngx-translate/core'; import { map, of } from 'rxjs'; import { DatasetPreset } from 'app/enums/dataset.enum'; import { ExplorerNodeType } from 'app/enums/explorer-type.enum'; +import { mntPath } from 'app/enums/mnt-path.enum'; import { Role } from 'app/enums/role.enum'; import { mapToOptions } from 'app/helpers/options.helper'; import { helptextTruecloudBackup } from 'app/helptext/data-protection/truecloud-backup/cloudsync'; import { - CloudBackup, CloudBackupRestoreParams, CloudBackupSnapshot, SnapshotIncludeExclude, + CloudBackup, + CloudBackupRestoreParams, + CloudBackupSnapshot, + CloudBackupSnapshotDirectoryFileType, + SnapshotIncludeExclude, } from 'app/interfaces/cloud-backup.interface'; import { DatasetCreate } from 'app/interfaces/dataset.interface'; import { ExplorerNodeData, TreeNode } from 'app/interfaces/tree-node.interface'; @@ -33,11 +38,11 @@ import { WebSocketService } from 'app/services/ws.service'; }) export class CloudBackupRestoreFromSnapshotFormComponent implements OnInit { readonly requiredRoles = [Role.CloudBackupWrite]; - + readonly mntPath = mntPath; readonly helptext = helptextTruecloudBackup; fileNodeProvider: TreeNodeProvider; - bucketNodeProvider: TreeNodeProvider; + snapshotNodeProvider: TreeNodeProvider; readonly includeExcludeOptions = new Map([ [SnapshotIncludeExclude.IncludeEverything, this.translate.instant('Include everything')], @@ -56,7 +61,7 @@ export class CloudBackupRestoreFromSnapshotFormComponent implements OnInit { includeExclude: [SnapshotIncludeExclude.IncludeEverything, Validators.required], excludedPaths: [[] as string[], Validators.required], excludePattern: [null as string | null, Validators.required], - subFolder: ['/'], + subFolder: [mntPath], includedPaths: [[] as string[]], }); @@ -92,7 +97,7 @@ export class CloudBackupRestoreFromSnapshotFormComponent implements OnInit { ngOnInit(): void { this.setFileNodeProvider(); - this.setBucketNodeProvider(); + this.setSnapshotNodeProvider(); this.disableHiddenFields(); this.listenForFormChanges(); } @@ -134,26 +139,20 @@ export class CloudBackupRestoreFromSnapshotFormComponent implements OnInit { }); } - getBucketsNodeProvider(): TreeNodeProvider { + getSnapshotNodeProvider(): TreeNodeProvider { return (node: TreeNode) => { - const data = { - credentials: this.data.backup?.credentials?.id, - attributes: { - folder: node.data.path, - bucket: this.data.backup.attributes.bucket, - }, - args: '', - }; - - return this.ws.call('cloudsync.list_directory', [data]).pipe( + return this.ws.call( + 'cloud_backup.list_snapshot_directory', + [this.data.backup.id, this.data.snapshot?.id, node.data.path], + ).pipe( map((listing) => { const nodes: ExplorerNodeData[] = []; listing.forEach((file) => { - if (file.IsDir) { + if (file.type === CloudBackupSnapshotDirectoryFileType.Dir && file.path !== node.data.path) { nodes.push({ - path: `${data.attributes.folder}/${file.Name}`.replace(/\/+/g, '/'), - name: file.Name, + path: file.path, + name: file.name, type: ExplorerNodeType.Directory, hasChildren: true, }); @@ -196,8 +195,8 @@ export class CloudBackupRestoreFromSnapshotFormComponent implements OnInit { this.fileNodeProvider = this.filesystemService.getFilesystemNodeProvider({ directoriesOnly: true }); } - private setBucketNodeProvider(): void { - this.bucketNodeProvider = this.getBucketsNodeProvider(); + private setSnapshotNodeProvider(): void { + this.snapshotNodeProvider = this.getSnapshotNodeProvider(); } private disableHiddenFields(): void {