Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions lib/core/models/backup.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,52 @@ enum RestoreMode {
merge, // 增量合并:智能去重
}

enum RestoreAction {
ignore, // 忽略:不恢复此项
merge, // 合并:增量合并,保留本地配置(适合手机/电脑差异化设置)
overwrite, // 覆盖:完全覆盖本地配置
}

class RestoreOptions {
final RestoreAction settingsAction;
final RestoreAction providersAction;
final RestoreAction chatsAction;
final RestoreAction filesAction;

const RestoreOptions({
this.settingsAction = RestoreAction.merge,
this.providersAction = RestoreAction.merge,
this.chatsAction = RestoreAction.merge,
this.filesAction = RestoreAction.merge,
});

/// Check if this is a legacy full overwrite (all actions are overwrite)
bool get isFullOverwrite =>
settingsAction == RestoreAction.overwrite &&
providersAction == RestoreAction.overwrite &&
chatsAction == RestoreAction.overwrite &&
filesAction == RestoreAction.overwrite;

/// Helper for legacy mode compatibility
static RestoreOptions fromMode(RestoreMode mode) {
if (mode == RestoreMode.overwrite) {
return const RestoreOptions(
settingsAction: RestoreAction.overwrite,
providersAction: RestoreAction.overwrite,
chatsAction: RestoreAction.overwrite,
filesAction: RestoreAction.overwrite,
);
} else {
return const RestoreOptions(
settingsAction: RestoreAction.merge,
providersAction: RestoreAction.merge,
chatsAction: RestoreAction.merge,
filesAction: RestoreAction.merge,
);
}
}
}

class WebDavConfig {
final String url;
final String username;
Expand Down
6 changes: 3 additions & 3 deletions lib/core/providers/backup_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,9 @@ class BackupProvider extends ChangeNotifier {
}
}

Future<void> restoreFromItem(BackupFileItem item, {RestoreMode mode = RestoreMode.overwrite}) async {
Future<void> restoreFromItem(BackupFileItem item, {RestoreOptions? options, RestoreMode mode = RestoreMode.overwrite}) async {
_busy = true; _message = null; notifyListeners();
try { await _dataSync.restoreFromWebDav(_cfg, item, mode: mode); _message = 'Restored'; }
try { await _dataSync.restoreFromWebDav(_cfg, item, options: options, mode: mode); _message = 'Restored'; }
catch (e) { _message = e.toString(); }
finally { _busy = false; notifyListeners(); }
}
Expand All @@ -67,6 +67,6 @@ class BackupProvider extends ChangeNotifier {
}

Future<File> exportToFile() => _dataSync.exportToFile(_cfg);
Future<void> restoreFromLocalFile(File file, {RestoreMode mode = RestoreMode.overwrite}) => _dataSync.restoreFromLocalFile(file, _cfg, mode: mode);
Future<void> restoreFromLocalFile(File file, {RestoreOptions? options, RestoreMode mode = RestoreMode.overwrite}) => _dataSync.restoreFromLocalFile(file, _cfg, options: options, mode: mode);
}

Loading