Skip to content

feat(backup): 新增按需(选择性)文件恢复#91

Merged
Awuqing merged 1 commit into
mainfrom
feat/selective-file-restore
May 27, 2026
Merged

feat(backup): 新增按需(选择性)文件恢复#91
Awuqing merged 1 commit into
mainfrom
feat/selective-file-restore

Conversation

@Awuqing

@Awuqing Awuqing commented May 27, 2026

Copy link
Copy Markdown
Owner

背景

此前恢复是「全有或全无」——要么整体覆盖恢复,要么不恢复。但最常见的恢复诉求其实是「只把误删的那一个文件/目录找回来」。本 PR 在上一个「内容浏览」能力之上,补齐按需(选择性)恢复,形成完整的「浏览 → 勾选 → 恢复」恢复闭环。

实现

  • backupTaskSpec.SelectedPathsFileRunner.Restore 按选中集合过滤——仅提取选中的文件,选中目录则恢复其全部子项;差异链中的删除项也仅在选中范围内应用,避免误删未选中文件
  • 安全:选中路径只用于成员判断(pathSelected)与前端筛选,从不参与文件写入路径的构造(写入路径仍来自归档条目名),因此无路径穿越/注入面——区别于请求传入目标路径的 feat(restore): 恢复到指定目录(文件类型本机恢复 + 确认弹窗输入) #86
  • restore:新增 RestoreService.StartSelective,原 Start 委托其 nil 入参(零破坏既有调用);校验按需恢复仅限本机文件备份;选中路径透传至 spec,对恢复链(全量+差异)逐段一致过滤。
  • httpPOST /backup/records/:id/restore 接受可选 body { selectedPaths }
  • 前端:内容浏览弹窗支持勾选 + 「恢复选中」,二次确认后启动按需恢复并跳转恢复日志。

测试

  • pathSelected 边界(精确匹配/目录子项/前缀相近不误判)
  • 端到端:全量备份 → 仅恢复选中文件与目录 → 校验未选中文件不出现
  • go test ./... 全绿;tsc --noEmit 通过

范围

  • 本机文件备份;差异记录按链恢复并对每段统一过滤。
  • 远程/数据库类型按需恢复给出明确错误。

在内容浏览基础上支持只恢复勾选的文件/目录到原位置,满足「只找回某个误删文件」
这一最常见的恢复诉求,无需整体覆盖恢复。

- backup:TaskSpec.SelectedPaths;FileRunner.Restore 按选中集合过滤提取,
  选中目录即恢复其子项;差异链中删除项亦仅在选中范围内应用(避免误删未选中文件)
  路径仅作为成员判断,不参与文件路径构造,无路径穿越面
- restore:RestoreService.StartSelective(Start 委托其 nil 入参,零破坏既有调用);
  校验按需恢复仅限本机文件备份;选中路径透传至 spec
- http:POST /backup/records/:id/restore 可选 body { selectedPaths }
- 前端:内容浏览弹窗支持勾选与「恢复选中」,触发按需恢复并跳转恢复日志

测试:pathSelected 边界、按需恢复端到端(仅选中项还原、未选中不出现);
go test 全绿;tsc --noEmit 通过。
@Awuqing Awuqing merged commit 493e1fa into main May 27, 2026
6 checks passed
@Awuqing Awuqing deleted the feat/selective-file-restore branch May 27, 2026 11:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant